user11047992
user11047992

Reputation:

NASM x86 print integer using extern printf

I try to print an integer using printf in x86 assembly. For the format string printf(fmtstring, vals) i have stored the %d as fmtd. Then i put 1 into ax, 2 into bx, add them and want to print the result using call printf. Here is the code.

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

but i get

-10485757

instead of expected

3

can you help me whats wrong with it?

When i just write

push 3
push fmtd
call _printf

it works as usual and prints 3.

Thank you

Upvotes: 4

Views: 2585

Answers (1)

Jabberwocky
Jabberwocky

Reputation: 50775

You need to use the full 32 bit registers:

You want this:

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

Explanation of output -10485757 you get:

-10485757 in hexadecimal is FF600003. The 0003 comes from the push ax which pushes the 16 low bits of eax. The FF60 is whatever leftover was on the stack.

Reads this SO article for detailed explanation about the relationship between ax and eax.

Upvotes: 3

Related Questions