问题描述
在我的汇编程序中,我很想知道 %rsp 与其初始值相比得到的最小值(随着它的增长)是多少,所以我在 main 中写道:
mov %rsp,%rcx #start
mov %rsp,%rdx #max
以及在推送之前(或任何其他可能影响 %rsp 的命令)我写的代码中的每个部分:
cmp %rsp,%rdx
jl next3 # current rsp is less that prev_max then skip the update of value for max
mov %rsp,%rdx
next3: # every time this is copied I change the number like next4,next5 etc...
但是当我调试我的代码时,rdx 和 rcx 共享相同的值,这是为什么?
解决方法
您的堆栈检查代码实际上是正确的。由于您提供了完整代码[*],我们可以看到从第 73 行开始存在问题:
cmp (%rdi),%esi
cmp %rsp,%rdx
jl next4
mov %rsp,%rdx
next4:
jne continue
您的堆栈检查位于 cmp (%rdi),%esi
和 jne continue
之间,因此它将改用 cmp %rsp,%rdx
中的标志。碰巧它们在那一点上是相等的,因此您的函数不会转到 continue
而是返回。使用的堆栈空间仅为 16 字节。请注意,此堆栈检查块是无用的,因为堆栈指针无法从前一个更改,因此您可以删除第 74-80 行。这将产生 0x40 字节的堆栈使用量,如您所料。
关于操作数顺序的问题,at&t与intel相反。考虑以下代码:
mov $1,%eax
mov $2,%edx
cmp %eax,%edx
jl next
这不会跳跃。
[*] https://onlinegdb.com/5CKsK1GNT 和 ja
改回 jl