如何在下面的例子中的彙編指令MOVSX工作:MOVSX裝配說明如何工作?
MOVSX ECX,BYTE PTR DS:[EDX]
在這種情況下,這裏有寄存器的狀態:
ECX = 0000000F
EDX = 0012FD9F
從我的想法,它需要[EDX] = 9F的最後幾個字節,將其移至ECX,然後將符號擴展爲匹配16位= 0000009F。但是,實際結果是00000016.有人可以幫助解釋我錯在哪裏嗎?
如何在下面的例子中的彙編指令MOVSX工作:MOVSX裝配說明如何工作?
MOVSX ECX,BYTE PTR DS:[EDX]
在這種情況下,這裏有寄存器的狀態:
ECX = 0000000F
EDX = 0012FD9F
從我的想法,它需要[EDX] = 9F的最後幾個字節,將其移至ECX,然後將符號擴展爲匹配16位= 0000009F。但是,實際結果是00000016.有人可以幫助解釋我錯在哪裏嗎?
這是部分正確的。但是:
BYTE PTR DS:[EDX]
獲得位於EDX中保存的地址的字節。該字節被複制到ECX
到最低有效字節中,其餘部分填充字節的符號。
對於您的意外結果,這意味着在內存地址 0x12FD9F
字節0x16
位於。
注:
DS:
是沒有必要在這裏。 [EDX]
自動參考DS
。「內存地址」指的是虛擬的還是這裏的物理內存
許多英特爾/ 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,...