为什么 JL 命令在我的汇编代码中不起作用?

问题描述

在我的汇编程序中,我很想知道 %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),%esijne 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/5CKsK1GNTja 改回 jl