NASM Linux 32位:scanf,printf调用

时间:2015-04-21 18:58:56

标签: linux assembly printf nasm scanf

我编写了简单的汇编代码,它使用printfscanf分别在命令行中写入和读取数字。对于这个特定的代码,我得到的输出与给定的不同输入。看来打印的第一个值是[var1]+[var2]*2^8。但是,通过增加变量的大小var1& var2到4个字节,代码给出正确的输出。怎么样?

    ;assemble and compile with :
    ;nasm -f elf testing.asm && gcc -m32 -o testing testing.o
    extern printf,scanf

    ;store eax,ebc,ecx,edx onto the stack
    %macro push_reg 0
    push edx
    push ecx
    push ebx
    push eax
    %endmacro

    ;restore eax,ebx,ecx,edx
    %macro pop_reg 0
    pop eax
    pop ebx
    pop ecx
    pop edx
    %endmacro

    section .text
    global main
    main:
    ;reads number var1
    push_reg          
    push var1
    push formatin
    call scanf          ;scanf("%d",var1);
    add esp,8           ;restoring stack pointer 
    pop_reg            

    ;reads number var1
    push_reg
    push var2
    push formatin
    call scanf        ;scanf("%d",var2);
    add esp,8         ;restoring stack pointer 
    pop_reg           

    ;printing number var1
    push_reg          
    push dword[var1]
    push formatout
    call printf       ;printf("%d",content of var1);
    add esp,8         ;restoring stack pointer 
    pop_reg          

    ;printing number var2
    push_reg
    push dword[var2]
    push formatout
    call printf       ;printf("%d",content of var2);
    add esp,8         ;restoring stack pointer 
    pop_reg       

    exit:
    mov eax,1
    int 0x80

    section .bss
    var1 resb 1
    var2 resb 1

    section .data
    formatout: db "%d",10,0
    formatin: db "%d",0

输入:

1
1

输出:

257
1

1 个答案:

答案 0 :(得分:0)

你告诉scanf& printf您正在扫描/打印整数,这些整数通常为32位(或4字节)值。因此,他们表现得好像是在你提供的地址上使用了那么多的数据。