Напоминарик

Компилировать NASM'ом ассемблерный код в 32-битные бинарники под 64-битными линуксами нужно так:

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
Пруфлинк к комментарию про деление.

Комментариев нет:

Отправить комментарий