2017-01-09 3 views
-2

J'essaye de créer une fonction qui obtient un paramètre en hexadécimal et un char * et j'essaye de transformer le paramètre en chaîne, puis de l'ajouter au char *. Ceci est mon code:Comment convertir un entier en chaîne dans l'assembly 8086

wordToString PROC 
    push bp     
    mov bp,sp 

    xor cx,cx 
    mov bx, 10 

    loop1: 
    mov dx, 0  
    mov ax, [bp+6] 
    div bx 

    mov [bp+6][cx], dx 
    call print_al_chr 

    inc cx 
    cmp cx,4 
    jle loop1 


    mov sp,bp 
    pop bp 
    ret 2 


wordToString ENDP 

main: 
    lea dx, array 
    mov ax, num1 

    push dx 
    push ax 

    call wordToString 
+3

Vous avez oublié de décrire votre problème. De plus, vous n'avez pas commenté votre code et vous n'avez pas utilisé de débogueur. Enfer, vous n'avez même pas corrigé les erreurs de syntaxe. – Jester

+0

J'ai un problème et j'ai besoin de votre aide pour le réparer. Je ne sais pas quelles sont mes erreurs de syntaxe. @Jester – Nathan1982

+3

il n'y a pas de mode d'adressage avec '[bp + 6] [cx]'. Ce code est-il réellement assemblé? – fuz

Répondre

1
mov ax, [bp+6] 

Le paramètre num1 a été poussé dernier et est donc plus proche de l'adresse de retour sur la pile disponible à [bp+2]. Par conséquent vous devez écrire mov ax, [bp+4]
Aussi vous récupérez cette valeur dans la boucle et ainsi vous finirez avec 5 divisions identiques. Déplacez-le à avant la boucle et assurez-vous de ne pas modifier AX autre que par l'instruction div.


ret 2 

Tu as poussé 2 mots sur la pile, et donc vous devez supprimer 4 octets lors du retour. Ecrire ret 4


mov [bp+6][cx], dx 

Cela ne peut pas être une instruction valide!
Vous devez récupérer le pointeur sur le tableau avant en démarrant la boucle puis en incrémentant cette valeur dans la boucle.

;Before the loop 
mov di, [bp+6] 
... 
;Within the loop 
mov [di], dl   <<< Use DL, a byte in the range [0,9] 
inc di 
... 
inc cx 
cmp cx,4 
jle loop1    <<< Does 5 iterations because of JLE 
         <<< For 4 iterations you would use JL