[x86 asssembler, fasm] pretvaranje 64 bitnog inta u hex string

  • Začetnik teme Začetnik teme bmaxa
  • Datum pokretanja Datum pokretanja

bmaxa

Legenda
Poruka
70.808
Ovo rutina zapravo pretvara chetiri komada u cugu. Uzhivajte :P
Kod:
format elf64 executable 3
include 'import64.inc'
interpreter '/lib64/ld-linux-x86-64.so.2'
needed 'libc.so.6'
import strtoul,printf,exit

segment executable
entry $
    xor eax,eax
    mov rdi,0
    mov rsi,inbuf
    mov rdx,16
    syscall

    mov rdi,inbuf
    mov rsi,0
    mov rdx,010h
    call [strtoul]

    mov rdi,rax
    mov rsi,0xfedcba9876543210
    mov ecx,1000000000
.L0:
    call cvtq2hex
    dec ecx
    jnz .L0

    mov rdi,fmt
    vmovdqa yword[outbuf],ymm0
    mov rsi,outbuf
    xor eax,eax
    call [printf]

    xor edi,edi
    call [exit]
; rdi,rsi input , ymm0 output
cvtq2hex:
    vmovq xmm0,rdi
    vmovq xmm1,rsi
    vinserti128 ymm0,ymm0,xmm1,1
    vpshufb ymm0,ymm0,yword[sf]
    vmovdqa ymm1,ymm0
    vpsllw ymm1,ymm1,4
    vpand ymm1,ymm1,yword[mask1]
    vpand ymm0,ymm0,yword[mask2]
    vpor ymm0,ymm0,ymm1

    vmovdqa ymm1,yword[val1]
    vpcmpgtb ymm1,ymm1,ymm0
    vpaddb ymm0,ymm0,yword[vala]
    vpand ymm1,ymm1,yword[valamz]
    vpsubb ymm0,ymm0,ymm1
    vpshufb ymm0,ymm0,yword[invert]
    ret
segment writeable
align 32
sf db 0,-128,1,-128
   db 2,-128,3,-128
   db 4,-128,5,-128
   db 6,-128,7,-128
   db 0,-128,1,-128
   db 2,-128,3,-128
   db 4,-128,5,-128
   db 6,-128,7,-128
invert db 15,14,13,12
       db 11,10,9,8
       db 7,6,5,4
       db 3,2,1,0
       db 15,14,13,12
       db 11,10,9,8
       db 7,6,5,4
       db 3,2,1,0

mask1 dw 16 dup(0xf00)
mask2 dw 16 dup(0xf)
val1 db 32 dup(0xa)
vala db 32 dup(0x57)
valamz db 32 dup(0x57-'0')
outbuf rb 32
       db 0
inbuf db 16 dup(0xa)
      dq 0
fmt db '%s',0ah,0

Kod:
~/.../examples/assembler >>> fasm cvtq2hex.asm
flat assembler  version 1.73.27  (16384 kilobytes memory)
3 passes, 1309 bytes.
~/.../examples/assembler >>> ./cvtq2hex
abcd1234
00000000abcd1234fedcba9876543210
 
Poslednja izmena:

Back
Top