2016-01-09 1 views
2

Ce code est tiré de l'un des exemples de mon professeur. Disons que j'ai la variable que je veux imprimer dans ma DL.Lors de l'assemblage, pourquoi un nombre hexadécimal ne peut-il pas être imprimé sans décalage?

DISPLAY_HEX PROC NEAR 
    MOV BL,DL 

    MOV BH,0  
    MOV CL,4  

    SHL BX,CL 
    MOV DL,BH 

    CALL ONE_DIGIT 

    MOV CL,4  
    SHR BL,CL 
    MOV DL,BL 

    CALL ONE_DIGIT 

    RET  
DISPLAY_HEX ENDP 


ONE_DIGIT PROC NEAR 

    CMP DL,9  
    JA LETTER 

    ADD DL,48 
    JMP NEXT  

LETTER: ADD DL, 'A'-10 

NEXT: MOV AH,02H 
    INT 21H 

END: RET  
ONE_DIGIT ENDP 

Pourquoi les changements? Ne peut-il être imprimé comme une décimale? En outre, pourquoi utilise-t-on à la fois SHR et SHL ici? Je suis un débutant dans l'assemblage alors s'il vous plaît essayez d'expliquer simplement.

+0

Vous ne pouvez pas imprimer directement un nombre décimal. Vous devez convertir en texte. Il se trouve que chaque 4 bits est un nombre hexadécimal donc vous pouvez utiliser le décalage au lieu de la division que vous auriez normalement. D'un coup d'œil le code est faux, car il imprime le même chiffre deux fois. Mais je n'avais pas encore mon café;) – Jester

+0

Ah d'accord, ça imprime bien les deux chiffres, le 'shr' est de défaire le' shl' donc les 4 bits bas finissent là où ils ont commencé. – Jester

+0

Merci bouffon, je pense que je l'ai eu. –

Répondre

3

En base16 (hex) vous avez 16 chiffres possibles (0..F), donc il faut exactement 4 bits pour représenter un chiffre hexadécimal (log2 (16) == 4). Ici, je parle de chiffres dans le sens des valeurs (0..F, ou 0..15 dans base10), pas les caractères ASCII.

Un octet peut donc contenir deux chiffres hexadécimaux. Disons que DL contient les bits suivants: XXXXYYYY (où chaque X et Y est un binaire 0 ou 1).

D'abord le registre de 16 bits BX est décalé de 4 bits vers la gauche. BX est constitué de BL (octet le moins significatif) et BH (octet le plus significatif). BH a été défini sur 0 et BL contient l'entrée, donc avant le décalage BX contiendra les bits 00000000XXXXYYYY. Et après le décalage, il contiendra 0000XXXXYYYY0000.
Ensuite, l'octet le plus significatif de BX (c'est-à-dire BH, qui contient maintenant 0000XXXX) est déplacé vers DL, converti en caractère et imprimé. Pour la deuxième partie BL, qui contient maintenant YYYY0000 est déplacé 4 bits vers la droite, ce qui entraîne 0000YYYY. Et puis cette valeur est convertie en caractère et imprimée.

+0

Woah! Merci beaucoup d'avoir pris le temps d'expliquer, c'était génial! –