Frage zu Datentyp



  • Hallo,

    Assembler: MASM 6.14.8444
    Betriebssystem: Windows 7 Pro 64 Bit

    Ich 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 Error

    var DWORD 0EEEEEEEEh , 0 geht logischerweise ja DWORD = 32 Bit

    Wieso lässt sich das hier Assemblieren o_O var db 0FFFFFFFFh , 0
    db = 1 Byte

    mov 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)


Anmelden zum Antworten