在x86 asm中输出变量值

时间:2010-03-24 02:32:18

标签: assembly x86 output

我正在汇编程序中编写一个程序并且它不能正常工作,所以我想在x86函数中输出变量以确保这些值符合我的预期。有一种简单的方法可以做到这一点,还是非常复杂?

如果它更简单,则从C函数中使用汇编函数,并使用gcc编译。

1 个答案:

答案 0 :(得分:7)

看来你的问题是“如何在x86汇编程序中打印变量值”。 x86本身不知道如何做到这一点,因为它完全取决于你正在使用的输出设备(以及操作系统提供的输出设备接口的具体细节)。

这样做的一种方法是使用操作系统系统调用,正如您在另一个答案中提到的那样。如果您使用的是x86 Linux,则可以使用sys_write sys调用将字符串写入标准输出,如下所示(GNU汇编语法):

STR:
    .string "message from assembler\n"

.globl asmfunc
    .type asmfunc, @function

asmfunc:
    movl $4, %eax   # sys_write
    movl $1, %ebx   # stdout
    leal STR, %ecx  #
    movl $23, %edx  # length
    int $0x80       # syscall

    ret

但是,如果要打印数值,那么最灵活的方法是使用C标准库中的printf()函数(你提到你从C调用你的汇编程序,所以你无论如何都可能链接到标准库)。这是一个例子:

int_format:
    .string "%d\n"

.globl asmfunc2
    .type asmfunc2, @function

asmfunc2:
    movl $123456, %eax

    # print content of %eax as decimal integer
    pusha           # save all registers
    pushl %eax
    pushl $int_format
    call printf
    add $8, %esp    # remove arguments from stack
    popa            # restore saved registers

    ret

有两点需要注意:

  • 您需要保存和恢复寄存器,因为它们会受到呼叫的影响;和
  • 调用函数时,参数按从右到左的顺序推送。