nasm src.asm -f elf32 && gcc -m32 -o bin src.o
Пример кода для NASM'а:
extern printf ; the C function to be called
SECTION .data ; Data section
msg: db "Result: %d",10,0
a : dd 4
b : dd 2
d : dd 1
SECTION .text ; Code section.
global main ; "C" main program
main: ; label, program entrypoint
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; r = (b - (d / b) + (a / 4)) / (a * b - 1)
mov edx, 0
; при делении edx должен быть пустой! div делит
; не просто eax на аргумент, а длинное (64 бита)
; число, находящееся в паре регистров eax:edx
; на аргумент.
; числитель
mov ecx, 0
add ecx, [b]
mov eax, [d]
mov ebx, [b]
div ebx ; d/b
sub ecx, eax
mov eax, [a]
mov ebx, 4
mov edx, 0
div ebx ; a/4
add ecx, eax
mov esi, ecx
; знаменатель
mov ecx, 0
mov eax, [a]
mov ebx, [b]
mul ebx ; a*b
add ecx, eax
sub ecx, 1
; результат
mov eax, esi
div ecx
;;;;;;;;
; ВЫВОД
push dword eax
push dword msg ; format string
call printf ; call printf
add esp, 8 ; clean stack 2*4 bytes
mov eax, 0 ; exitcode
ret ; okay
Пруфлинк к комментарию про деление.
Комментариев нет:
Отправить комментарий