2016-06-05 1 views
1

J'utilise l'assembly 8086 16BIT avec tasm assembler. J'essaie d'imprimer une variable int, et pour cela, j'ai besoin de convertir ma variable contant en chaîne. J'ai essayé de construire une procédure qui le fait sans succès. c'est complètement faux et ne fonctionne pas.Convertir un entier en chaîne 8086 tasm

pouvez-vous m'aider à construire ceci/expliquer comment construire cela?

Merci les gars!

Ceci est mon code de base en ce moment:

stepCounter  db 0 
push offset stepCounter ; Copy the OFFSET of "parameter" into the stack 
call toString 

proc toStringPrint 
    push bp 
    mov bp, sp 

    mov ax, [bp + 4] ;number 
    div 10; div number(in ax) by 10 
    mov [bx], ah 

    ;mov dx, [] 
    ;mov ah, 9h 
    ;int 21h 

    pop bp 
    ret 4 
endp toString 

EDIT

merci! c'est mon code maintenant: mais son impression encore rien

proc toStringPrint 
    push bp 
    mov bp, sp 

    mov si, [bp+4];number 
    mov ax, [si] 
divide: 
    cmp al, 0 
    je Print 
    mov cl, 10 
    div cl; div number(in ax) by 10 
    mov [bx], ah 
    dec bx 
    jmp divide 

Print: 
    mov dx, [bp + 6] 
    mov ah, 9h 
    int 21h 

    pop bp 
    ret 4 
endp toStringPrint 

EDIT 2 Ceci est le code actuel, planter encore l'application et toujours imprimer 219:

stepCounter  dW 0 

;this is how i call the PROC: 
mov cx, [stepCounter] 
push cx 
call toStringPrint 

proc toStringPrint 
    push bp 
    mov bp, sp 

    mov si, [bp+4] ;number location in memory(I think) 
    mov ax, [si] 

    mov cl, "$" 
    mov [bx], cl 
divide: 
    mov ah, 0 
    mov cl, 10 
    div cl   ; div number(in ax) by 10 
    dec bx 
    add ah, 48  ;Make into a character 
    mov [bx], ah 
    cmp al, 0 
    jne divide 
Print: 
    mov dx, bx 
    mov ah, 9h 
    int 21h 

    pop bp 
    ret 4 
endp toStringPrint 
+0

S'il vous plaît nous montrer le code qui ne va pas et ne fonctionne pas. Cela nous donnerait quelque chose à travailler. Maintenant, votre question est admissible à la clôture. –

+0

@SepRoland Merci! Je modifie le post! – Eden

+0

Il n'y a pas de div immédiat. Déplacer 10 dans 'bx', disons, et faire' div bx' - aussi, n'oubliez pas d'effacer 'dx' avant le' div' car c'est 'dx: ax' qui se divise. –

Répondre

1

Cette réponse est simplement l'votre EDIT 2.

mov cx, [stepCounter] 
push cx 
call toStringPrint 

Ce code renvoie la valeur réelle de votre stepcounter mais dans la procédure que vous traiter comme l'adresse de votre stepcounter.Il suffit de commencer la toStringPrint proc avec:

proc toStringPrint 
push bp 
mov bp, sp 
mov ax, [bp+4] ;Value of stepCounter 

pop bp 
ret 4 
endp toStringPrint 

Ce renvoie le code et supprime un supplément de 4 octets de la pile, mais vous ne poussé 2 octets sur la pile! Changer cela:

pop bp 
ret 2 
endp toStringPrint 

Vous ne l'avez pas montré ce mais assurez-vous que les points BX au dernier octet d'un tampon approprié. Un tampon de 4 octets suffira.

+0

Merci! cela fonctionne maintenant :) – Eden

+0

Heureux de voir que vous l'avez fonctionné! S'il vous plaît n'oubliez pas de _upvote_ réponses qui vous ont aidé. Je suggère cependant que vous acceptiez la réponse par @SepRoland car il a fait le plus de travail. – Fifoernik

+0

merci encore :) J'ai voté mais il a dit: "Merci pour les commentaires! Une fois que vous avez gagné un total de 15 points de réputation, vos votes changeront le score de publication affiché." :( – Eden

2
mov ax, [bp + 4] ;number 

Le commentaire sur cette ligne est erroné. Au [bp+4], vous trouverez l'adresse du stepCounter et non sa valeur! Utilisez quelque chose comme:

mov si, [bp+4] 
mov ax, [si] 

Assurez-vous également votre stepcounter un mot au lieu d'un octet .

stepCounter  dw 0 

L'instruction div ne peut pas utiliser un opérande immédiat. Déplacez la valeur dans un registre au préalable. Utilisez CL car il semble que vous souhaitez utiliser BX pour stocker le résultat:

mov cl, 10 
div cl 

Votre modification se rapproche d'une solution! Je ne vois pas ce que vous attendez à [bp+6]. La première étape consiste à fermer la chaîne à venir avec un signe $, puis à commencer à ajouter des chiffres. Pour toujours montrer au moins 1 chiffre faire le test à la fin. Ne jamais oublier à zéro le registre AH avant de faire la division:

mov cl, "$" 
    mov [bx], cl 
divide: 
    mov ah, 0 
    mov cl, 10 
    div cl   ; div number(in ax) by 10 
    dec bx 
    add ah, 48  ;Make into a character 
    mov [bx], ah 
    cmp al, 0 
    jne divide 
Print: 
    mov dx, bx 
    mov ah, 9h 
    int 21h 
+0

merci !! mais j'ai encore des problèmes, pouvez-vous voir l'édition 2? @Sep Roland – Eden