2012-04-02 7 views
0

Ich möchte etwas Einfaches in Assemblersprache machen.
addieren Sie zwei Zahlen, und drucken Sie das Ergebnis auf dem Bildschirm.Ist dieser Code korrekt (Nummer plus Nummer, dann drucken Sie das Ergebnis)

ich diesen Code tat ohne Fehler

.Model SMALL 
.Stack 100h 

.Code 
start: 
    MOV ax, 10 
    ADD ax, 5 
    MOV ah, 02h 
    INT 21h 

    MOV ah, 01h 
    INT 21h 

    MOV ah, 4ch 
    INT 21h 

end start 

Nach kompilieren Sie den Code, sagt mir ein seltsames Zeichen.


Modifiziert:

MOV dl, 10 
ADD al,5 
MOV dl, al 

MOV ah,02h 
INT 21h 

aber immer noch ein seltsames Zeichen drucken Ich weiß nicht, was kann ich Nummer auf dem Bildschirm drucken tun

Antwort

2

Ja, Sie wird höchstwahrscheinlich Erhalte ein seltsames Zeichen, weil int 21/ah = 02 verlangt, dass das zu druckende Zeichen im Verzeichnis dl liegt und du nichts mit dl ausgefüllt hast.

Sie wollen den Wert mit etwas übertragen, wie:

mov ax, 10 
add ax, 5 

push ax    ; these are the two new lines. 
pop dx 

mov ah, 02h 

jedoch bedenken, dass, auch wenn Sie Übertragung den Wert al-dl tun , Zeichennummer 15 kann nicht sein, was du erwartest. 15 ist eines der ASCII-Steuerzeichen und ich bin mir nicht sicher, was die DOS-Interrupts für sie ausgeben werden.

Wenn Sie die Ziffern 15 drucken möchten, müssen Sie zwei Anrufe, eine mit dl = 31h und die zweite mit dl = 35h (die beiden ASCII-Codes für die 1 und 5 Zeichen).

Wenn Sie wissen möchten, wie man eine Zahl in einem Register nimmt und die Ziffern für diese Nummer in lesbarer Form ausgibt, gibt es einen Pseudocode in an earlier answer of mine.

Von dieser Antwort haben Sie die Pseudo-Code:

val = 247 

    units = val 
    tens = 0 
    hundreds = 0 
loop1: 
    if units < 100 goto loop2 
    units = units - 100 
    hundreds = hundreds + 1 
    goto loop1 
loop2: 
    if units < 10 goto done 
    units = units - 10 
    tens = tens + 1 
    goto loop2 
done: 
    if hundreds > 0:     # Don't print leading zeroes. 
     output hundreds 
    if hundreds > 0 or tens > 0: 
     output tens 
    output units 
    ;; hundreds = 2, tens = 4, units = 7. 

Jetzt müssen Sie, dass in x86-Assembler übersetzen. Beginnen wir mit dem gewünschten Wert in ax starten:

mov ax, 247     ; or whatever (must be < 1000) 
    push ax      ; save it 
    push dx      ; save dx since we use it 

    mov dx, 0     ; count of hundreds 
loop1: 
    cmp ax, 100     ; loop until no more hundreds 
    jl fin1a 
    inc dx 
    sub ax, 100 
    jmp loop1 
fin1a: 
    add dx, 30h     ; convert to character in dl 
    push ax      ; save 
    mov ah, 2 
    int 21h      ; print character 
    pop ax      ; restore value 

    ; now do tens and units the same way. 

    pop dx      ; restore registers 
    pop ax 

Nun, da Codesegment (ungeachtet etwaiger Fehler aufgrund der Tatsache, es ist eine Weile her, seit ich Montage tat) aus der Hunderter-Stelle gedruckt werden soll und lassen Axt nur mit den Zehn und Einheitsziffer.

Es sollte eine einfache Angelegenheit sein, die Funktionalität noch zweimal zu duplizieren, um die Zehner- und Einheitenplätze zu erhalten.

+0

Danke, aber können Sie meinen Code mit Korrektur neu schreiben. –

+0

@Lion, siehe das Update. – paxdiablo

+0

Leider ist das Problem weiterhin vorhanden, nachdem Sie Ihren Code angewendet haben. –

Verwandte Themen