2016-02-23 60 views
0

我試着尋找這個答案,任何相似的例子都不是太簡單就是太複雜。我使用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執行,因爲它是下一個順序?

回答

1

想象一下,你的代碼根本沒有標籤。這臺機器會一個接一個地執行指令,順着列表走下去。添加標籤根本不會改變這種行爲;除非跳躍,否則機器將繼續執行下一條指令。

標籤給出了一個內存地址的名稱。跳躍時它們很有用。如果我們沒有標籤,那麼我們可能需要做這樣的事情:

add foo, bar 
sub foo, bar 
mul foo, bar 
jmp -2   ; Fake code for "go up 2 instructions" 

帶標籤,我們可以以一個指令的內存地址給名字:

add foo, bar 
thingamajig:  ; This label equals the address of the 'sub' instruction 
    sub foo, bar 
    mul foo, bar 
    jmp thingamajig 
+0

所以經過「等於到「打印出來,這意味着標籤3(內存地址)下面的內容只是因爲它們是下一個順序而被執行? – user3561699

+0

是的。 'label3'上面的指令是'call print_nl'。因此,在執行後,下一條指令是'cmp dword [var_a],0'。 – Nayuki

+0

爲了清楚起見,我重複一下我的觀點:標籤不影響直線代碼的執行。它們提供跳轉的目標位置。它們還提供存儲數據的地址(如果從標記的內存位置加載數據)。 – Nayuki