我对堆栈和它的值的访问权限有些怀疑。我写了一个程序,需要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进行调试
答案 0 :(得分:3)
您正在比较字符和字符串指针(地址)。你想要的是:
cmpb $51, (%eax) # compare the first byte pointed to by %eax with the value 51
..等等其他论点。
请注意,写$'3'
而不是$51
是完全正常的,所以这里不需要直接使用ASCII代码。