Раздел «Язык Ассемблера».PrintHexFunction:

NASM: печать целого числа в шестнадцетиричном формате

; -------------------------------
section .data
; Храним здесь инициализированные данные (переменные)

; -------------------------------
section .bss
; Область неинициализированных данных (резерв)

; -------------------------------
section .text

; elf entry point
global _start

_start:

    push 1234abc1h          ; вызовем функцию print_hex,
    call print_hex          ; которая описана ниже
                            ; предварительно поместив её аргумент в стэк 

    ; system exit 0
    mov eax, 1
    mov ebx, 0
    int 80h

print_hex:                 ; Функция печати последних четырех байтов 
    push ebp               ; как целого числа в шестнадцетиричной записи
    mov ebp, esp

                           ; строчку с разраядами, которую нам нужно напечатать, мы поместим в стек
    sub esp, 8h            ; по адресу esp-8 мы расположим 8 символов
                           ; 16-й записи числа [ebp+8]

    mov ecx, [ebp+8] ; аргумент, переданный нам в стеке, помещаем в ecx

    mov esi, 8       ; esi будем использовать как переменную 

.loop:
    mov eax, ecx    ; из ecx копируем в eax  
    and eax, 0xf    ; обнуляем старшие 28 бит eax, последние 4 бита — это численное значение
                    ; следующего шестнадцатиричного разряда нашего числа.
    cmp al, 9       ; сравниваем его с числом 9
    jle .print_decimal_digit ; и определяем из какого он диапазона
.print_hex_digit:   ; либо из диапазона A..F
    sub al, 10
    add al, 'a'
    jmp .print1
.print_decimal_digit: ; либо из диапазона 0..9
    add al, '0'
.print1:
    dec esi
    mov byte [esp+esi], al ; помещаем символ-шестнадцатиричную-цифру al по адресу esp+esi
    shr ecx, 4             ; сдвиг вправо на 4 бита, что равносильно делению на 16 без остатка
    jz  .ret
    jmp .loop
.ret

    ; write (stdin, string_address, number_of_chars )
    mov eax, 4       ; write (номер системного вызова write есть 4)
    mov ebx, 1       ; stdin (дескриптор стандартного потока вывода равен 1 )
    mov ecx, esp     ; string_address
    mov edx, 8       ; number_of_shars (число символов)
    int 80h          ; здесь происходит вызов, параметры которого мы задали в предыдущих 4 строчках
    leave            ; возвращаем регистр ebp в исходное состояние
    ret