假設在裝配有該指令NASM有誰知道如何計算有效地址
MOV EAX, [label1] ; label1 is at location 0x00D5A360
你如何計算出有效的地址是吧^上面的位置。
我知道事實上尋址模式是直接的。
假設在裝配有該指令NASM有誰知道如何計算有效地址
MOV EAX, [label1] ; label1 is at location 0x00D5A360
你如何計算出有效的地址是吧^上面的位置。
我知道事實上尋址模式是直接的。
在nasm中label
指的是標籤的地址,而[label]
檢索存儲在那裏的值。所以,你可以這樣做:
mov eax, label1 ; eax <- 0x00D5A360
或使用多功能lea
(加載有效地址):
lea eax, [label1] ; eax <- 0x00D5A360
或者你問如何彙編確定有效的地址?因爲這是由彙編程序,可選的鏈接器和加載程序組合處理的。通常你的代碼將編譯成一箇中間對象格式,其中relocations和鏈接器或加載器將處理爲您計算label1
的有效地址。
以及即時要求是什麼方法來計算從彙編器的有效地址,例如我發佈的示例行 MOV EAX,[label1]; label1位於地址0x00D5A360 現在有效地址是:0x00d5a360 –
@Shawnricshawnawic:那麼我的答案的第二個是相關的。根據nasm的環境/輸出格式,它可以是靜態確定的(可以通過'ORG'指令來影響這一點),也可以在鏈接時(使用外部符號)或運行時(再次使用外部符號)。 – user786653
完美的感謝我明白我也學到了一種新技術「lea」LOAD EFFECTIVE ADDRESS誰會想到LOL非常感謝你,我想我可以從這裏處理它:) –
從「英特爾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
版本可解決在彙編時的有效地址。
所以基本上你的說法只是輸入LEA然後打印屏幕的有效地址?是否有任何手工方法來做到這一點,使用電腦 –
我對納斯姆不熟悉。在MIPS彙編程序中,跳轉到標籤的命令使用相對值 - 即當前行與標籤所在行之間的行數。儘管NASM看起來與簡單的MIPS完全不同,但我甚至不知道MOV命令對標籤的作用。 – melak47
沒有馴服! 32位數(0x00D5A360)作爲指令的第二部分** MOV EAX **直接指向內存位置。 –