2017-01-20 1 views
-1

J'ai ce code ASM et j'ai besoin d'aide pour l'expliquer, principalement la macro. J'ai essayé un outil de désassemblage ASM to C, mais je n'ai pas réussi à l'utiliser avec plusieurs fichiers et les autres étaient bien au-dessus de mon budget.
macro.inc:Explication de certains 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

Toute aide sera appréciée.

+1

** La macro **? Il y a 4 comme ... lequel? Avez-vous consulté une référence d'interruption DOS? – Jester

+0

Est-ce votre langue maternelle? Ils semblent assez explicatifs, que ne comprenez-vous pas? –

+0

@Jester Aussi fort que je regarde, je ne peux voir 3. – tofro

Répondre

3

pokazvane_cifra_dl macro: affiche la valeur dl+48 en tant que caractère ASCII.

Si dl est la valeur 0-9, il affichera le ASCII selon chiffres '0'-'9', de sorte que la raison pour laquelle le nom de macro est quelque chose comme « affichage chiffres » (mais vous pouvez aussi l'appeler avec par exemple dl = 40 et il affichera ASCII char 'X').


exit macro: retourne le contrôle de retour à DOS (toute source est DOS-plate-forme ciblée, à savoir l'assemblage x86 en mode réel 16 bits avec int 21h utilisé pour les services système, à savoir des besoins du système d'exploitation DOS comme au travail.).


pokazvane_znak_dl macro: est légère variation sur la première, cette fois-ci affichant un caractère ASCII, comme pokazvane_znak_dl 'X' pour afficher 'X'.


eho_al macro: est-caractères ASCII d'affichage de dl. Pas sûr pourquoi le nom dit eho_al, alors qu'il n'utilisera pas al du tout, à la place, il détruirait la valeur en al, si elle ne ferait pas push/pop ax autour de la int 21h.


Le code lui-même:

  • lira 5 caractères (ASCII) d'entrée, et les push sur la pile

  • afficher deux caractères 10 et 13 pour créer « nouvelle ligne "(la séquence correcte dans DOS est 1310, dans l'autre sens).

  • puis il sort ces 5 caractères un par un en arrière de la pile et affiche chacun sur l'écran.

  • quitte à DOS.

Je n'ai pas vérifié il n'y a aucun bug dans le code, mais si il est sans bug, la sortie devrait ressembler à:

$prompt> exe.exe 
    abcde 
    edcba$prompt> 

Je ne sais pas où le DOS l'invite se posera après l'exécution, que DOS insérera une nouvelle ligne supplémentaire, ou atterrira comme je l'ai imaginé ci-dessus. Le premier "abcde" est entré par l'utilisateur, le second est l'affichage effectué par le code.


EDIT: oublié que poussoir + pop dans les boucles pour l'entrée/sortie sera efficacement inverser l'entrée "string", comme pile est LIFO (Last In First Out) Type de file d'attente/container (I toujours n'a pas pris la peine de vraiment le compiler et l'exécuter, donc au cas où vous auriez vraiment besoin de 100%, répondez à ce que le code fait, exécutez-le).

+0

Merci beaucoup, vous êtes un sauveur de la vie. – 7h3Ph3n0m