Online Compiler Nasm

global main extern printf section .data fmt db "%02X %02X %02X %02X", 10, 0 section .text main: push ebp mov ebp, esp mov eax, 12345678h push eax mov esi, esp movzx eax, byte [esi+3] push eax movzx eax, byte [esi+2] push eax movzx eax, byte [esi+1] push eax movzx eax, byte [esi] push eax push fmt call printf add esp, 20 mov esp, ebp pop ebp xor eax, eax ret
Этот код выводит байты числа 0x12345678 в шестнадцатеричном виде, начиная со старшего байта. Число помещается в стек, затем его байты извлекаются и передаются в printf.

- Обрати внимание на порядок байтов в стеке: число 0x12345678 сохраняется в памяти как 78 56 34 12 (little-endian). Твой код читает байты в обратном порядке, начиная с [esi+3], что даёт 12 34 56 78 — это правильный порядок для вывода. Но проверь, что ты не перепутал смещения: [esi] — младший байт, [esi+3] — старший.

- После вызова printf ты добавляешь 20 к esp. Посчитай, сколько аргументов было помещено в стек: четыре байта (по одному на каждый push) плюс адрес строки fmt — это 5 значений по 4 байта, то есть 20 байт. Всё верно.