2017-12-21 9 views
1

Ich versuche, ein Programm zu machen, wo der Benutzer eine Eingabe eingeben muss, zum Beispiel: Hello World und erhalten eine Ausgabe: 'DLROw OLLEh'. Hier ist mein ProgrammMontage x86 Umkehrsatz Programm

org 100h 
include emu8086.inc 

.DATA 
    STR1 DB 0DH, 0AH, 'Input: $' 
    STR2 DB 0DH, 0AH, 'Output: $' 
    Nl DB 0Dh, 0Ah,'$' 


.CODE 
START: 
    MOV AX, @DATA 
    MOV DS, AX 


DISP: 
    LEA DX,STR1 
    MOV AH,09H 
    INT 21H 
    MOV CL,00 
    MOV AH,01H 


READ: 
    INT 21H 
    MOV BL, AL 
    PUSH BX 
    INC CX 
    CMP AL, 0DH 
    JZ DISPLAY 
    CMP AL, 'A'     ; < then A 
    JB NotALetter 
    CMP AL, 'Z'     ; > then Z 
    JA AGAIN     ; repeat again 
    JMP CONTINUE1 


AGAIN: 
    CMP AL, 'a'     ; < then a 
    JB NotALetter 
    CMP AL, 'z'     ; > then z 
    JA NotALetter  


CONTINUE1: 
    JMP READ 


DISPLAY: 
    LEA DX, STR2 
    MOV AH, 09h 
    INT 21H 
    LEA DX, NL 
    MOV AH, 09h 
    INT 21h 
    POP BX      ; pop enter key 


ANS: 
    MOV AH, 02h 
    POP BX      ; pop the character 
    CMP BL, 'a'     ; check if its in upper case 
    JB toLower     ; if yes then jmp to toLower 
    SUB BL, 32     ; if not in upper case then convert to upper case 
    JMP CONTINUE2 


toLower: 
    ADD BL, 32     ; convert to lower case 
    CMP BL, 20h 
    ;SUB BL, 32 


CONTINUE2: 
    MOV DL, BL 
    INT 21H 
    LOOP ANS 
    JMP EXIT     ; if everything is fine jmp to exit     


NotALetter:   
    printn 
    print "The input character is not a letter."  


EXIT: 
    hlt 


.EXIT 
END START 

ich jede Eingabe eingeben kann, aber sobald ich ein beliebiges Symbol eingeben, bin ich eine Nachricht bekommen, dass dies ein Symbol ist, dann Programm beendet, während ich die gleiche Ausgabe erhalten möchten, aber immer noch erlauben um ein Leerzeichen einzugeben. Ich bin wirklich neu in Assembly und außerdem habe ich, während ich versuchte, alles herauszufinden, noch mehr verloren.

Wenn ich JB NotALetter Kommentar und JA NotALetter, mein Raumzeichen wird @ wahrscheinlich, weil ich 20 mit der ASCII hex Nummer bin hinzufügen. Kann jemand bitte helfen, dieses Problem zu lösen?

+5

Umm, statt eine Fehlermeldung zu drucken, gehen Sie vielleicht zu 'CONTINUE2', so dass es unverändert weitergegeben wird? Haben Sie diesen Code selbst geschrieben? Du scheinst nicht zu verstehen, wie es funktioniert ... – Jester

+0

@Jester Du hast recht. Ich habe bereits vor einer Woche eine ähnliche Frage gestellt [link] (https://stackoverflow.com/questions/47706414/assembly-emu8086-reversing-a-string). Ich versuche herauszufinden, wie es funktioniert, aber ich verstehe einfach nicht, wie die Montage funktioniert. Im Grunde lerne ich, indem ich etwas mache und versage ... Danke für deine Zeit –

+0

Vielleicht verstehe ich die Frage nicht. Welchen Input haben Sie verwendet, welche Outputs haben Sie erwartet und welche Outputs haben Sie stattdessen bekommen? – interjay

Antwort

1

nur einen zusätzlichen Vergleich zu Ihrer toLower Methode hinzufügen wie folgt:

toLower: 
    CMP BL, 'A' 
    JL CONTINUE2 
    ADD BL, 32     ; convert to lower case 

kompletter Code:

org 100h 
include emu8086.inc 


.DATA 
    STR1 DB 0DH, 0AH, 'Input: $' 
    STR2 DB 0DH, 0AH, 'Output: $' 
    Nl DB 0Dh, 0Ah,'$' 


.CODE 
START: 
    MOV AX, @DATA 
    MOV DS, AX 


DISP: 
    LEA DX,STR1 
    MOV AH,09H 
    INT 21H 
    MOV CL,00 
    MOV AH,01H 


READ: 
    INT 21H 
    MOV BL, AL 
    PUSH BX 
    INC CX 
    CMP AL, 0DH 
    JZ DISPLAY 
    CMP AL, 'A'     ; < then A 
    JB CONTINUE1 
    CMP AL, 'Z'     ; > then Z 
    JA AGAIN     ; repeat again 
    JMP CONTINUE1 


AGAIN: 
    CMP AL, 'a'     ; < then a 
    JB CONTINUE1 
    CMP AL, 'z'     ; > then z 
    JA CONTINUE1  


CONTINUE1: 
    JMP READ 


DISPLAY: 
    LEA DX, STR2 
    MOV AH, 09h 
    INT 21H 
    LEA DX, NL 
    MOV AH, 09h 
    INT 21h 
    POP BX      ; pop enter key 


ANS: 
    MOV AH, 02h 
    POP BX      ; pop the character 
    CMP BL, 'a'     ; check if its in upper case 
    JB toLower     ; if yes then jmp to toLower 
    SUB BL, 32     ; if not in upper case then convert to upper case 
    JMP CONTINUE2 


toLower: 
    CMP BL, 'A' 
    JL CONTINUE2 
    ADD BL, 32     ; convert to lower case 


CONTINUE2: 
    MOV DL, BL 
    INT 21H 
    LOOP ANS 
    JMP EXIT     ; if everything is fine jmp to exit     


;NotALetter:  
; printn 
; print "The input character is not a letter."  


EXIT: 
    hlt 


.EXIT 
END START 

Eingang Hello World, Ausgang DLROw OLLEh

Auch Sie nicht wirklich brauche NotALetter Methode wie Sie bemerken können, habe ich gerade auskommentiert.

2

ich jede Eingabe, aber sobald ich ein beliebiges Symbol eingeben eingeben kann, bin ich eine Nachricht bekommen, dass dies ein Symbol ist, dann Programm beendet, während ich mag ein die gleiche Leistung zu bekommen, aber immer noch erlauben, einzutreten Leerzeichen.

Als OP möchte den Raum erfassen, ohne mit Symbol Nachricht zu verwirren. Dies kann mit dem folgenden erreicht werden:

Im LESEN Label, nachdem Sie vergleichen für diese Taste Add eingeben:

CMP AL, ' '     ; compare for space 
JZ CONTINUE1 

Und im AM Label, nachdem Sie bx Pop hinzufügen, um diese:

CMP BL, ' '     ; if equal to space 
JZ CONTINUE2    ; then print it by going to CONTINUE2 label