Beginning of C Compiler Listing file with Machine Code |
I just brought up my 2nd SIMH VAX - a VAX-11/780 named CLOUDY with a DECnet address of 1.551. I installed BASIC, C, C++, COBOL, FORTRAN and PASCAL compilers on it one by one, and tested each with a little "Hello, World" derivative.
There is a free public guest account on CLOUDY VAX if you want to write programs in any of these languages. To get to it, telnet to my oldest VAX - a VAXserver 3900 at sanyalnet-openvms-vax.freeddns.org, login to guest account (password is in the SYS$WELCOME banner), and choose the option to SET HOST CLOUDY. You can then login to the guest account on CLOUDY the same way.
BASIC
$ TYPE HELLO_BAS.BAS
10 PRINT " OpenVMS (TM) VAX Version V7.3 Major version id = 1 Minor version id = 0"
$ BASIC
VAX BASIC V3.9-000
Ready
Exit
$ BASIC HELLO_BAS.BAS
$ LINK HELLO_BAS.OBJ
$ RUN HELLO_BAS.EXE
OpenVMS (TM) VAX Version V7.3 Major version id = 1 Minor version id = 0
$
BLISS-32
$ TYPE HELLO_BLISS.BLS%TITLE 'HELLO_WORLD'
MODULE HELLO_WORLD (IDENT='V1.0', MAIN=HELLO_WORLD,
ADDRESSING_MODE (EXTERNAL=GENERAL)) =
BEGIN
LIBRARY 'SYS$LIBRARY:STARLET';
EXTERNAL ROUTINE
LIB$PUT_OUTPUT;
GLOBAL ROUTINE HELLO_WORLD =
BEGIN
LIB$PUT_OUTPUT(%ASCID %STRING('Hello World!'))
END;
END
ELUDOM
$ TYPE HELLO_BLISS.LIS
HELLO_WORLD 8-Jan-2020 02:08:10 VAX Bliss-32 V4.4-838 Page 1
8-Jan-2020 02:06:04 DUA1:[SANYAL.TEMP]HELLO_BLISS.BLS;1 (1)
; 0001 0 %TITLE 'HELLO_WORLD'
; 0002 0 MODULE HELLO_WORLD (IDENT='V1.0', MAIN=HELLO_WORLD,
; 0003 0 ADDRESSING_MODE (EXTERNAL=GENERAL)) =
; 0004 1 BEGIN
; 0005 1 LIBRARY 'SYS$LIBRARY:STARLET';
; 0006 1 EXTERNAL ROUTINE
; 0007 1 LIB$PUT_OUTPUT;
; 0008 1 GLOBAL ROUTINE HELLO_WORLD =
; 0009 2 BEGIN
; 0010 2 LIB$PUT_OUTPUT(%ASCID %STRING('Hello World!'))
; 0011 1 END;
.TITLE HELLO_WORLD HELLO_WORLD
.IDENT \V1.0\
.PSECT $PLIT$,NOWRT,NOEXE,2
21 64 6C 72 6F 57 20 6F 6C 6C 65 48 00000 P.AAB: .ASCII \Hello World!\ ;
010E000C 0000C P.AAA: .LONG 17694732 ;
00000000' 00010 .ADDRESS P.AAB ;
.EXTRN LIB$PUT_OUTPUT
.PSECT $CODE$,NOWRT,2
0000 00000 .ENTRY HELLO_WORLD, Save nothing ; 0008
0000' CF 9F 00002 PUSHAB P.AAA ; 0010
00000000G 00 01 FB 00006 CALLS #1, LIB$PUT_OUTPUT ;
04 0000D RET ; 0011
; Routine Size: 14 bytes, Routine Base: $CODE$ + 0000
; 0012 1 END
; 0013 0 ELUDOM
; PSECT SUMMARY
;
; Name Bytes Attributes
;
; $PLIT$ 20 NOVEC,NOWRT, RD ,NOEXE,NOSHR, LCL, REL, CON,NOPIC,ALIGN(2)
; $CODE$ 14 NOVEC,NOWRT, RD , EXE,NOSHR, LCL, REL, CON,NOPIC,ALIGN(2)
; Library Statistics
;
; -------- Symbols -------- Pages Processing
; File Total Loaded Percent Mapped Time
;
HELLO_WORLD HELLO_WORLD 8-Jan-2020 02:08:10 VAX Bliss-32 V4.4-838 Page 2
V1.0 8-Jan-2020 02:06:04 DUA1:[SANYAL.TEMP]HELLO_BLISS.BLS;1 (1)
; SYS$COMMON:[SYSLIB]STARLET.L32;1 24705 0 0 1450 00:00.1
; COMMAND QUALIFIERS
; BLISS32/LIST HELLO_BLISS.BLS
; Size: 14 code + 20 data bytes
; Run Time: 00:00.2
; Elapsed Time: 00:00.3
; Lines/CPU Min: 3900
; Lexemes/CPU-Min: 27600
; Memory Used: 51 pages
; Compilation Complete
$ LINK/MAP HELLO_BLISS.OBJ
$ RUN HELLO_BLISS.EXE
Hello World!
$
C
$ TYPE HELLO_C.C
#include<stdio.h>
main()
{
printf(" OpenVMS (TM) VAX Version V7.3 Major version id = 1 Minor version id = 0\n");
}
$ CC/VERSION
Compaq C V6.4-005 on OpenVMS VAX V7.3
$ CC HELLO_C.C
$ LINK HELLO_C.OBJ
$ RUN HELLO_C.EXE
OpenVMS (TM) VAX Version V7.3 Major version id = 1 Minor version id = 0
$
C++
$ TYPE HELLO_CXX.CXX
#include <iostream>
int main()
{
cout << " OpenVMS (TM) VAX Version V7.3 Major version id = 1 Minor version id = 0\n";
}
$ CXX/VERSION
Compaq C++ V5.6-023 on OpenVMS VAX V7.3
$ CXX HELLO_CXX.CXX
$ LINK HELLO_CXX.OBJ
$ RUN HELLO_CXX.EXE
OpenVMS (TM) VAX Version V7.3 Major version id = 1 Minor version id = 0
$
COBOL
$ TYPE HELLO_COBOL.COB
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO-WORLD.
* simple hello world program
PROCEDURE DIVISION.
P0.
DISPLAY ' OpenVMS (TM) VAX Version V7.3 Major version id = 1 Minor version id = 0'.
STOP RUN.
$ COBOL HELLO_COBOL.COB
$ LINK HELLO_COBOL.OBJ
$ RUN HELLO_COBOL.EXE
OpenVMS (TM) VAX Version V7.3 Major version id = 1 Minor version id = 0
$
FORTRAN
$ TYPE HELLO_FOR.FOR
program main
implicit none
write ( *, '(a)' ) ' OpenVMS (TM) VAX Version V7.3'
write ( *, '(a)' ) ' Major version id = 1 Minor version id = 0'
stop
end
$ FORTRAN HELLO_FOR.FOR
$ LINK HELLO_FOR.OBJ
$ RUN HELLO_FOR.EXE
OpenVMS (TM) VAX Version V7.3
Major version id = 1 Minor version id = 0
FORTRAN STOP
$
PASCAL
$ TYPE HELLO_PAS.PAS
program Hello(output);
begin
writeln (' OpenVMS (TM) VAX Version V7.3 Major version id = 1 Minor version id = 0');
end.
$ PASCAL/VERSION
Compaq Pascal V5.8-90 on OpenVMS VAX V7.3
$ PASCAL HELLO_PAS.PAS
$ LINK HELLO_PAS.OBJ
$ RUN HELLO_PAS.EXE
OpenVMS (TM) VAX Version V7.3 Major version id = 1 Minor version id = 0
$
Here are the sizes of the executables produced by the different compiler and linker invocations. BASIC and FORTRAN came in with the biggest EXE sizes, while C and Pascal EXEs are the smallest. COBOL and C++ executables are in the middle in terms of executable sizes. I was a bit surprised since I was expecting C++ to come in the biggest.
$ DIR /SIZE HELLO*.EXE
Directory DUA2:[GUEST]
HELLO_BAS.EXE;1 6
HELLO_C.EXE;1 4
HELLO_COBOL.EXE;1 5
HELLO_CXX.EXE;1 5
HELLO_FOR.EXE;1 6
HELLO_PAS.EXE;1 4
Total of 6 files, 30 blocks.
$
DOWNLOAD
You can download all of these source, object and executable files along with source listings including machine code and link map files with cross-reference (excluding BLISS-32 which was added to this post a long time after initial publication) from my google drive.
No comments:
Post a Comment
"SEO" link builders: move on, your spam link will not get posted.
Note: Only a member of this blog may post a comment.