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.

InformationsquelleAutor Beetle | 2014-02-19