L'impression que les valeurs hexadécimales en x86 assemblée
J'ai besoin de faire une routine qui vous permet de convertir une adresse de mémoire dans une chaîne d'octets. Cette chaîne serait alors l'entrée d'une fonction qui imprime null chaînes (dont j'étais déjà capable de faire). Par exemple, si j'ai une adresse 0x1bf9 j'ai besoin d'imprimer le texte "1bf9" à l'écran. Le livre n'est pas allé en 32 bits mode encore, mais ça a un peu laissé entendre que nous aurions besoin pour cela aussi. C'est ce que j'ai à ce jour:
TABLE:
db "0123456789ABCDEF", 0
STRING:
db 0
hex_to_char:
lea bx, TABLE
mov ax, dx
mov ah, al ;make al and ah equal so we can isolate each half of the byte
shr ah, 4 ;ah now has the high nibble
and al, 0x0F ;al now has the low nibble
xlat ;lookup al's contents in our table
xchg ah, al ;flip around the bytes so now we can get the higher nibble
xlat ;look up what we just flipped
inc STRING
mov [STRING], ah ;append the new character to a string of bytes
inc STRING
mov [STRING], al ;append the new character to the string of bytes
ret
OriginalL'auteur Hugo | 2013-09-18
Vous devez vous connecter pour publier un commentaire.
Cette tente d'incrémenter un littéral de l'étiquette, qui n'est pas correct. Aussi, votre CHAÎNE de l'emplacement de la mémoire n'alloue un octet (char) au lieu d'un plus grand nombre de s'adapter à la taille de la chaîne que vous avez l'intention.
Neutre commentaire: la table de caractères utilisé pour
xlat
n'a pas besoin d'être terminées par un zéro.Aussi je vous recommande la sauvegarde et la restauration de certains registres de bonne asm programmation de la pratique. De cette façon, la fonction d'appel n'a pas besoin de s'inquiéter sur les registres d'être changé "derrière son dos". En fin de compte alors, vous voulez probablement quelque chose comme ceci:
Si vous voulez que la fonction retourne le caractère juste enregistré, vous pouvez sauter le push/pop de
ax
.mov [bx], ah
;mov [bx+1], al
J'ai essayé à l'aide de votre solution, mais au lieu de chargement de la CHAÎNE efficace de l'adresse dans bx je l'ai chargé dans cx. Il me fait une erreur sur les lignes où je colle chaque octet dans [cx] et [cx + 1]. msna dire qu'ils ne sont pas valides efficace adresses.
ok. Alors, pourquoi ne puis-je pas utiliser
lea
pour qui? N'est-ce pas ce que c'est?ne serait pas le chargement de la conversion des caractères dans [bx] remplacer le tableau qui est déjà là?
en effet. Vous pourriez peut-être préciser au préalable votre commentaire, Il me fait une erreur sur les lignes où je colle chaque octet dans [cx] et [cx + 1] et de l'état de l'erreur exacte à laquelle l'instruction.
OriginalL'auteur lurker
Veuillez jeter un oeil à ma réponse sur cette page pour convertir une valeur 32 bits dans EAX à 8 octets ASCII hexadécimal: L'impression d'un nombre en langage d'assemblage?
OriginalL'auteur Dirk Wolfgang Glomp