2017-10-18 65 views
0

我把下面的代碼NASM:[ORG 0x7C00]對文件實際做了什麼?

[BITS 16] 
[ORG 0x7C00] 

TIMES 510 - ($ - $$) db 0 

,並在我的十六進制編輯器看了一下,發現了一堆0的。這是我所期望的,但現在我問這個問題:[ORG 0x7C00]實際上對文件做了什麼?

+3

在此代碼示例中,ORG指令不會直接執行任何操作。它設置所有絕對地址相對於的偏移量。你在這個無所作爲的代碼中沒有絕對的偏移量,所以你沒有看到它們的差異。定義一些內存來保存一些數據並將數據移動到該地址(通過標籤)。如果更改org指令,則應該注意內存地址的差異。 –

+2

只需在'ORG'下添加'mov ax,[$]'並生成二進制文件,它將以字節'a1 00 7c 00'開始(即'a1'指令具有編碼的硬偏移量'0x7C00', 'ORG'將下一條指令視爲內存中的0x7C00偏移量,即'$ == 0x7C00')。文檔:[7.1.1 ORG:二進制文件程序來源](http://www.nasm.us/doc/nasmdoc7.html#section-7.1.1)(有趣的是* * *,列表文件顯示了操作碼在「連接」之前,即'A1 [0000]'......這是不幸的)。 – Ped7g

回答

0

ORG指令用於向彙編器和鏈接器提供結果目標文件的「提示」。它允許你指定文件部分的基地址。

當創建「函數」(您可能會遇到的問題CALL)時,如果這些函數與您的調用距離足夠遠,彙編器將需要使用絕對地址進行調用,而不是使用當前指令的偏移量。 ORG指令有效鎖定代碼,使其不依賴於位置的代碼。

在實踐中,除非你正在寫很長的代碼塊,大部分的JMPCALL說明會SHORTNEAR,允許使用簡單的偏移。

+2

在NASM中,當輸出到中間對象時,'ORG'指令不適用,只是'bin'目標。這不僅僅是一個提示,它是NASM需要確定從何時開始直接輸出二進制文件時的偏移量。 ORG指令的缺失會導致原點爲0.如果您嘗試使用ORG並輸出到類似精靈對象的東西,它應該會出錯。 –

+1

當'call'超出'rel16'調用的範圍時,你確定NASM會發出'far call ptr16:16'嗎?這沒有意義,因爲遠程調用不僅僅是返回地址。 (沒有絕對的直接接近呼叫,我懷疑NASM會發出'mov ax,target'/'call ax')。總之,有很多方法可以生成位置相關的代碼,例如, 'mov ax,label'或'mov ax,[label]',然後ORG進入遊戲。 –

相關問題