1

这个(Linux、AT&T、Intel)x86 程序旨在读取三个参数并将最大的参数存储在 %ebx 中作为存在状态。当我将参数弹出到寄存器中时,结果值似乎是字节。如何获得 int 值?

[编辑——感谢哈罗德在下面的评论,我认为问题是我如何使用atoi来获取 args 的 int 值。]

.section .text

.globl _start           

_start:
popl    %edi        # Get the number of arguments
popl    %eax        # Get the program name
popl    %ebx        # Get the first actual argument 
movl    (%ebx), %ebx    # get the actual value into the register (?) 
popl    %ecx        # ;
movl    (%ecx), %ecx
popl    %edx        #
movl    (%edx), %edx

bxcx:   
cmpl    %ebx,%ecx
jle     bxdx
movl    %ecx,%ebx
bxdx:
cmpl    %ebx,%edx
jle end
movl    %edx,%ebx

end:
movl    $1,%eax         
int $0x80           
4

1 回答 1

3

为了能够调用atoi,您需要链接到 libc。例如:

ld -lc foo.o

要实际进行调用,您需要遵循 cdecl 调用约定:

  1. 函数的参数在堆栈上传递,最左边的参数最后被压入。
  2. 函数的返回值将放在累加器中(在本例中为 %eax)。
  3. 寄存器 %ebp、%esi、%edi 和 %ebx 在调用之间保留,因此您可以将它们用于临时存储。
  4. 任何其他需要的寄存器必须由调用代码保存(在上面的被调用者保存的寄存器中,在参数之前的堆栈中,或内存中的其他位置)。

的签名atoi

int atoi(const char *nptr);

所以要获得第一个命令行参数的整数值,我们可以这样做

.section .text

.globl _start           

_start:
popl    %edi        # Get the number of arguments
popl    %eax        # Get the program name
call    atoi        # Try to read the first argument as an integer and clobber %eax with the value
于 2012-04-05T15:17:17.817 回答