2011-10-18 80 views
2

假設在裝配有該指令NASM有誰知道如何計算有效地址

MOV EAX, [label1] ; label1 is at location 0x00D5A360 

你如何計算出有效的地址是吧^上面的位置。

我知道事實上尋址模式是直接的。

+0

我對納斯姆不熟悉。在MIPS彙編程序中,跳轉到標籤的命令使用相對值 - 即當前行與標籤所在行之間的行數。儘管NASM看起來與簡單的MIPS完全不同,但我甚至不知道MOV命令對標籤的作用。 – melak47

+0

沒有馴服! 32位數(0x00D5A360)作爲指令的第二部分** MOV EAX **直接指向內存位置。 –

回答

5

在nasm中label指的是標籤的地址,而[label]檢索存儲在那裏的值。所以,你可以這樣做:

mov eax, label1  ; eax <- 0x00D5A360 

或使用多功能lea(加載有效地址):

lea eax, [label1] ; eax <- 0x00D5A360 

或者你問如何彙編確定有效的地址?因爲這是由彙編程序,可選的鏈接器和加載程序組合處理的。通常你的代碼將編譯成一箇中間對象格式,其中relocations和鏈接器或加載器將處理爲您計算label1的有效地址。

+0

以及即時要求是什麼方法來計算從彙編器的有效地址,例如我發佈的示例行 MOV EAX,[label1]; label1位於地址0x00D5A360 現在有效地址是:0x00d5a360 –

+0

@Shawnricshawnawic:那麼我的答案的第二個是相關的。根據nasm的環境/輸出格式,它可以是靜態確定的(可以通過'ORG'指令來影響這一點),也可以在鏈接時(使用外部符號)或運行時(再次使用外部符號)。 – user786653

+0

完美的感謝我明白我也學到了一種新技術「lea」LOAD EFFECTIVE ADDRESS誰會想到LOL非常感謝你,我想我可以從這裏處理它:) –

0

從「英特爾64和IA-32體系結構軟件開發人員手冊:第2卷」:

 
LEA r16, m ; Store effective address for m in register r16. 
LEA r32, m ; Store effective address for m in register r32. 
LEA r64, m ; Store effective address for m in register r64. 

計算第二個操作數中的第一操作數的有效地址(源操作數),並將其存儲(目標操作數)。源操作數是用處理器的一種尋址模式指定的內存地址(偏移量部分);目標操作數是一個通用寄存器。

實例:

; indirect addressing mode 
MOV EBX, label1 ; copy the address of label1 to EBX 
MOV [EBX], 100 ; store 100 at the location pointed to by EBX 

; using LEA 
LEA EBX, [label1] ; stores the effective address of label1 in EBX 
MOV [EBX], 100 ; store 100 at the location pointed to by EBX 

這兩者之間的區別是,LEA計算在運行時的有效地址,而MOV版本可解決在彙編時的有效地址。

+0

所以基本上你的說法只是輸入LEA然後打印屏幕的有效地址?是否有任何手工方法來做到這一點,使用電腦 –

相關問題