我正在编写汇编程序,但它不起作用,因此我想在X86函数中输出变量,以确保值是我希望它们的值。有什么简单的方法可以做到这一点,还是很复杂?

如果使它变得更简单,则从C函数中使用组装功能,并使用GCC编译。

有帮助吗?

解决方案

看来您的问题是按照“如何在x86汇编器中打印出变量值”的行。 X86本身不知道该怎么做,因为它完全取决于您使用的输出设备(以及该输出设备的OS提供接口的细节)。

这样做的一种方法是使用操作系统syscalls,正如您在另一个答案中提到的那样。如果您在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

但是,如果要打印数字值,那么最灵活的方法将是使用 printf() 来自C标准库的函数(您提到您正在调用C汇编的ROUNTINE,因此您可能还是链接到标准库)。这是一个例子:

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

要注意的两件事:

  • 您需要保存和还原寄存器,因为它们被通话困扰;和
  • 当您调用函数时,参数将按左顺序推动。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top