2015-10-21 24 views
5

Bu nasıl aşağıdaki örnekte montaj talimatı MOVSX iş vermez: düşündüm kadarıyla
ECX = 0000000F
EDX = 0012FD9FMOVSX montaj talimatları nasıl çalışır?

: Burada kayıtları durumu Bu durumda

MOVSX ECX,BYTE PTR DS:[EDX]

vardır [EDX] = 9F'nin son baytlarını alır, ECX'e taşır ve ardından 16 bit = 0000009F ile eşleşecek şekilde genişletir. Ancak asıl sonuç 00000016'dır. Birisi neyi yanlış yaptığımı açıklayabilir mi?

cevap

4

Bu kısmen doğrudur. Bununla birlikte, EDX'da tutulan adreste bulunan bayt

BYTE PTR DS:[EDX]. Bu bayt en az anlamlı bayt içine ECX kopyalanır ve geri kalanı bayt işareti ile doldurulur. sizin beklenmedik bir sonuç için

, bu bellek adresinde 0x12FD9F bayt 0x16 bulunduğu anlamına gelir.


Notlar:

  • Segment geçersiz kılma Önek DS: burada gerekli değildir. [EDX] otomatik olarak DS anlamına gelir.

"bellek adresi" ya sanal veya Birçok Intel/AMD x86 talimatları "modrm" biçiminde mevcuttur

1

burada fiziksel bellek atıfta - onlar iki işlenen sahip bunlardan biri bir kayıt olmalı, diğeri bir kayıt olabilir veya adresi, kodlama komutunun modrm baytı ile ve muhtemelen talimatın müteakip baytları tarafından belirlenir, örneğin sib (ölçeklenmiş dizin baytı) ve anlık sabit/bellek kayması. Ve ayrıca olası bir segment önek bayt.

Genellikle bu reg, reg ve reg, bu talimatların Mem formları için ayrı opcodes/talimat anımsatıcılarını yok formda

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

Ama 86 derleme kod, reg, reg/mem talimatlar. Bir işlenenin bir kayıt veya bir hafıza yeri olup olmadığı, montajcısında, montaj sözdizimi ile belirtilir. Bu durumda

, derleme kod

MOVSX ECX, BYTE PTR DS geçerli: [EDX]

talimat işlemkodu MOVSX olduğunu.

Hedef işlenen ECX kaydıdır. Kaynak işleneni "BYTE PTR DS: [EDX]" şeklindedir. Bu bir bellek referansı birkaç şeyle belirtilmiştir: (1) "[EDX]" etrafında köşeli parantezler - köşeli parantezler Bellek için bir kısa fardır [...adres...]. (2) veri bölümünde olduğunu belirten "DS:" öneki. Kayıt işlenenlerin böyle bir segment öneki yoktur. (3) "BYTE PTR" - "DS: [EDX] 'ile belirtilen bellek adresini al ve bunu bellekte 8 bitlik bir bayt referans olarak yorumla" yazıyor.

Ben gerçekten bulmak istediğiniz

MOVSX ECX,DL 

"DL" 32 bit düşük 8 bit EDX kayıt için bir isimdir olduğunu sanıyorum. Yani DL = EDX.bits [7: 0]. Ne yazık ki, x86 montajcılar genellikle don; t gibi sözdizimi kabul "EDX.bits [7: 0]" (Onları ben yazdım sürece), sen alt kayıtları tarihsel isimlerini bilmek zorunda:

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 

ve böylece üzerinde: BL, CL, DL, DI, ...