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