2017-02-05 2 views
0

Ich habe dieses Assembler-Code, den ich habe in den letzten paar Tagen arbeiten. Es ist für eine Hausaufgabe von mir, die die Bedingungen hat, die Zeichen von 'A' bis 'J' aber mit einem Sternchen zwischen jedem Buchstaben ausdrucken sollten Ausgang: A * B * C * .... J *.Incrementieren CX Zähler in Assembly (TASM)

Die Grenzen dessen, was wir hinzufügen sollten, ist, dass wir nur dl ein Datencontainer nutzen können. Außerdem können wir nur Looping- und Sprungbedingungen verwenden.

Ich habe meine Arbeit größtenteils beendet, aber ich hatte ein Problem herauszufinden, warum mein Zähler cx nicht in meinem Code gut inkrementiert. Hier ist mein Code:

.model 
.code 
org 100h 
s: mov ax, 3 ; 
    int 10h  ; just clearing the screen 
    mov ah, 2 
    mov cx, 1 ; counter is just set to one for possible increment 
    mov dl, 'A' ; A is added to data container 
    int 21h  ; prints out A 
x: mov dl, '*' ; first asterisk is then added to container, replacing A 
    int 21h  ; asterisk is printed out A* 
    mov dl, 'A' ; asterisk is replace by A in the counter 
y: inc dl  ; 
    loop y  ; loops at y then increments container dl, A + 1-> B 
    int 21h  ; prints out container, A*B 
    inc cx  ; where the problem lies. Should increment but not 
    cmp dl, 'J' ; if the character in container is not above j, jumps to.. 
    jna x  ; ..where x is 
    int 20h  ; ends but doesnt due to infinite looping, container not reaching 'J' 
end s 

Wenn der Zuwachs funktioniert, was ich denke, passieren würde, ist, dass jedes Mal, wenn der Prozess x springt und läuft dann in einer Schleife y gegeben, dass cx erhöht wurde, wird es Schleife und erhöht die Container abhängig davon, wie viel der Zähler cx nach mehreren Inkrementen hält. Dies wird in den Behälter führen die Bedingung des Erhaltens über dem Buchstaben J.

Also das ist so ziemlich mein Problem zu erreichen. Vielen Dank im Voraus für jede Hilfe, die ich bekommen konnte.

+1

Vielleicht mit add anstelle von inc. addiere cx, 1 oder w.e der Befehl add ist. – Jerinaw

+0

Ich bekomme die Aufgabenbeschreibung nicht, was bedeutet "Beschränkung" auf "dl"? Sie verwenden 'cx' auch für Daten. Und auf jeden Fall, wenn Sie per-char Stream-Ausgabe tun, müssen Sie 'dl' durch' * 'Wert zu zerstören, und dann wieder auf den Buchstaben, so dass Sie definitiv etwas anderes für Daten verwenden müssen. Was genau ist die Begrenzung? Kein Speicherpuffer? Keine Stapelbenutzung? 'dh' kann nicht verwendet werden? Warum 'cx' kann? BTW, können Sie direkt in VRAM schreiben ohne 'int 21h'? : D Dann wäre es trivial sein: D (eigentlich nicht, würde mehr Register für Schreib ptr müssen: /) – Ped7g

+0

Ohhh, tut mir leid, dass ich denke, die Einschränkung, dass ich hätte sagen sollen, dass ich nicht den Wert dl speichern zu einem anderen Behälter. Es sollte zerstört werden, indem man '*' hinzufügt und es dann auf meine eigene Weise durch Schleifen oder Sprungbedingungen wiederherstellt. – Emanhero

Antwort

3

Es ist Inkrementieren ganz gut, wie Sie durch den Einsatz eines Debuggers sehen können. Das Problem ist, dass Sie einen loop Befehl haben, der CX dekrementiert, bis es Null ist. Daher erhöht wird immer CX 1.

Drücken vor loopCX zu stapeln und nach machen Pop-out, wenn Sie den Wert behalten möchten. Und nehmen Sie einen Debugger, um den Code selbst zu debuggen.

Oder da Sie nur DL von CX inkrementieren möchten, warum nicht einfach ADD DL, CL sagen und keine Schleifen verwenden?

+0

Danke. : D ich werde versuchen, stattdessen 'add' zu implementieren. – Emanhero