Assembly 8086 - 堆栈参数问题

时间:2016-01-13 14:51:15

标签: assembly x86 stack

我对堆栈和它的值的访问权限有些怀疑。我写了一个程序,需要3个数值的代码(正好是3 3 2),我想首先检查值的数量是否正确(在这种情况下为3),如果每个值分别对应3,3和2。 这是我的代码:

.section .data
   error:
      .ascii "Error!\n"
   error_len:
       .long . - error
.section .text
   .global _start
_start:
   popl %eax         #first element on stack: number of parameters
                     #program name + three values
   cmp $4, %eax
   jne err
   pop %eax          #second element: program's name (useless)
   pop %eax          #third element: first value of the code
   cmp $51, %eax     #compare with ASCII code of "3"
   jne err
   pop %eax          #fourth element: first value of the code
   cmp $51, %eax     #compare with ASCII code of "3"
   jne err
   pop %eax          #fifth element: first value of the code
   cmp $50, %eax     #compare with ASCII code of "2"
   jne err
   jmp exit

err:    
   movl $4, %eax     #print error message with sys write
   movl $1, %ebx
   leal error, %ecx
   movl error_len, %edx
   int $0x80
   jmp exit

exit:
   movl $1, %eax     #exit
   xorl %ebx, %ebx
   int $0x8

当我启动程序(./run 3 3 2)时,第一次检查是正确的(参数个数),但是当我检查第一个值指令时cmp失败,因为存在与51不同的值(有时为0,有时为47)等等)所以我不确定堆栈是如何工作的!有帮助吗?谢谢! PS:我使用Ubuntu 13.10 x64并使用gdb进行调试

1 个答案:

答案 0 :(得分:3)

您正在比较字符和字符串指针(地址)。你想要的是:

cmpb $51, (%eax)  # compare the first byte pointed to by %eax with the value 51

..等等其他论点。

请注意,写$'3'而不是$51是完全正常的,所以这里不需要直接使用ASCII代码。