2015-10-02 51 views
1

目前我正在學習彙編,我正在使用x86宏彙編程序Oracle VM VirtualBox。 我想知道爲什麼我們以這種方式聲明或放置變量(在跳轉命令之後)?如果我在跳轉命令之前聲明或放置變量,則程序將變爲錯誤。 背後有這樣的結構嗎? 謝謝。彙編變量放哪裏?

seg1 segment 
    org 100h 
    jump start 
    ; variables here (comment) 
    start: 

    mov ah, 4ch 
    int 21h 
seg1 ends 
+0

如果他們將作爲代碼執行,這不是你想一般做什麼跳之前將您的變量。所以你可以跳過它們,或者你可以把它們放在你的程序退出的代碼之下(在int 21h/ah = 4ch之後)。在其他內存模型中,您可以將數據放在不同的段中,這樣可以分離數據和代碼。隨着組織100h我收集你正在創建.COM程序數據和代碼在同一個段。 –

+0

如果將變量聲明作爲代碼執行,會發生什麼情況? – Andre

+0

處理器會將這些變量解碼爲指令(它不知道組成變量的字節和組成代碼的字節之間的差異 - 它們都是字節)。在最好的情況下,不會發生(不太可能);由於數據可能形成非法指令或導致程序掛起,最壞情況下的崩潰和燒傷(可能性更大);或導致處理器發生故障。這取決於變量中的內容。 –

回答

1

主要思想是使變量不能作爲代碼執行。不要忘記,從CPU的角度來看,數據和程序是相同的。如果您跳轉到變量區域或者通過執行指令實現IP,CPU將嘗試執行它們,但只要變量可能不包含有意義的指令,就會發生一些CPU異常,並且程序將崩潰或掛起。

儘管跳過這些變量並不是最好的辦法。您可以以同樣的成功將所有變量放在程序的末尾,並且永遠不會執行它們。隨着優勢,使用一個指令少,使代碼更易讀避免不必要的跳躍:

seg1 segment 
    org 100h 

; code here 
    mov ah, 4ch 
    int 21h  ; this will never return, but end the program. 

; variables here will never be executed. 

seg1 ends