我試着尋找這個答案,任何相似的例子都不是太簡單就是太複雜。我使用Paul Carter的書作爲集會課,所以一些宏是從他那裏得來的。即,print_string,print_int和print_nl函數。此彙編代碼中的執行順序? (NASM)
鑑於這個片段組裝:
segment .data
output db "Welcome!",0
string1 db "greater than",0
string2 db "less than",0
string3 db "equal to",0
var_a dd 0Ah
segment .bss
segment .text
global _asm_main
_asm_main:
enter 0,0 ; setup routine
pusha
;***************CODE STARTS HERE***************************
mov eax, output
call print_string
call print_nl
cmp dword[var_a], 0Ah
jle label1
mov eax, string1
call print_string
call print_nl
jmp label3
label1:
cmp dword[var_a], 9h
jg label2
mov eax, string2
call print_string
call print_nl
jmp label3
label2:
mov eax, string3
call print_string
call print_nl
label3:
cmp dword [var_a], 0
jle label4
sar [var_a], 1
mov eax, dword [var_a]
call print_int
call print_nl
jmp label3
label4:
;***************CODE ENDS HERE*****************************
popa
mov eax, 0 ; return back to C
leave
ret
輸出是:
歡迎您!
equal to
5
2
1
0
我的問題:
我怎麼看它最終得到通過比較來LABEL2,打印「等於」消息和新的生產線。但之後,我在label2中看不到其他比較。那時,label3如何被調用?該程序如何「離開」label2?除了在label2的末尾(打印「等於」)和label3的開始(它循環移位並打印數字)之間,我理解了程序集中的所有內容。我錯過了什麼嗎?
執行label2後,程序的控制是否返回label2中第一次調用label2的地方?還是label3執行,因爲它是下一個順序?
所以經過「等於到「打印出來,這意味着標籤3(內存地址)下面的內容只是因爲它們是下一個順序而被執行? – user3561699
是的。 'label3'上面的指令是'call print_nl'。因此,在執行後,下一條指令是'cmp dword [var_a],0'。 – Nayuki
爲了清楚起見,我重複一下我的觀點:標籤不影響直線代碼的執行。它們提供跳轉的目標位置。它們還提供存儲數據的地址(如果從標記的內存位置加載數據)。 – Nayuki