簡體   English   中英

MOVSX裝配說明如何工作?

[英]How does MOVSX assembly instruction work?

裝配指令MOVSX如何在以下示例中工作:

MOVSX ECX,BYTE PTR DS:[EDX]

在這種情況下,這是寄存器的狀態:

ECX = 0000000F   
EDX = 0012FD9F 

根據我的想法,它需要[EDX] = 9F的最后一個字節,將其移動到ECX然后符號擴展它以匹配16位= 0000009F。 但是,實際結果是00000016.有人可以幫我解釋我錯在哪里嗎?

這部分是正確的。 然而:

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

對於意外結果,這意味着在存儲器地址1 0x12FD9F處找到字節0x16


筆記:

  • 此處不需要段覆蓋前綴DS: [EDX]自動指DS

1 “內存地址”指的是虛擬或物理內存

許多Intel / 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 [... address ...]的簡寫。 (2)“DS:”前綴,表示它在數據段中。 寄存器操作數沒有這樣的段前綴。 (3)“BYTE PTR” - 表示“取'DS:[EDX]'指定的存儲器地址,並將其解釋為引用存儲器中的8位字節”。

我懷疑你真正想要的是什么

MOVSX ECX,DL

“DL”是32位寄存器EDX的低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,......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM