簡體   English   中英

為什么 JL 命令在我的匯編代碼中不起作用?

[英]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), %esijne 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/5CKsK1GNTja改回jl

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM