2017-01-20 1 views
-1

Ich habe diesen ASM-Code und ich brauche Hilfe erklären, vor allem das Makro. Ich habe versucht, ein ASM zu C-Demontage-Tool, aber konnte es nicht mit mehreren Dateien arbeiten und die anderen waren weit über mein Budget.
macro.inc:Erklären einige ASM

pokazvane_cifra_dl macro 

push ax 
push dx

ad dl,30h 
mov ah, 02h 
int 21h 

pop dx 
pop ax 
endm 

exit macro 

mov ah,4ch 
int 21h 
endm 

pokazvane_znak_dl macro nomer_znak 

push ax 
push dx 
mov dl, nomer_znak 
mov ah,02h 
int 21h 
pop dx 
pop ax 

endm 

eho_al macro 
push ax 
mov ah, 02h 
int 21h 
pop ax 

endm 

program.asm:

include macro.inc 

.model small .stack 100h .data .code start: mov cx,5 povtori1: mov ah,01h int 21h mov ah,0h push ax loop povtori1 pokazvane_znak_dl 10d pokazvane_znak_dl 13d

mov cx, 5 povtori2: pop dx mov ah, 02h int 21h loop povtori2 exit end start

Jedwedes Hilfe geschätzt wird.

+1

** Das ** Makro? Es gibt 4 ... welche? Haben Sie eine DOS-Interrupt-Referenz konsultiert? – Jester

+0

Ist dies Ihre Muttersprache? Sie scheinen ziemlich erklärende Namen zu sein, was kannst du nicht verstehen? –

+0

@Jester So hart, wie ich sehe, kann ich nur sehen 3. – tofro

Antwort

3

pokazvane_cifra_dl macro: zeigt den Wert dl+48 als ASCII-Zeichen an.

Wenn dl ist Wert 0-9, wird es zeigt die nach ASCII Ziffer '0'-'9', so dass der Grund, warum der Name des Makro so etwas wie „Anzeigestelle“ ist (obwohl Sie auch mit ihn zum Beispiel nennen dl = 40 und es wird ASCII char angezeigt 'X').


exit macro: kehrt zu DOS Steuerung zurück (die gesamte Quelle ist DOS-Plattform targetted, dh 16-Bit-Real-Mode-x86-Assembler mit int 21h für Systemdienste verwendet werden, dh muss DOS-ähnliches Betriebssystem zu arbeiten.).


pokazvane_znak_dl macro: ist leichte Abwandlung der ersten, diesmal ein ASCII-Zeichen, wie pokazvane_znak_dl 'X' Anzeige 'X' anzuzeigen.


eho_al macro: tut Display ASCII-Zeichen aus dl. Nicht sicher, warum der Name eho_al sagt, während es al überhaupt nicht verwendet, stattdessen würde es den Wert in al zerstören, wenn es push/pop ax um die int 21h nicht tun würde.


Der Code selbst:

  • 5 Zeichen gelesen werden (ASCII) von Eingang und push sie auf dem Stapel

  • Anzeige zwei Zeichen 10 und 13 „neue Zeile zu erstellen "(Die richtige Reihenfolge in DOS ist 1310, die andere Möglichkeit).

  • dann werden diese 5 Zeichen einzeln nacheinander vom Stapel ausgegeben und auf dem Bildschirm angezeigt.

  • Exits zu DOS.

ich nicht überprüfen, dass es keine Fehler im Code, aber wenn es fehlerfrei ist, dann sollte die Ausgabe wie folgt aussehen:

$prompt> exe.exe 
    abcde 
    edcba$prompt> 

Ich bin nicht sicher, wo die DOS Prompt wird nach der Ausführung landen, ob DOS zusätzliche neue Zeile einfügen wird, oder es wird landen, wie ich es oben vorgestellt habe. Der erste "abcde" wird vom Benutzer eingegeben, der zweite wird durch den Code angezeigt.


EDIT: I, die Push + pop in Schleifen für die Eingabe vergessen/Ausgabe wird die Eingabe "string" umzukehren, wie Stapel ist LIFO (Last In First Out) Art der queue/Behälters (I noch hat sich nicht darum gekümmert, es wirklich zu kompilieren und auszuführen, also falls du wirklich 100% antwortest, was der Code tut, führe ihn aus.

+0

Vielen Dank, du bist ein Lebensretter. – 7h3Ph3n0m