Skip to content

Instantly share code, notes, and snippets.

@appblue
Created January 8, 2024 23:06
Show Gist options
  • Save appblue/3bbbaac902a08f2a34763c2cf512e46c to your computer and use it in GitHub Desktop.
Save appblue/3bbbaac902a08f2a34763c2cf512e46c to your computer and use it in GitHub Desktop.
convert number to hex in x64 assembly
; fasm demonstration of writing 64-bit ELF executable
; (thanks to František Gábriš)
; syscall numbers: /usr/src/linux/include/asm-x86_64/unistd.h
; parameters order:
; r9 ; 6th param
; r8 ; 5th param
; r10 ; 4th param
; rdx ; 3rd param
; rsi ; 2nd param
; rdi ; 1st param
; eax ; syscall_number
; syscall
format ELF64 executable 3
segment readable executable
entry $
lea rsi, [msg]
mov edx, msg_size ; CPU zero extends 32-bit operation to 64-bit
; we can use less bytes than in case mov rdx,...
mov edi, 1 ; STDOUT
mov eax, 1 ; sys_write
syscall
lea rsi, [buffer]
mov rax, -127
call hex64
mov byte [rsi + 16], 0x0A ; add new line at the end
mov edx, 17
mov edi, 1 ; STDOUT
mov eax, 1 ; sys_write
syscall
xor edi, edi ; exit code 0
mov eax, 60 ; sys_exit
syscall
hex64: lea rdi, [dgts]
mov rcx, 0x10
.loop: mov rdx, rax
and rdx, 0x0F
mov bl, [rdi + rdx]
mov byte [rsi + rcx - 1], bl
shr rax, 4
dec rcx
jnz .loop
ret
hex32: lea rdi, [dgts]
mov rcx, 0x08
.loop: mov rdx, rax
and rdx, 0x0F
mov bl, [rdi + rdx]
mov byte [rsi + rcx - 1], bl
shr rax, 4
dec rcx
jnz .loop
ret
dgts: db '0123456789ABCDEF'
segment readable writeable
msg db 'converting number to hex: '
msg_size = $-msg
buffer: rb 17 ; buffer for the data
; vim: ft=fasm ts=8 sw=8 expandtab
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment