Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Ketika bilangan bulat bertanda tangan 32-bit negatif, bit tertingginya sama dengan satu. Ketika bilangan bulat bertanda tangan 32-bit ini dilemparkan ke angka 64-bit, bit tinggi dapat diatur ke nol (mempertahankan bilangan bulat yang tidak ditandatangani dan nilai heksadesimal dari angka) atau bit tinggi dapat diatur ke satu (mempertahankan nilai angka yang ditandatangani). Situasi terakhir disebut ekstensi tanda tangan.
Debugger mengikuti aturan yang berbeda untuk ekstensi tanda dalam ekspresi MASM, ekspresi C++, dan saat menampilkan angka.
Ekstensi Tanda pada Ekspresi MASM
Dalam kondisi tertentu, angka secara otomatis diperpanjang tanda bitnya oleh evaluator ekspresi MASM. Ekstensi tanda tangan hanya dapat memengaruhi angka dari 0x80000000 melalui 0xFFFFFFFF. Artinya, ekstensi tanda tangan hanya memengaruhi angka yang dapat ditulis dalam 32 bit dengan bit tinggi sama dengan 1.
Angka 0x12345678 selalu tetap 0x00000000 12345678 ketika debugger memperlakukannya sebagai angka 64-bit. Di sisi lain, ketika 0x890ABCDE diperlakukan sebagai nilai 64-bit, nilai tersebut mungkin tetap 0x00000000`890ABCDE atau evaluator ekspresi MASM mungkin memperluas tanda ke 0xFFFFFFFF`890ABCDE.
Angka dari 0x80000000 hingga 0xFFFFFFFF diperluas berdasarkan kriteria berikut:
Konstanta numerik tidak pernah mengalami ekstensi tanda dalam mode pengguna. Dalam mode kernel, konstanta numerik diperluas tanda kecuali mengandung aksen grave ( ` ) sebelum byte rendah. Misalnya, dalam mode kernel, angka heksadesimal EEAA1122 dan 00000000EEAA1122 diperpanjang dengan tanda, tetapi 00000000`EEAA1122 dan 0`EEAA1122 tidak.
Register 32-bit diperluas di kedua mode.
Pseudo-register selalu disimpan sebagai nilai 64-bit. Penandaan tidak diperpanjang saat dievaluasi. Saat pseudo-register diberi nilai, ekspresi yang digunakan dievaluasi sesuai dengan kriteria C++ standar.
Angka individu dan register dalam ekspresi dapat diperpanjang tandanya, tetapi tidak ada perhitungan lain selama evaluasi ekspresi yang diperpanjang tandanya. Akibatnya, Anda dapat menutupi bit paling signifikan dari sebuah angka atau register dengan menggunakan sintaks berikut.
( 0x0`FFFFFFFF & expression )
Perluasan Tanda pada Ekspresi C++
Saat debugger mengevaluasi ekspresi C++, aturan berikut berlaku:
Register dan pseudo-register tidak pernah ditandatangani diperpanjang.
Semua nilai lain diperlakukan persis seperti C++ akan memperlakukan nilai jenisnya.
Menampilkan angka Sign-Extended dan bilangan 64-Bit
Selain register 32-bit dan 16-bit, semua angka disimpan secara internal dalam debugger sebagai nilai 64-bit. Namun, ketika angka memenuhi kriteria tertentu, debugger menampilkannya sebagai angka 32-bit dalam output perintah.
Debugger menggunakan kriteria berikut untuk menentukan cara menampilkan angka:
Jika angka 32 bit tinggi semuanya nol (artinya, jika angkanya dari 0x00000000'00000000 sampai 0x00000000'FFFFFFFFFF), debugger menampilkan angka sebagai angka 32-bit.
Jika 32 bit tinggi dari sebuah angka semuanya satu dan jika bit tertinggi dari 32 bit rendah juga satu (yaitu, jika angkanya dari 0xFFFFFFFF'80000000 hingga 0xFFFFFFFF'FFFFFFFF), debugger mengasumsikan angka tersebut adalah angka 32-bit yang diperluas tanda minus dan menampilkannya sebagai angka 32-bit.
Jika dua kondisi sebelumnya tidak berlaku (yaitu, jika angkanya dari 0x00000001'00000000 sampai 0xFFFFFFFF'7FFFFFFFFF) debugger menampilkan angka sebagai angka 64-bit.
Karena aturan tampilan ini, ketika angka ditampilkan sebagai angka 32-bit dari 0x80000000 hingga 0xFFFFFFFF, Anda tidak dapat mengonfirmasi apakah 32 bit tinggi semuanya adalah angka atau semua nol. Untuk membedakan antara kedua kasus ini, Anda harus melakukan komputasi tambahan pada angka (seperti menutupi satu atau beberapa bit tinggi dan menampilkan hasilnya).