在x86 AT& T Assembly中将命令行args视为整数

时间:2012-04-04 12:37:52

标签: assembly x86 intel

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

[编辑 - 感谢harold在下面的评论我认为问题是如何使用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           

1 个答案:

答案 0 :(得分:3)

为了能够呼叫atoi,您需要链接libc。 e.g:

ld -lc foo.o

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

  1. 函数的参数在堆栈中传递,最左边的参数最后被推送。
  2. 函数的返回值将放在累加器中(在这种情况下为%eax)。
  3. 寄存器%ebp,%esi,%edi和%ebx会在调用中保留,因此您可以将它们用于临时存储。
  4. 任何其他需要的寄存器必须由调用代码保存(在上面的被调用者保存的寄存器中,在参数之前的堆栈中或内存中的其他地方)。
  5. 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