2017-05-03 2 views
1

Essayer de convertir flotteur hexidecimal en nasmpoint de flotteur pour afficher hexidecimal x86-64 nasm linux

+0

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

+0

@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

+0

@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

Répondre

1

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.