Machine code: Difference between revisions

m
→‎{{header|Phix}}: added syntax colouring the hard way
m (Output more accurate.)
m (→‎{{header|Phix}}: added syntax colouring the hard way)
Line 746:
 
=={{header|Phix}}==
<!--<lang Phix>atom mem = allocate(9)-->
<span style="color: #004080;">atom</span> <span style="color: #000000;">mem</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">allocate</span><span style="color: #0000FF;">(</span><span style="color: #000000;">9</span><span style="color: #0000FF;">)</span>
poke(mem,{#8B,#44,#24,#04,#03,#44,#24,#08,#C3})
<span style="color: #000000;">poke</span><span style="color: #0000FF;">(</span><span style="color: #000000;">mem</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">#8B</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#44</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#24</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#04</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#03</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#44</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#24</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#08</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#C3</span><span style="color: #0000FF;">})</span>
constant mfunc = define_c_func({},mem,{C_INT,C_INT},C_INT)
<span style="color: #008080;">constant</span> <span style="color: #000000;">mfunc</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">define_c_func</span><span style="color: #0000FF;">({},</span><span style="color: #000000;">mem</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">C_INT</span><span style="color: #0000FF;">,</span><span style="color: #000000;">C_INT</span><span style="color: #0000FF;">},</span><span style="color: #000000;">C_INT</span><span style="color: #0000FF;">)</span>
?c_func(mfunc,{12,7})
<span style="color: #0000FF;">?</span><span style="color: #000000;">c_func</span><span style="color: #0000FF;">(</span><span style="color: #000000;">mfunc</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">12</span><span style="color: #0000FF;">,</span><span style="color: #000000;">7</span><span style="color: #0000FF;">})</span>
free(mem)</lang>
<span style="color: #000000;">free</span><span style="color: #0000FF;">(</span><span style="color: #000000;">mem</span><span style="color: #0000FF;">)</span>
?res<!--</lang>-->
In Phix the #ilASM statement (which has guards to allow 32/64/WIN/LNX variants) is usually used for inline assembly, for example (but sticking to the task):
<!--<lang Phix>atom mem = allocate(9)-->
<span style="color: #004080;">atom</span> <span style="color: #000000;">mem</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">allocate</span><span style="color: #0000FF;">(</span><span style="color: #000000;">9</span><span style="color: #0000FF;">)</span>
poke(mem,{#8B,#44,#24,#04,#03,#44,#24,#08,#C3})
<span style="color: #000000;">poke</span><span style="color: #0000FF;">(</span><span style="color: #000000;">mem</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">#8B</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#44</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#24</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#04</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#03</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#44</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#24</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#08</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#C3</span><span style="color: #0000FF;">})</span>
integer res
<span style="color: #004080;">integer</span> <span style="color: #000000;">res</span>
#ilASM{ mov eax,[mem]
call :%pLoadMint -- eax:=(int32)eax, in case mem>&gt;#3FFFFFFF
push 12
push 712
call eaxpush 7
add esp,8call eax
mov [res],eaxadd }esp,8
mov [res],eax }
?res
<span style="color: #0000FF;">?</span><span style="color: #000000;">res</span>
free(mem)</lang>
<span style="color: #000000;">free</span><span style="color: #0000FF;">(</span><span style="color: #000000;">mem</span><span style="color: #0000FF;">)</span>
<!--</lang>-->
Better yet, albeit deviating somewhat from the task (and this runs on both 32 and 64 bit):
<!--<lang Phix>integer res-->
<span style="color: #004080;">integer</span> <span style="color: #000000;">res</span>
#ilASM{ jmp @f
::add
[32] ::add
mov eax,[esp+432]
add mov eax,[esp+84]
add eax,[64esp+8]
mov rax,[rsp+864]
add mov rax,[rsp+168]
[] add rax,[rsp+16]
[] ret
@@: ret
push 12@@:
push 712
call :addpush 7
[32] call :add
add esp,8[32]
mov [res]add esp,eax8
mov [64res],eax
add rsp,16[64]
mov [res]add rsp,rax16
mov [res],rax
}[]
push 12}
?res</lang>
<span style="color: #0000FF;">?</span><span style="color: #000000;">res</span>
<!--</lang>-->
All three cases output 19
 
7,818

edits