微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决为什么 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。