Frage zu Datentyp
-
Hallo,
Assembler: MASM 6.14.8444
Betriebssystem: Windows 7 Pro 64 BitIch habe gerade mal mit Datentyp etwas rumexperimentiert.
var db 0FFFFFFFFh , 0 <-- Lässt sich ohne Probleme Assemblieren wieso ?
var db 0EEEEEEEEh , 0 <-- Fehler:
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997. All rights reserved.
Assembling: prog.asm
prog.asm(26) : error A2071: initializer magnitude too large for specified siz
e
_
Assembly Errorvar DWORD 0EEEEEEEEh , 0 geht logischerweise ja DWORD = 32 Bit
Wieso lässt sich das hier Assemblieren o_O var db 0FFFFFFFFh , 0
db = 1 Bytemov ebx, dword ptr [var ] <-- Danach hat ebx denn den Wert: 000000FFh
Zählt die Variable irgendwie wieder von vorne oder so los ?
Wenn man in C++ einem int Datentyp ja z.b. auch eine zu Hohe Zahl gibt dann wird der Wert ja z.b. negativ.
.486 .model flat, stdcall option casemap :none include \masm32\include\windows.inc include \masm32\include\kernel32.inc includelib \masm32\lib\kernel32.lib include \masm32\include\masm32.inc includelib \masm32\lib\masm32.lib include \masm32\include\user32.inc includelib \masm32\lib\user32.lib .data ;var dword 0FFFFFFFFh , 0 var db 0FFFFFFFFh , 0 .code start: invoke MessageBox , 0 , addr z1 , addr z1 , 0 xor eax,eax xor ebx,ebx mov ebx, dword ptr [var ] mov al, byte ptr [var ] invoke Sleep , 1000 invoke ExitProcess , 0 end start
-
MASM arbeitet mit 32Bit Konstanten - intern mit int64: d.h. alle Konstanten werden zunächst als 32Bbit Wert eingelesen und anschließend unter Berücksichtigung des Vorzeichen auf 64 Bit erweitert. Darauf hin wird die Zahl mit dem durch den Datentyp vorgegebenen Wertebereich abgeglichen.
0ffffffffh wird also als -1 interpretiert, was sich durchaus in einem Byte kodieren lässt.
-
Aber FF ist doch Dezimal 255.
Wie soll dann FF in Dezimal -1 sein ?
-
Vorzeicheninterpretiert sind alle Binär-Zahlen mit einer 1 vorne negativ.
1111 1111 -> FF
0111 1111 -> 7F
1000 0000 -> 80
-
Stichwort Zweierkomplement. Der Wikipedia-Artikel zum Integer-Datentyp ist da sicher eine lohnende Lektuere:
http://de.wikipedia.org/wiki/Integer_(Datentyp)