Created
January 8, 2024 23:06
-
-
Save appblue/3bbbaac902a08f2a34763c2cf512e46c to your computer and use it in GitHub Desktop.
convert number to hex in x64 assembly
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; 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