NASM x86 - целое число для печати с использованием extern printf - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь напечатать целое число, используя printf в сборке x86.Для строки формата printf(fmtstring, vals) я сохранил %d как fmtd.Затем я помещаю 1 в топор, 2 в bx, добавляю их и хочу напечатать результат с помощью вызова printf.Вот код.

global _main

extern _printf

section .data
    fmtd db "%d"

section .text

_main:
    push ebp
    mov ebp, esp

_begin:
    mov ax, 1
    mov bx, 2
    add ax, bx
    push ax
    push fmtd
    call _printf
    add esp, 8

_end:
    mov esp, ebp
    pop ebp
    ret

но я получаю

-10485757

вместо ожидаемого

3

Можете ли вы помочь мне, что с ним не так?

Когда я просто пишу

push 3
push fmtd
call _printf

, он работает как обычно и печатает 3.

Спасибо

1 Ответ

0 голосов
/ 12 февраля 2019

Вам нужно использовать полные 32-битные регистры:

Вы хотите это:

mov eax, 1
mov ebx, 2
add eax, ebx
push eax
push fmtd
call _printf

Пояснение к выводу -10485757 вы получите:

-10485757в шестнадцатеричном виде это FF600003.0003 происходит от push ax, который выдвигает 16 младших битов eax.FF60 - это то, что осталось в стеке.

Читает эту статью SO для подробного объяснения отношений между ax и eax.

...