【发布时间】:2021-05-24 01:23:24
【问题描述】:
在我的汇编程序中,我很想知道 %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 共享相同的值,这是为什么呢?
【问题讨论】:
-
堆栈向下增长并且 at&t 使用反向操作数顺序。您要么想要
cmp %rdx, %rsp,要么将jl换成jg(或ja,因为您确实应该使用无符号)。 -
@Jester 也试过 ja,同样的问题你可以试试:onlinegdb.com/5CKsK1GNT
-
请注意,
jg或ja在mov指令上更容易理解为cmovna %rsp, %rdx或cmovb %rsp, %rdx -
嗯,实际上是我的错误,您确实有
jl跳过该块,这样应该可以工作。事实上,如果我将链接中的第 60 行更改为jl,然后在第 186 行检查rcx和rdx,它们确实会有所不同。 -
是的,建议使用
jb,因为它是无符号的,但jl在一般情况下的效果与x86-64 中的堆栈位于正半部分一样好。 at&t 仍然使用相反的顺序,所以在cmp %rsp, %rdxjl跳转之后,如果rdx < rsp这是你想要的,因为这意味着rdx已经较低,所以你想跳过分配,因为堆栈增长了。
标签: assembly x86-64 cpu-registers att