2012-03-29 19 views
1

Ich habe die folgende Zuordnung:Rechner in Assembly

Schreiben Sie ein komplettes 8086-Programm, um die Funktionen des Rechners durchzuführen: ADD/SUB/DIV/MUL. Wenn der Benutzer "=" drückt, sollte Ihr Programm das Ergebnis anzeigen. Nur die Zahlen von 0-9 werden eingegeben.

ones db ? 
    tens db ? 

    mov ah,1 
    int 21h 
    add al,30H 
    mov tens, al 
    mov ah,1  
    int 21H 
    mov dl,al 
    cmp dl, '+' 
    je addition 

addition: 
    mov ah,1  
    int 21h 
    mov bl,al 
    mov ones,al 

Ich habe es zu tun, indem 30h zu jeder Nummer Zugabe dann subtrahiert wird. Kann mir jemand erklären, wie ich das machen kann?

+0

Hausaufgaben sollten als Hausaufgabe getaggt werden :) – DipSwitch

+1

_Ich muss es tun, indem ich 30h zu jeder Zahl hinzufüge, dann Subtrahieren kann mir jemand es erklären? _ ← Etwas sagt mir, dass Sie diesen Code nicht geschrieben haben. – ninjalj

Antwort

2

0x30 ist das 0-Zeichen in ASCII. Wenn Sie also eine Zahl zwischen 0-9 drucken möchten, müssen Sie 0x30 zum Wert hinzufügen, um es zu einem '0'-Zeichen zu machen. Wenn Sie vom Terminal gelesen würden Sie 0x30 anstelle von 0 lesen also, wenn Sie mit ihm machen Berechnung wollen würden Sie 0x30 abziehen müssen eine ‚0‘ auf den Wert 0

http://en.wikipedia.org/wiki/ASCII

+0

oh lol, ich bin neu hier ,, Aber danke :) – lana

+1

@lana, wenn dies Ihre Frage beantwortet, sollten Sie auf das Häkchen daneben klicken. –

1

Versuchen Schreiben konvertieren es in C oder einer anderen Sprache (verwende keine C-Bibliotheken für den Großteil des Codes, nur einfache Sprache).

Ich nehme an, dass Sie ASCII-Werte aufnehmen und ASCII-Werte ausgeben?

Blick auf eine ASCII-Diagramm ist die ASCII für 0 0x30, die auch 48 dezimal oder binär 0b00110000 1 0x31 ist, 2 ist 0x32, und so weiter, in binär:

0 0b00110000 
1 0b00110001 
2 0b00110010 
3 0b00110011 
4 0b00110100 
5 0b00110101 
6 0b00110110 
7 0b00110111 
8 0b00111000 
9 0b00111001 

Wenn Sie wollten um die Zahlen 9 und 8 hinzuzufügen, möchten Sie wahrscheinlich 0x09 und 0x08 in Ihren Registern nicht 0x39 und 0x38. 0x09 + 0x08 = 0x11 0x39 + 0x38 = 0x71

0x11 0b00010001 
0x71 0b01110001 

Es könnte schwierig sein, zuverlässig die richtigen Bits aus dem Ergebnis zu extrahieren, wenn Sie von ascii, bevor irgendetwas zu tun konvertieren nicht. nicht schlecht mit Zusatz, du könntest dich durch deinen Weg hacken, aber in die Multiplikation kommen, usw., es könnte weniger schön sein. Sie müssen das selbst herausfinden.

Dann müssen Sie aus dem binären Ergebnis zurück zu ASCII, ich nehme an, Sie möchten das Ergebnis in ASCII drucken?

Wie erhalten Sie von 0x11, die 17 Dezimal zu Ascii 0x31, 0x37? Wenn dich jemand fragt, wie viele Füße in 78 Zoll sind, wie lautet die Antwort? Du beginnst, indem du die Füße durch 12 dividierst, rechts, du bekommst 6 mit einem Rest von 6, was 6 Fuß 6 Zoll entspricht. Wie viele Stunden, Minuten, Sekunden sind in 4000 Sekunden? 4000/3600 = 1 Rest 400, 400/60 = 6 Rest 40, 1:06:40. Und wenn ich fragen sollte, ob ich die Zahl 123 habe, wie extrahiere ich die Hunderter, Zehner und Einsen mathematisch (so dass ich jedem 0x30 hinzufügen und sie als ASCII ausdrucken kann).

So Zugabe von 9 und 8 Sie wahrscheinlich 0b00111001 bekommen und 0b00111000 und ein Pluszeichen und ein Gleichheitszeichen als Eingänge, müssen Sie 0x00111001 in 0x00001001 und 0x00111000 in 0x00001000 drehen, bevor die Zugabe dann drehen Sie das Ergebnis 0x00010001 in 0x00000001 tun (Zehner) und 0x00000111 (Einsen) und dann etwas tun, um vor dem Ausdrucken 0x00000001 in 0x00110001 (Zehner) (ASCII) und 0x00000111 in 0x00110111 (Einsen) (ASCII) zu ändern.