(VAX, CISC) som kompileras och skapar assembler kod för en helt annan
arkitektur (här Alpha, RISC)?
Källkoden för VAX (VAX Macro-32 assembler), bara 6 instruktioner
förutom assembler direktiv:
Kod: Markera allt
$ type MENABIT.MAR
.TITLE MENABIT
.SBTTL BIT_TEST
;+
; Check if bit is set
;-
.psect mna$bit_service,exe,nowrt,pic,shr
.entry mna$bit_tst,0
bitl @4(ap),@8(ap) ; test bit
beql 10$
movl #-1,r0 ; set true
ret
10$: clrl r0 ; set false
ret
.end
$
Kod: Markera allt
$ d menabit.mar
Directory xxx:[JES]
MENABIT.MAR;2 1/49 28-AUG-2018 18:34:03.45
Total of 1 file, 1/49 blocks.
$
$ macro /list /machine menabit.mar
$
$ d menabit.*
Directory xxx:[JES]
MENABIT.LIS;1 11/49 28-AUG-2018 18:39:26.73
MENABIT.MAR;2 1/49 28-AUG-2018 18:34:03.45
MENABIT.OBJ;1 1/49 28-AUG-2018 18:39:26.73
Total of 3 files, 13/147 blocks.
$
Eftersom det är en RISC så blir det betydligt mer kod:
Kod: Markera allt
MENABIT Source Listing 28-AUG-2018 18:43:05 AMAC V5.0-120-5 Page 1
28-AUG-2018 18:34:03 xxx:[JES]MENABIT.MAR;2
00000000 1 .TITLE MENABIT
00000000 2 .SBTTL BIT_TEST
00000000 3 ;+
00000000 4 ; Check if bit is set
00000000 5 ;-
00000000 6 .psect mna$bit_service,exe,nowrt,pic,shr
00000000 7 .entry mna$bit_tst,0
00000002 8 bitl @4(ap),@8(ap) ; test bit
00000007 9 beql 10$
00000009 10 movl #-1,r0 ; set true
00000010 11 ret
00000011 12 10$: clrl r0 ; set false
00000013 13 ret
00000014 14 .end
MENABIT Machine Code Listing 28-AUG-2018 18:43:05 AMAC V5.0-120-5 Page 2
BIT_TEST 28-AUG-2018 18:34:03 xxx:[JES]MENABIT.MAR;2
.PSECT MNA$BIT_SERVICE, OCTA, PIC, CON, REL, LCL, SHR, EXE, RD, NOWRT
0000 MNA$BIT_TST::
23DEFFE0 0000 LDA SP, -32(SP)
B77E0000 0004 STQ R27, (SP)
B75E0010 0008 STQ R26, 16(SP)
B7BE0018 000C STQ FP, 24(SP)
47FE041D 0010 MOV SP, FP
0014 $L1:
201FFFFF 0014 MOV -1, R0 ; 000010
A3900000 0018 LDL R28, (R16) ; 000008
A3510000 001C LDL R26, (R17)
475C0012 0020 AND R26, R28, R18
43F20012 0024 SEXTL R18, R18
E6400009 0028 BEQ R18, 3_10$ ; 000009
002C $L2: ; 000011
47FD041E 002C MOV FP, SP
A79D0010 0030 LDQ R28, 16(FP)
A7BD0018 0034 LDQ FP, 24(FP)
23DE0020 0038 LDA SP, 32(SP)
2FFE0000 003C UNOP
6BFC8001 0040 RET R28
2FFE0000 0044 UNOP
2FFE0000 0048 UNOP
2FFE0000 004C UNOP
0050 3_10$: ; 000012
47FD041E 0050 MOV FP, SP ; 000011
A79D0010 0054 LDQ R28, 16(FP)
A7BD0018 0058 LDQ FP, 24(FP)
47FF0400 005C CLR R0 ; 000012
23DE0020 0060 LDA SP, 32(SP) ; 000011
6BFC8001 0064 RET R28
Routine Size: 104 bytes, Routine Base: MNA$BIT_SERVICE + 0000
Denna teknik används för att porta VAX assembler både till Alpha och Intel Itanium.
Och just nu även vid portningen av OpenVMS till "standard" Intel x86-64.
VAX Macro assembler kompileras direkt till Intel X86-64 kod...
Det är en del utmaningar med att t.ex. översätta de fysiska registren mellan
de olika arkitekturerna...