2016-04-27 71 views
4

我正在學習如何建立組裝和連接的實模式程序:使用「.intel_syntax noprefix」如何獲得標籤的內存地址?

  • GCC彙編版本2.25
  • Binutils的版本2.25
  • GCC 5.2.0版本

我使用英特爾語法不帶前綴.intel_syntax noprefix

我想將一個字符串的地址加載到SI註冊。我知道,如何引用NASM中的內存位置,但是當我在GNU彙編程序代碼中執行相同操作時,它只將字符串的WORD移動到寄存器中,而不是標籤的地址。

我的代碼是:

.code16 
.intel_syntax noprefix 

mov cx, 11 
mov si, name 
mov di, 0x7E00 
push di 
rep cmpsb 
pop di 
je LOAD 

當我用GCC編譯它,我可以在處理器確實調試器看到:

mov si, WORD ptr ds:0x7d2d 

,但我想要的字符串的地址遷入寄存器,而不是它指向的數據。

我也試圖把方括號的名字是這樣的:

.code16 
.intel_syntax noprefix 

mov cx, 11 
mov si, [name] 
mov di, 0x7E00 
push di 
rep cmpsb 
pop di 
je LOAD 

它不會有所作爲。

NASM我知道,這彙編代碼的工作原理:

mov si, name 

NASM將生成的name地址移動到寄存器SI指令。

我的問題:有沒有辦法強制GCC使用帶有無前綴的英特爾語法將符號的地址加載到寄存器中?

+0

事實後,我發現一個相關的問題,與[Stackoverflow答案](http://stackoverflow.com/questions/16121173/why-does-switching-from-att-to-intel-syntax-make-this -tutorial-segfault-using-g)是相似的。根據不同的觀點,這個問題可能被認爲是重複的。 –

回答

4

如果使用GNU彙編代碼(通過GCC)與指令:

.intel_syntax noprefix 

那麼語法似乎有點不尋常,並在規範的來源無據可查。此代碼:

mov si, name 

在存儲位置移動16位WORD指向標籤nameSI。以下說明做同樣的事情,雖然我更喜歡方括號[],因爲代碼的意圖是清晰的:

mov si, name    
mov si, [name] 
mov si, word ptr [name] # This is the same as two above in long form 
          #  The use of "word ptr" here is similar to MASM 

要獲得name的地址,並把它放入你需要使用offset這樣的寄存器:

mov si, offset name 

如果有人有,實際上描述了可與使用的語法規範源請在評論中告訴我。我知道blogs about the syntax,連同一些輕蔑,但沒有官方。

+1

我還沒有見過任何使用'.intel_syntax'源文件的開源項目。項目通常選擇AT&T語法,或使用NASM或YASM。不過,我想不出/爲什麼GNU'.intel_syntax'不太好的具體原因。例如我不認爲你在AT&T語法中可以做任何你不能在'intel_syntax'中做的任何事情,或者額外的含糊之處。 (我的缺點是,它就像MASM語法,而我更喜歡NASM語法,所有有效地址都需要'[]')。 –

+0

@PeterCordes:我同意,並且這種語法不是我經常看到的 - 我知道一些含糊之處,但這絕對是我缺乏第一手經驗的一個領域。如果我使用GAS,我通常會採用AT&T語法,如果我需要Intel,我會使用NASM,YASM等。如果你沒有其他選擇,並且不能用於AT&T語法,那麼我想這可能會成爲一個用例。想象一下當我找不到完整語法的canon源時我的失望。閱讀binutils源代碼太像工作了;-) –

+1

是的,我預計它也會在某個地方正式記錄。儘管如此,我並不完全感到震驚。對我來說,它是反彙編/編譯器輸出的主要格式,不能寫入。 –