[英]why JL command doesn't work in my Assembly code?
在我的匯編程序中,我很想知道 %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
中的標志。 碰巧那些在那個時候是相等的,所以你的 function 不會 go 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.