Q1) 我曾見過一些匯編代碼使用[rsp 4]來訪問堆疊上的變數,而其他代碼則使用[rbp-4]。我認為它們都是正確的,唯一的區別是使用堆疊框架的哪一端。
Q2.
Q2)當進入一個函式時,我們應該push [rsp],而在離開時pop rsp。然而,當我不使用這些指令時,代碼運行得很好。為什么需要這些指令呢?下面是test.asm.
Q3) 當在main中離開程式時,我們要回傳退出代碼,例如:0 xor rdi rdi。然而,當我不使用這個命令時,它仍然作業。與下面test.asm.
Q4) push 5與mov [rsp], 5是否相同?
; test.asm
; 編譯成這樣(用MSVC鏈接)。
; nasm -f win64 -o test.obj test.asm
; /LINK /DEFAULTLIB:msvcrt.lib /DEFAULTLIB:legacy_stdio_definitions.lib /DEFAULTLIB:Kernel32.lib /SUBSYSTEM:console test.obj /OUT:test.exe
; 給出輸出。
; 1
; 2
位數 64
默認的關系
段.資料
ifmt: db "%d, 0xd, 0xa, 0x0
節點.文本
全域main
外部printf
PrintInt:
子rsp, 40
mov rdx, rcx
lea rcx, [ifmt].
呼叫printf
添加rsp, 40
回傳
main:
子rsp, 24
mov rcx, 1
呼叫PrintInt
mov rcx, 2
呼叫PrintInt
添加rsp, 24
回傳
uj5u.com熱心網友回復:
Q1. 這是正確的。
Q2. push rsp, push [rsp], 和pop rsp 幾乎是永遠正確的。也許有一些專門的用途,但對于初學者來說不是。你可能想到的是push rbp和pop rbp,只有當你在函式中使用rbp時,才需要用到它們。
Q3. 當從main回傳時,將eax設定為退出狀態,而不是edi。如果你呼叫exit函式,那么在ecx中把狀態作為引數傳給exit函式。如果呼叫者不使用退出狀態,那么如果你不設定它,你將不會注意到有什么不同。
Q4.
Q4. push 5與lea rsp, [rsp-8]; mov qword [rsp], 5相同。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/320386.html
標籤:
