2013-01-08 45 views
2

當我嘗試Linux上的Masm32:爲什麼mov [bx],ax工作,但mov [ax],bx(或mov [bl],al)不?

mov [ax], bx 

我得到以下錯誤:invalid effective address 同樣爲mov [al], bl或類似的東西。

,如果我嘗試

mov [bx], ax 

它的工作原理。那麼ebx的低位字節有什麼特別的地方,我怎樣才能完成mov [al], bl的行,或者只是交換bx,ax等兩個字節的內容。 ?

預先感謝任何有益的:)

+0

可能重複的(http://stackoverflow.com/questions/2809141/無效生效地址計算)簡短回答:並非所有寄存器都可以這樣使用。 –

回答

4

採用[bx]被稱爲「寄存器間接尋址模式」。在16位模式下,可以以這種方式使用以下寄存器:bx,bp,sidi

欲瞭解更多信息,請參閱The Register Indirect Addressing Modes

how can I accomplish something along the lines of mov [al], bl

這並不完全意義,因爲它將使用的al的8位值作爲地址,在這種情況下的地址是16位。如果你只是想的bl值進入al,那麼方括號是不必要的:[!無效的有效地址計算]

mov al, bl 
+0

但是,在32位和64位彙編中,[it * is * possible](http://ref.x86asm.net/coder.html#modrm_byte_32)。 – 2013-01-08 16:04:15

+2

@Tinctorius'mov [al],bl'不是** 32位或64位x86彙編中的有效指令,而不是16位x86彙編中的有效指令。但是,'mov [eax],bl'是有效的32位指令,'mov [rax],bl'是有效的x86-64指令。 – nrz

+0

非常真實:)如果這真的是OP想要的,'movzx ax,al'(或'movzx eax,al'或'movzx rax,al'),然後在'ax'和'bx'之間交換,然後'mov [bx],al'。 – 2013-01-08 16:13:36