.БАЙТ 0ш7Е, 0ш45, 0ш4В, 0ш46 ; 0x00 : e_ident[EI_MAG0], magic 0x7f, ELF
.БАЙТ 0ш02 ; 0x04 : e_ident[EI_CLASS], 1 - 32 bit, 2 - 64 bit
.БАЙТ 0ш01 ; 0x05 : EI_DATA, endianess, 1 - little, 2 - big
.БАЙТ 0ш01 ; 0x06 : EI_VERSION, for ELF = 1
.БАЙТ 0ш00 ; 0x07 : EI_OSABI, OS system ABI, 0 = System V
.БАЙТ 0ш00 ; 0x08 : EI_ABIVERSION,
.БАЙТ 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00 ; 0x09 : EI_PAD reserved, zeros
.БАЙТ 0ш02, 0ш00 ; 0x10 : e_type, object file type: 0 - unknown, 1 - reloc, 2 - exec, 3 - shared, 4 - core, etc.
.БАЙТ 0ш3Д, 0ш00 ; 0x12 : e_machine, 0x32 - IA-64, 0x3e - AMD x86-64
.БАЙТ 0ш01, 0ш00, 0ш00, 0ш00 ; 0x14 : e_version
.БАЙТ 0ш78, 0ш00, 0ш01, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00 ; 0x18 : e_entry, entry point, 32bit - 4bytes, 64bit - 8bytes
.БАЙТ 0ш40, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00 ; 0x20 : e_phoff, program header table
.БАЙТ 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00 ; 0x28 : e_shoff, section header table
.БАЙТ 0ш00, 0ш00, 0ш00, 0ш00 ; 0x30 : e_flags
.БАЙТ 0ш40, 0ш00 ; 0x34 : e_ehsize, size of the header, normally 64bytes for 64bit, 54bytes for 32bit
.БАЙТ 0ш38, 0ш00 ; 0x36 : e_phentsize, size of a program header table entry. 0x20 - 32bit, 0x38 - 64bit
.БАЙТ 0ш01, 0ш00 ; 0x38 : e_phnum, number of entries in the program header table
.БАЙТ 0ш00, 0ш00 ; 0x3a : e_shentsize, size of a section header table entry, 0x40(64b), 0x28(32b
.БАЙТ 0ш00, 0ш00 ; 0x3c : e_shnum, number of entries in the section header table
.БАЙТ 0ш00, 0ш00 ; 0x3e : e_shstrndx, index of the section header table entry that contains the section names
; 0x40 - end of ELF header size
; 0x40 - The Program header table
.БАЙТ 0ш01, 0ш00, 0ш00, 0ш00 ; 0x40 : p_type, type of a segment, 1 - PT_LOAD
.БАЙТ 0ш05, 0ш00, 0ш00, 0ш00 ; 0x44 : p_flags, segment dependent flags, only 64bit (RWX)
.БАЙТ 0ш78, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00 ; 0x48 : p_offset, offset of the segment in the file image
.БАЙТ 0ш78, 0ш00, 0ш01, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00 ; 0x50 : p_vaddr, virtual address of the segment
.БАЙТ 0ш78, 0ш00, 0ш01, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00 ; 0x58 : p_paddr, the same
.БАЙТ 0ш38, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00 ; 0x60 : p_filesz, size of the segment in the file image
.БАЙТ 0ш38, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00 ; 0x68 : p_memsz, size of the segment in the memory
.БАЙТ 0ш10, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00 ; 0x70 : p_align, 0 and 1 - no alignment, power of 2
; 0x78 - End of the Program header table
; 00010078:
ПРЫГНУТЬ_В НАЧАЛО
ПРИВЕТ: .БАЙТ 0шГ0, 0ш9Е, 0шГ1, 0ш80, 0шГ0, 0шБ8, 0шГ0, 0шБ2, 0шГ0, 0шБ5, 0шГ1, 0ш82, 0ш21, 0ш0А, 0 ; Привет!\n
УРА: .БАЙТ 0шГ0, 0шА3, 0шГ1, 0ш80, 0шГ0, 0шБ0, 0ш21, 0ш0А, 0 ; Ура!\n
ПОКА: .БАЙТ 0шГ0, 0ш9Е, 0шГ0, 0шБД, 0шГ0, 0шБА, 0шГ0, 0шБ0, 0ш21, 0ш0А, 0
;ПЕРЕМЕННАЯ1: .БАЙТ 0, 0, 0, 0, 0, 0, 0, 0
; -------------------------------------------------------------------------------------
ФУНКЦИЯ_ВЫВОДА_ПОВТОРНО:
; -------------------------------------------------------------------------------------
; [РФ + 0ш10] - указатель на строку
; [РФ + 0ш18] - количество повторов
; --------------------------------
ВТОЛКНУТЬ РФ ; пролог функции
КОПИРОВАТЬ РФ, РС
ВТОЛКНУТЬ РЧ ; сохраним счетчик
КОПИРОВАТЬ РЧ, [РФ + 0ш18] ; количество повторов
ВТОЛКНУТЬ [РФ + 0ш10] ; готовим аргументы для функции
ЦИКЛ1:
ВЫЗВАТЬ ФУНКЦИЯ_ВЫВОДА
УМЕНЬШИТЬ_1 РЧ ; отнять, вычесть, уменьшить
ПРЫГНУТЬ_ЕСЛИ_НЕ_0_В ЦИКЛ1
; эпилог функции
ПРИБАВИТЬ РС, 0ш08 ; удаляем аргументы для функции
ВЫТОЛКНУТЬ РЧ ; восстановим счетчик
ВЫТОЛКНУТЬ РФ ; эпилог функции
НАЗАД
; -------------------------------------------------------------------------------------
ФУНКЦИЯ_ВЫВОДА:
; -------------------------------------------------------------------------------------
; [РФ + 0ш10] - указатель на строку
; --------------------------------
ВТОЛКНУТЬ РФ ; пролог функции
КОПИРОВАТЬ РФ, РС
ВТОЛКНУТЬ РЧ ; сохраним счетчик
; считаем длину строки
ВТОЛКНУТЬ [РФ + 0ш10]
ВЫЗВАТЬ ФУНКЦИЯ_ДЛИНЫ_СТРОКИ
ПРИБАВИТЬ РС, 0ш08
КОПИРОВАТЬ РД, РА ; длина строки
КОПИРОВАТЬ РА, 1 ; системная команда "запись файла"
КОПИРОВАТЬ РН, РА ; 1 - консоль
КОПИРОВАТЬ РИ, [РФ + 0ш10] ; указатель на строку
ВЫЗВАТЬ_СИСТЕМУ
; эпилог функции
ВЫТОЛКНУТЬ РЧ ; восстанавливаем счетчик
ВЫТОЛКНУТЬ РФ
НАЗАД
; -------------------------------------------------------------------------------------
ФУНКЦИЯ_ДЛИНЫ_СТРОКИ:
; -------------------------------------------------------------------------------------
; [РФ + 0ш10] - указатель на строку
; --------------------------------
ВТОЛКНУТЬ РФ ; пролог функции
КОПИРОВАТЬ РФ, РС
КОПИРОВАТЬ РЧ, 0
КОПИРОВАТЬ РИ, [РФ + 0ш10]
УМЕНЬШИТЬ_1 РИ
УМЕНЬШИТЬ_1 РЧ
ЦИКЛ2:
ПРИБАВИТЬ_1 РИ
ПРИБАВИТЬ_1 РЧ
КОПИРОВАТЬ РА, [РИ]
БИТ_И РА, 0шЕЕ
ПРЫГНУТЬ_ЕСЛИ_НЕ_0_В ЦИКЛ2
КОПИРОВАТЬ РА, РЧ
ВЫТОЛКНУТЬ РФ ; эпилог функции
НАЗАД
; -------------------------------------------------------------------------------------
НАЧАЛО:
ВТОЛКНУТЬ 3
ВТОЛКНУТЬ ПРИВЕТ
ВЫЗВАТЬ ФУНКЦИЯ_ВЫВОДА_ПОВТОРНО
ПРИБАВИТЬ РС, 0ш08
ВТОЛКНУТЬ УРА
ВЫЗВАТЬ ФУНКЦИЯ_ВЫВОДА_ПОВТОРНО
ПРИБАВИТЬ РС, 0ш08
ВТОЛКНУТЬ ПОКА
ВЫЗВАТЬ ФУНКЦИЯ_ВЫВОДА_ПОВТОРНО
ПРИБАВИТЬ РС, 0ш10
; выход
КОПИРОВАТЬ РА, 0ш3В ; системная команда - "выход"
БИТ_ИСКЛЮЧАЮЩЕЕ_ИЛИ РН, РН ; результат программы
ВЫЗВАТЬ_СИСТЕМУ
; -------------------------------------------------------------------------------------