Jel kiterjesztés

Ha egy 32 bites aláírt egész szám negatív, a legmagasabb bitje egynek felel meg. Ha ezt a 32 bites aláírt egész számot 64 bites számra öntötték, a nagy bitek nullára állíthatók (megőrizve a szám alá nem írt egész és hexadecimális értékét), vagy a nagy bitek beállíthatók egyre (megőrizve a szám aláírt értékét). Az utóbbi helyzet neve jelbővítmény.

A hibakereső a MASM-kifejezésekben, a C++ kifejezésekben és a számok megjelenítésekor különböző szabályokat követ a jelkiterjesztésre.

Előjel-bővítés a MASM-kifejezésekben

Bizonyos feltételek mellett a MASM-kifejezés kiértékelője automatikusan aláírja a számokat. A jelkiterjesztés csak a 0x80000000 és a 0xFFFFFFFF közötti számokat befolyásolhatja. Ez azt jelzi, hogy a jelkiterjesztés csak azokat a számokat érinti, amelyek 32 bitben írhatók, és a nagy bit értéke 1.

A 0x12345678 szám mindig 0x00000000 12345678 marad, amikor a hibakereső 64 bites számként kezeli. Másrészt, ha a 0x890ABCDE 64 bites értékként van kezelve, akkor megmaradhat 0x00000000`890ABCDE, vagy a MASM kifejezés-kiértékelő előjelkiterjesztést alkalmazhat, hogy 0xFFFFFFFF`890ABCDE legyen belőle.

A 0x80000000 és a 0xFFFFFFFF közötti szám a következő feltételek alapján van kiterjesztve:

  • A numerikus állandók soha nem lesznek kiterjesztve felhasználói módban. Kernel módban a numerikus állandót a rendszer kiterjeszti, kivéve, ha az alacsony bájtok előtt súlyos ékezetet ( ` ) tartalmaz. Kernel módban például a hexadecimális számok EEAA1122 és 00000000EEAA1122 előjellel vannak kiterjesztve, de 00000000EEAA1122 és 0EEAA1122 nincsenek.

  • A 32 bites regisztráció mindkét módban ki van terjesztve.

  • A pszeudoregisztrálások mindig 64 bites értékekként vannak tárolva. Kiértékeléskor nem történik előjel-bővítés. Ha egy pszeudoregisztráláshoz érték van rendelve , a használt kifejezés kiértékelése a standard C++ feltételek szerint történik.

  • A kifejezésekben szereplő egyes számok és regiszterek kiterjeszthetők, de a kifejezés kiértékelése során semmilyen más számítás nem lesz kiterjesztve. Ennek eredményeképpen maszkolhatja egy szám vagy regiszter magas bitjeit az alábbi szintaxissal.

    ( 0x0`FFFFFFFF & expression )
    

Előjeltoldás C++ kifejezésekben

Amikor a hibakereső kiértékel egy C++ kifejezést, a következő szabályok érvényesek:

  • A regiszterek és a pszeudoregisztrálások soha nem lesznek meghosszabbítva.

  • Minden más értéket pontosan úgy kezeljük, ahogyan a C++ a saját típusának megfelelő értékeket kezeli.

Sign-Extended és 64 bites számok megjelenítése

A 32 bites és a 16 bites regisztereken kívül a rendszer minden számot belsőleg tárol a hibakeresőben 64 bites értékként. Ha azonban egy szám megfelel bizonyos feltételeknek, a hibakereső 32 bites számként jeleníti meg a parancs kimenetében.

A hibakereső a következő feltételek alapján határozza meg a számok megjelenítésének módját:

  • Ha egy szám magas 32 bitje mind nullák (vagyis ha a szám a 0x00000000`00000000 és a 0x00000000`FFFFFFFF közötti), a hibakereső 32 bites számként jeleníti meg.

  • Ha egy szám magas 32 bitje mind egy, és ha az alacsony 32 bit közül a legmagasabb bit is egy (azaz ha a szám 0xFFFFFFFF'800000000-től 0xFFFFFFFF'FFFFFFFF-ig van), a hibakereső feltételezi, hogy a szám egy 32 bites jellel bővített szám, és 32 bites számként jeleníti meg.

  • Ha az előző két feltétel nem érvényes (azaz ha a szám 0x00000001'000000000-től 0xFFFFFFFF'7FFFFFFF-n keresztül van), a hibakereső 64 bites számként jeleníti meg a számot.

Ezen megjelenítési szabályok miatt, amikor egy szám 32 bites számként jelenik meg 0x80000000 és 0xFFFFFFFF között, nem tudja ellenőrizni, hogy a felső 32 bit mind egyes vagy mind nullák. A két eset megkülönböztetéséhez további számítást kell végeznie a számon (például el kell maszkolnia egy vagy több nagy bitet, és meg kell jelenítenie az eredményt).

Lásd még

MASM-számok és operátorok

C++ számok és operátorok

MASM-kifejezések és C++ kifejezések

Példák vegyes kifejezésre