Rozšíření znaménka

Pokud je 32bitové celé číslo se signedem záporné, jeho nejvyšší bit se rovná jednomu. Pokud je toto 32bitové celé číslo se znaménkem přetypováno na 64bitové číslo, mohou být vysoké bity nastaveny na nulu (což zachovává číslo jako neznaménkové a jeho hexadecimální hodnotu) nebo vysoké bity mohou být nastaveny na jedničku (což zachovává jeho znaménkovou hodnotu). Druhá situace se nazývá rozšíření znaménka.

Ladicí nástroj se řídí různými pravidly pro rozšíření znaménka ve výrazech MASM, ve výrazech jazyka C++ a při zobrazení čísel.

Rozšíření znaménka ve výrazech MASM

Za určitých podmínek se čísla automaticky prodlužují vyhodnocovačem výrazů MASM. Rozšíření znaménka může mít vliv pouze na čísla od 0x80000000 do 0xFFFFFFFF. To znamená, že rozšíření znaménka ovlivňuje jenom čísla, která lze zapsat v 32 bitech s vysokým bitem rovnajícím se 1.

Číslo 0x12345678 vždy zůstane 0x00000000`12345678, když ho ladicí program považuje za 64bitové číslo. Pokud se 0x890ABCDE naopak považuje za 64bitovou hodnotu, může zůstat 0x00000000`890ABCDE nebo vyhodnocovač výrazů MASM může rozšířit znaménko na 0xFFFFFFFF`890ABCDE.

Číslo od 0x80000000 do 0xFFFFFFFF je prodlouženo na základě následujících kritérií:

  • Číselné konstanty se nikdy signálně nerozšiřují v uživatelském režimu. V režimu jádra je číselná konstanta rozšířena znaménkem, pokud neobsahuje znak krátce ( ` ) před nižšími bajty. V režimu jádra jsou například šestnáctková čísla EEAA1122 a 00000000EEAA1122 rozšířena, ale 00000000`EEAA1122 a 0`EEAA1122 nejsou.

  • 32bitový registr je v obou režimech rozšířený.

  • Pseudoregistry se vždy ukládají jako 64bitové hodnoty. Při vyhodnocování se neprodlouží. Pokud je pseudoregistr přiřazena hodnota, výraz, který se používá, se vyhodnotí podle standardních kritérií jazyka C++.

  • Jednotlivá čísla a registry ve výrazu mohou být prodloužena s rozšířením znaménka, ale při vyhodnocování výrazu nejsou žádné jiné výpočty rozšířeny znaménkem. V důsledku toho můžete pomocí následující syntaxe maskovat vysoké bity čísla nebo registrovat.

    ( 0x0`FFFFFFFF & expression )
    

Rozšíření znaménka v C++ výrazech

Když ladicí program vyhodnotí výraz jazyka C++, použijí se následující pravidla:

  • Registry a pseudoregistry se nikdy nepodepisují.

  • Se všemi ostatními hodnotami je zacházeno stejně jako s hodnotami jejich typu v C++.

Zobrazení Sign-Extended a 64bitových čísel

Kromě 32bitových a 16bitových registrů se všechna čísla ukládají interně v ladicím programu jako 64bitové hodnoty. Pokud však číslo splňuje určitá kritéria, ladicí program ho zobrazí jako 32bitové číslo ve výstupu příkazu.

Debugger používá následující kritéria k zobrazení čísel:

  • Pokud jsou vysoké 32 bitů čísla nulami (to znamená, že pokud je číslo z 0x00000000'000000000 až 0x00000000'FFFFFFFF),zobrazí ladicí program číslo jako 32bitové číslo.

  • Pokud jsou horní 32 bity čísla všechny jedničky a nejvyšší bit dolních 32 bitů je také jedna (to znamená, pokud je číslo od 0xFFFFFFFF`80000000 do 0xFFFFFFFF`FFFFFFFF), ladicí program předpokládá, že číslo je 32bitové číslo rozšířené znaménkem a zobrazí ho jako 32bitové číslo.

  • Pokud předchozí dvě podmínky neplatí (to znamená, že pokud číslo pochází z 0x00000001'000000000 až 0xFFFFFFFF'7FFFFFFF) zobrazí ladicí program číslo jako 64bitové číslo.

Vzhledem k těmto pravidlům zobrazení, když je číslo zobrazeno jako 32bitové číslo v rozsahu od 0x80000000 do 0xFFFFFFFF, nemůžete ověřit, zda jsou vyšších 32 bitů všechny jedničky nebo všechny nuly. Chcete-li rozlišovat mezi těmito dvěma případy, je nutné provést další výpočet čísla (například maskování jednoho nebo více vysokých bitů a zobrazení výsledku).

Viz také

Čísla a operátory MASM

Čísla a operátory jazyka C++

Výrazy MASM vs. výrazy C++

Příklady smíšených výrazů