Essayer de convertir flotteur hexidecimal en nasmpoint de flotteur pour afficher hexidecimal x86-64 nasm linux
Répondre
Comment convertir un DWORD (un seul nombre à virgule flottante de précision) en hexadécimal
La notation hexadécimale est juste une simplification de la notation binaire. Quatre bits à la fois forment un chiffre hexadécimal.
Avec
SA: dd 500.312
MSNA convertit le nombre décimal 500,312 dans le format interne "DWORD" - un groupe de 32 bits:
01000011111110100010011111110000
Groupe-les à des groupes de 4 bits (amuse-gueules) et convertir chaque groupe en nombre décimal:
0100 0011 1111 1010 0010 0111 1111 0000
4 3 15 10 2 7 15 0
Le moyen le plus simple d'obtenir des chiffres hexadécimaux est une recherche table. Une chaîne est un moyen approprié pour former un réseau de 16 caractères hexadécimaux:
hex db "F"
interprète les nombres de chaque quartet comme indice du tableau ([hex+index]
) et la stocker dans une chaîne de caractères à délivrer.
Un défi consiste à isoler les grignotements de gauche à droite. Vous pouvez nous l'instruction ROL,4
, déplacer le résultat vers un autre registre et isoler le grignotage avec AND 0x0F
. Une autre façon est d'utiliser SHLD
. Lorsque vous avez isolé le grignotage, vous avez également l'index du tableau hexadécimal.
Exemple:
BITS 64
DEFAULT rel
GLOBAL _start
SECTION .data
SA dd 500.312 ; Single floating point number
hex db "ABCDEF" ; Array of 16 characters
lf db 10 ; New line
SECTION .bss
outstr resb 16 ; Array of 16 unitialized bytes
SECTION .text
DWORD_to_hex: ; ARG: EAX: DWORD value, ESI: Pointer to an array of at least 8 bytes
xor esi, esi ; RSI = 0 (access to ESI clears the upper DWORD of RSI)
mov ecx, 8 ; RCX = 8
.LL3:
xor sil, sil ; Clear lowest byte of RSI
shld esi, eax, 4 ; Copy 4 leftmost bits from EAX to ESI
shl eax, 4 ; Shift EAX accordingly
mov dl, [hex + esi] ; Get a hexadecimal character
mov [edi], dl ; Store the character
add edi, 1 ; Increment the pointer to outstr
loop .LL3 ; Loop RCX times
ret
_start: ; Entry point - here starts the program
mov eax, [SA] ; Single floating point number coded as DWORD
mov rdi, outstr ; OFFSET outstr
call DWORD_to_hex
; Show hex (8 characters)
mov eax, 1 ; SYS_WRITE
mov edi, 1 ; STDOUT
mov rsi, outstr ; Message address
mov edx, 8 ; Number of bytes to display
syscall ; Call Linux
; New line
mov eax, 1 ; SYS_WRITE
mov rdi, 1 ; STDOUT
mov rsi, lf ; Message address
mov edx, 1 ; Number of bytes to display
syscall ; Call Linux
; Exit (0)
mov eax, 60 ; SYS_EXIT
mov edi, 0 ; Exitcode
syscall ; Call Linux/no return
ajuster ces étapes pour recevoir la représentation hexadécimale d'une QWORD (64 bits) qui représente un numéro de point de double précision flosting.
Pour les définitions des variables dans MSNA jeter un oeil dans le [manuel NASM] (http://www.nasm.us/doc/nasmdoc3.html#section-3.2.1). La question principale n'est pas claire. Voulez-vous juste voir la représentation hexadécimale du DWORD/QWORD ou voulez-vous les convertir en un nombre hexadécimal, par exemple 165.5 = A5.8? – rkhb
@rkhb "Ecrire une routine qui affichera chacun de ces nombres sous forme de chiffres hexadécimaux en utilisant la représentation interne de FP sur la machine." Im devinant que j'ai besoin de les convertir – Killermonkeyz22
@rkhb pas vraiment sûr de ce que vous voulez dire par juste les voir? Selon le lien de nasm mes définitions devraient être correctement correctes? – Killermonkeyz22