Untitled
unknown
plain_text
3 years ago
1.7 kB
2
Indexable
extern printf ; the C function to be called %macro pabc 1 ; a "simple" print macro section .data .str db %1,0 ; %1 is first actual in macro call section .text ; push onto stack backwards push dword [c] ; int c push dword [b] ; int b push dword [a] ; int a push dword .str ; users string push dword fmt ; address of format string call printf ; Call C function add esp,20 ; pop stack 5*4 bytes %endmacro section .data ; preset constants, writeable a: dd 3 ; 32-bit variable a initialized to 3 b: dd 4 ; 32-bit variable b initializes to 4 fmt: db "%s, a=%d, b=%d, c=%d",10,0 ; format string for printf section .bss ; unitialized space c: resd 1 ; reserve a 32-bit word section .text ; instructions, code segment global main ; for gcc standard linking main: ; label lit5: ; c=5; mov eax,5 ; 5 is a literal constant mov [c],eax ; store into c pabc "c=5 " ; invoke the print macro addb: ; c=a+b; mov eax,[a] ; load a add eax,[b] ; add b mov [c],eax ; store into c pabc "c=a+b" ; invoke the print macro subb: ; c=a-b; mov eax,[a] ; load a sub eax,[b] ; subtract b mov [c],eax ; store into c pabc "c=a-b" ; invoke the print macro mulb: ; c=a*b; mov eax,[a] ; load a (must be eax for multiply) imul dword [b] ; signed integer multiply by b mov [c],eax ; store bottom half of product into c pabc "c=a*b" ; invoke the print macro diva: ; c=c/a; mov eax,[c] ; load c mov edx,0 ; load upper half of dividend with zero idiv dword [a] ; divide double register edx eax by a mov [c],eax ; store quotient into c pabc "c=c/a" ; invoke the print macro mov eax,0 ; exit code, 0=normal ret ; main return to operating system
Editor is loading...