2015-10-21 66 views
5

如何在下面的例子中的彙編指令MOVSX工作:MOVSX裝配說明如何工作?

MOVSX ECX,BYTE PTR DS:[EDX]

在這種情況下,這裏有寄存器的狀態:
ECX = 0000000F
EDX = 0012FD9F

從我的想法,它需要[EDX] = 9F的最後幾個字節,將其移至ECX,然後將符號擴展爲匹配16位= 0000009F。但是,實際結果是00000016.有人可以幫助解釋我錯在哪裏嗎?

回答

4

這是部分正確的。但是:

BYTE PTR DS:[EDX]獲得位於EDX中保存的地址的字節。該字節被複制到ECX到最低有效字節中,其餘部分填充字節的符號。

對於您的意外結果,這意味着在內存地址 0x12FD9F字節0x16位於。


注:

  • 的段覆蓋前綴DS:是沒有必要在這裏。 [EDX]自動參考DS

「內存地址」指的是虛擬的還是這裏的物理內存

1

許多英特爾/ AMD的x86指令是「modrm」格式提供 - 他們有兩個操作數,其中一個必須是一個寄存器,另一個寄存器或內存引用,其地址由指令編碼的modrm字節確定,可能還包括指令的後續字節,如sib(縮放索引字節) ,以及立即的常量/內存偏移量。還有一個可能的段前綴字節。

通常這些REG,REG/MEM指令,所述形式

rsrcdst += rsrc 
or 
    rsrcdst += Memory[ ... addressessing mode ...] 

但x86彙編代碼的不具有獨立的操作碼/指令助記符了reg,REG和reg,這些指令的MEM形式。在彙編程序中,通過彙編語法指示操作數是寄存器還是存儲器位置。

在這種情況下,彙編代碼是

MOVSX ECX,BYTE PTR DS:[EDX]

的指令操作碼是MOVSX。

目標操作數是寄存器ECX。

源操作數是「BYTE PTR DS:[EDX]」。這是一個內存引用有以下幾點:(1)圍繞「[EDX]」的方括號 - 方括號是Memory [...]的簡寫形式地址...]。 (2)「DS:」前綴,表示它在數據段中。寄存器操作數沒有這樣的段前綴。 (3)「BYTE PTR」 - 表示「採用由'DS:[EDX]'指定的存儲器地址,並將其解釋爲引用存儲器中的8位字節」。

我懷疑你真正想要的是

MOVSX ECX,DL 

「DL」是註冊EDX 32位的低8位的名稱。即DL = EDX.bits [7:0]。不幸的是,X86的彙編器通常不;噸接受語法像「EDX.bits [7:0]」(除非我寫他們),所以你必須知道子寄存器的歷史名稱:

AL = EAX.bits[7:0] 
AH = EAX.bits[15:8] 
AX = EAX.bits[15:0] 
EAX = 32 bit register that "covers" all of the above 

等上:BL,CL,DL,DI,...