3 Stimmen

Lesen einer Zahl mit INT 21h (DOS) & 8086 Assmebly

Ich muss dem Benutzer eine Nachricht zukommen lassen, in der er aufgefordert wird, eine Zahl zu schreiben, dann speichere ich diese Zahl und führe eine Operation damit durch. Nach der Suche in INT 21h habe ich dies gefunden:

INT 21h / AH=1 - read character from standard input, with echo, result is stored in AL.
if there is no character in the keyboard buffer, the function waits until any key is pressed. 

example:

    mov ah, 1
    int 21h

Das Hauptproblem ist, dass dies nur ein Zeichen liest und als ASCII darstellt Wenn ich also die Zahl "357" schreiben will lese ich sie als 3 , 5 , 7

und das ist nicht mein Ziel. Irgendwelche Ideen?

4voto

龚元程 Punkte 417

Wenn Sie es geschafft haben, die Benutzereingabe zu erhalten Setzen Sie den Zeiger in ESI (ESI = Adresse der Zeichenkette)

.DATA
myNumber BYTE "12345",0        ;for test purpose I declare a string '12345'

Main Proc
    xor ebx,ebx                ;EBX = 0
    mov  esi,offset myNumber   ;ESI points to '12345'

loopme:

    lodsb                      ;load the first byte pointed by ESI in al

    cmp al,'0'                 ;check if it's an ascii number [0-9]
    jb noascii                 ;not ascii, exit
    cmp al,'9'                 ;check the if it's an ascii number [0-9]
    ja noascii                 ;not ascii, exit

    sub al,30h                 ;ascii '0' = 30h, ascii '1' = 31h ...etc.
    cbw                        ;byte to word
    cwd                        ;word to dword
    push eax
    mov eax,ebx                ;EBX will contain '12345' in hexadecimal
    mov ecx,10
    mul ecx                    ;AX=AX*10
    mov ebx,eax
    pop eax
    add ebx,eax
    jmp loopme                 ;continue until ESI points to a non-ascii [0-9] character
    noascii:
    ret                        ;EBX = 0x00003039 = 12345
Main EndP

2voto

BlackBear Punkte 21476

Sobald Sie die Zeichenkette haben, müssen Sie sie in eine Zahl umwandeln. Das Problem ist, dass man dafür eine eigene Prozedur programmieren muss. Ich verwende normalerweise die folgende (allerdings in C geschrieben):

int strToNum(char *s) {
    int len = strlen(s), res = 0, mul = 0;
    char *ptr = s + len;

    while(ptr >= s)
        res += (*ptr-- - '0') * (int)pow(10.0, mul++);

    return res;
}

Hier ist die Erklärung. Zunächst einmal, *ptr-- - '0' erhält die ganzzahlige Darstellung einer Zahl (so dass '9' - '0' = 9 , dann dekrementiert er ptr so dass es auf das vorherige Zeichen zeigt. Sobald wir diese Zahl kennen, müssen wir sie auf eine Potenz von 10 erhöhen. Nehmen wir zum Beispiel an, dass die Eingabe "357" ist, dann sieht der Code folgendermaßen aus:

('7' - '0' = 7) * 10 ^ 0 =   7 +
('5' - '0' = 5) * 10 ^ 1 =  50 +
('3' - '0' = 3) * 10 ^ 2 = 300 = 
---------------------------------
                           357

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X