Skip to content

Instantly share code, notes, and snippets.

@kthompson
Forked from jsutlovic/print_hex.asm
Last active August 15, 2022 15:52
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kthompson/957c635d84b7813945aa9bb649f039b9 to your computer and use it in GitHub Desktop.
Save kthompson/957c635d84b7813945aa9bb649f039b9 to your computer and use it in GitHub Desktop.
Assembly print hex
[org 0x7c00]
mov dx, 0x1fb7 ; Set the value we want to print to dx
call print_hex ; Print the hex value
jmp $ ; Hang once we're done
%include "print_string.asm"
; Prints the value of DX as hex.
print_hex:
pusha ; save the register values to the stack for later
mov cx,4 ; Start the counter: we want to print 4 characters
; 4 bits per char, so we're printing a total of 16 bits
char_loop:
dec cx ; Decrement the counter
mov ax,dx ; copy bx into ax so we can mask it for the last chars
shr dx,4 ; shift bx 4 bits to the right
and ax,0xf ; mask ah to get the last 4 bits
mov bx, HEX_OUT ; set bx to the memory address of our string
add bx, 2 ; skip the '0x'
add bx, cx ; add the current counter to the address
cmp ax,0xa ; Check to see if it's a letter or number
jl set_letter ; If it's a number, go straight to setting the value
add al, 0x27 ; If it's a letter, add 0x27, and plus 0x30 down below
; ASCII letters start 0x61 for "a" characters after
; decimal numbers. We need to cover that distance.
jl set_letter
set_letter:
add al, 0x30 ; For and ASCII number, add 0x30
mov byte [bx],al ; Add the value of the byte to the char at bx
cmp cx,0 ; check the counter, compare with 0
je print_hex_done ; if the counter is 0, finish
jmp char_loop ; otherwise, loop again
print_hex_done:
mov bx, HEX_OUT ; print the string pointed to by bx
call print_string
popa ; pop the initial register values back from the stack
ret ; return the function
HEX_OUT: db '0x0000', 0
; Padding and magic number
times 510-($-$$) db 0
dw 0xaa55
print_string: ; Push registers onto the stack
pusha
string_loop:
mov al, [bx] ; Set al to the value at bx
cmp al, 0 ; Compare the value in al to 0 (check for null terminator)
jne print_char ; If it's not null, print the character at al
; Otherwise the string is done, and the function is ending
popa ; Pop all the registers back onto the stack
ret ; return execution to where we were
print_char:
mov ah, 0x0e ; Linefeed printing
int 0x10 ; Print character
add bx, 1 ; Shift bx to the next character
jmp string_loop ; go back to the beginning of our loop
@IsaMorphic
Copy link

Thanks! this is pretty useful for debugging features

@KowalczykBartek
Copy link

Thank you very much ! thanks to that gist I was able to complete exercise 3.4.8

@s0h1s2
Copy link

s0h1s2 commented Jun 29, 2022

Thanks buddy it's an amazing thing when you see those bits and bytes.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment