2016-11-29 102 views
2

我剛剛開始自學程序集以瞭解代碼和操作系統是如何工作的。據我所知,jmp foo告訴處理器去包含標籤foo的行。但是,最基本的操作系統(如果它真的可以被稱爲是!)看起來像這樣...jmp如何在裝配中工作? (操作系統開發)

foo:       ; label foo 
    jmp foo     ; Go to foo 
    times 512-($-$$) db 0  ; Fill remaining bytes with 0's 

據我瞭解這個代碼時,處理器看到1號線,並記住它是foo。然後它繼續到第2行,它告訴它去foo。並重復,永遠不要到第3行告訴它填補空白空間。

爲什麼這不是一個無限循環?它在VirtualBox編譯時(我在這裏使用正確的單詞?)運行到.iso文件中時運行良好。

+0

'jmp'只是「從這裏取指令X字節」。這是你說的話,但當然不是線路地址。就行而言,「從這裏跳到X行」和「jmp foo」將是「從這裏跳到-1行」,當然這只是一個類比 –

+0

@MargaretBloom對,但是第三行如何執行? – seadoggie01

+6

它**是一個無限循環,第三行不是指令,它是一個彙編程序指令,用零填充扇區的其餘部分。它在組裝過程中由組裝者「執行」。 – Jester

回答

3

第一件事;這是彙編代碼,所以這不是由處理器直接執行的。彙編在這裏扮演一個角色。它掃描您的彙編代碼並創建機器代碼。這是一個Instructions(數據也)的序列。

讓我們來你的代碼

foo:       ; label foo 
jmp foo      ; Go to foo 
times 512-($-$$) db 0   ; Fill remaining bytes with 0's 

彙編看看你的程序。並且保存「foo」的地址,即0x00000000(零) 第一條指令是在地址0x00000000處跳轉(標籤沒有大小),它告訴處理器跳到foo,即跳到0x00000000。所以彙編程序創建一個二進制文件,它放置「jmp」指令的機器代碼並在地址字段中放入0x00000000。

下一步「倍」這不是一個機器可執行代碼,這是相當一個彙編關鍵字,它告訴操作被跟隨命令n次彙編。所以填充,直到地址512

所以二進制輸出應該是這樣的「0」字節的休息空間。

enter image description here

所以實際上這是一個無限循環