Assemblée: Comment convertir un hex d'entrée à virgule?
J'ai trouvé beaucoup de questions à ce sujet, cependant, je n'ai pas pu obtenir mon code à exécuter. Mon programme doit prendre une valeur hexadécimale, vérifier pour voir si elle est valide hex personnage, puis d'afficher la valeur hexadécimale comme une valeur décimale. Si c'est un moindre cas hex caractère qu'il doit ensuite être convertie en majuscules. Tout cela doit être dans une boucle.
J'ai tous de ce fait, sauf pour la conversion de l'hexadécimal en décimal. J'ai le code dans le programme, je pense, devrait convertir, mais il ne compile pas. Je vais énumérer les erreurs du compilateur ci-dessous le code. Si le code de l'étiquette convertir: est commenté(à l'exception de la dernière ligne, "jmp affichage") puis le programme va s'exécuter comme il se doit, mais ne sera évidemment pas montrer la valeur comme un nombre décimal.
De la compilation avec nasme: "nasm-fbin getChar.asm-o getChar.com -l getChar.lst"
Je suis en cours d'exécution du programme dans dosbox.
; This program gets a char from user and prints it out as a decimal
org 100h ; program start point
section .data
msgIn: DB 13, 10, "Enter a Hex Digit: $"
msgOut: DB 13, 10, "Decimal Value: $"
msgOpt: DB 13, 10, "Enter another?(y or n): $"
errMsg: DB 13, 10, "Illegal character, Enter 0..9 or A..F: $"
HNUM: DB 19H
NUM: DB 0
D: DB 10h
H: DB 16
CNT: DB 0
section .text
continue: ; start of loop
mov dx, msgIn ; offset address of message to display
mov ah, 9 ; print string function
int 21h
mov ah, 1 ; keyboard input sub-program
int 21h ; read character into al
mov cl, al
legal: ; compare input to see if valid
cmp cl, 48 ; cl < 0
jl end_if ; yes, error msg
cmp cl, 70 ; cl > F
jg check_case ; yes, error msg
jmp prntMsg2 ; print value of input
check_case: ; check case of input
cmp cl, 97 ; cl < a
jl end_if ; yes, error msg
cmp cl, 102 ; cl > f
jg end_if ; yes, error msg
jmp to_upper ; need to send to function to convert to upper case
; then pass to prntMsg2
to_upper:
and al, 223 ; convert to upper case(0DFh)
jmp prntMsg2
end_if: ; error message if invalid input
mov ah, 9
mov dx, errMsg ; print error message
int 21h
jmp continue ; get a new value
prntMsg2: ; print second message*****
mov dx, msgOut ; offset of second message
mov ah, 9 ; print string function
int 21h ; display message
convert:
mov cx, 00
mov dx, 00
L6: mov ax, 00
mov al, [HNUM]
div word [D]
mov [HNUM], al
mov bx, ax
mov cl, 0
mov ax, 1
L5:
cmp cl, 00
je L7
mul word [H]
sub cl, 1
jmp L5
L7:
mul bh
add dx, ax
add word [CNT], 1
cmp word [HNUM], 0
jg L6
mov [NUM], dl
jmp display
display: ; display character
mov dl, al
mov ah, 2 ; print char function
int 21h
mov ah, 9 ; see if user wants to do it again
mov dx, msgOpt
int 21h
mov ah, 1
int 21h
mov bl, al
cmp bl, 'y' ; bl = y
jne exitPrg ; no, end
jmp continue ; get a new value
exitPrg: ; exit program
mov ah, 4ch ; exit to DOS function
int 21h ; see you later!
Le code ci-dessus a été édité et maintenant compile et s'exécute. Cependant, il n'est toujours pas à faire la conversion à partir de l'hex décimal correctement. Il n'a tout simplement pas afficher une valeur, juste vide. Il permettra également de raccrocher si une lettre est entré, même une lettre de a à f. Un certain nombre n'accroche pas, mais encore une valeur n'est pas affichée.
Maintenant que j'ai en cours d'exécution, au moins je peux travailler sur les fixer, cependant, de toute orientation est apprécié. Merci Gene pour m'avoir fait et en cours d'exécution.
Vous devez vous connecter pour publier un commentaire.
MSNA de mémoire opérandes utiliser des crochets pour désigner un déréférencement. Ainsi, par exemple, vous voulez:
La MSNA Manuel explique cette. RTFM!
Sans les crochets, les étiquettes sont traités comme immédiate opérandes égale à l'adresse de l'emplacement mémoire. La première ligne est pas d'erreur de syntaxe, mais les causes
al
être chargé avec l'octet de poids faible de l'adresse deHNUM
. Pas ce que tu voulais. Lediv
est une erreur car 8086 a pas d'instruction pour diviser par l'imminence d'une quantité. Et lemov
est un non-sens parce que vous ne pouvez pas écrire une valeur immédiate.Donc les messages d'erreur sont de vous dire quel est le problème. Dans les lignes de référence, les opérandes ne sont pas compatibles avec leurs instructions.
Plus
Je suis allé de l'avant et installé dosbox et de MSNA. En effet MSNA est pas tout à fait aussi intelligent que MASM sur l'inférence de types d'opérande. Donc, pour le
div
instruction vous avez besoinbyte
, (pasword
) comme maintenant reflétées ci-dessus. Je ne pouvais pas grok votre algorithme. C'est plus compliqué que nécessaire. Voici ma version:word
, car les variables sont octets.byte
pasword
. Je n'ai pas utilisé de MSNA, mais dans MASM si vous n'avez pas utiliser le côlon après la bd de l'étiquette, la taille de l'opérande serait déduit de l'étiquette. Le côlon efface la taille de l'information. Les MSNA de la documentation semble montrer cela fonctionne dans les MSNA, trop.check_for_upper:
cela devrait aller être:
comme Ucase "A" est 41h, et Lcase "a" est 61 h