input.ruc:
ФункцияДлиныСтроки {асм(" ; [РФ + 0ш10] - указатель на строку ; -------------------------------- Копировать РЧ, 0 Копировать РИ, [РФ + 0ш10] Уменьшить1 РИ Уменьшить1 РЧ ЦИКЛ2: Увеличить1 РИ Увеличить1 РЧ Копировать РА, [РИ] БитИ РА, 0шЕЕ ПерейтиЕслиНе0В ЦИКЛ2 Копировать РА, РЧ ")} ФункцияВывода {асм(" ; [РФ + 0ш10] - указатель на строку ; -------------------------------- ; считаем длину строки Втолкнуть [РФ + 0ш10] Вызвать ФункцияДлиныСтроки Увеличить РС, 0ш08 Копировать РД, РА ; длина строки Копировать РА, 1 ; системная команда 'запись файла' Копировать РН, РА ; 1 - консоль Копировать РИ, [РФ + 0ш10] ; указатель на строку ВызватьСистему ")} ФункцияВыводаЧисла {асм(" ; [РФ + 0ш10] - число ; -------------------------------- Втолкнуть РД Втолкнуть РБ Втолкнуть РА Уменьшить РС, 0ш40 ; [РФ - 0ш08] - переменная Копировать РД, [РФ + 0ш10] Копировать РЧ, 1 Копировать РБ, 0ш0а ; код перехода на новую строку в конце строки Цикл: ; берем 16-ричную цифру из РД Копировать РА, РД БитИ РА, 0шЕ БитИли РА, 0ш30 СдвинутьВлево РБ, 8 БитИли РБ, РА Увеличить1 РЧ СдвинутьВправо РД, 4 ПерейтиЕслиНе0В Цикл ; новая строка Втолкнуть РБ Копировать РД, РЧ ; длина строки Копировать РИ, РС ; указатель на строку Копировать РА, 1 ; системная команда 'запись файла' Копировать РН, РА ; 1 - консоль ВызватьСистему Вытолкнуть РБ Вытолкнуть РА Вытолкнуть РБ Вытолкнуть РД ")} Начало { ФункцияВывода("Следующий шаг: добавляем Иначе.") Целое число число = 0ш24 Если число = 0ш25 { ФункцияВывода("число равно 0ш25") } Если число = 0ш24 { ФункцияВывода("число равно 0ш24") } Если число = 0ш24 { ФункцияВывода("число равно 0ш24") } Иначе { ФункцияВывода("число не равно 0ш24") } Если число = 0ш23 { ФункцияВывода("число равно 0ш23") } Иначе { ФункцияВывода("число не равно 0ш23") } ФункцияВывода("Выход") ;ФункцияВыводаЧисла(число) }
input.txt:
.Байт 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: entry_point ПерейтиВ Начало С4: .Байт 0шГ0, 0шА1, 0шГ0, 0шББ, 0шГ0, 0шБ5, 0шГ0, 0шБ4, 0шГ1, 0ш83, 0шГ1, 0ш8Д, 0шГ1, 0ш89, 0шГ0, 0шБ8, 0шГ0, 0шБ9, 0ш20, 0шГ1, 0ш88, 0шГ0, 0шБ0, 0шГ0, 0шБ3, 0ш3А, 0ш20, 0шГ0, 0шБ4, 0шГ0, 0шБД, 0шГ0, 0шБ1, 0шГ0, 0шБ0, 0шГ0, 0шБ2, 0шГ0, 0шББ, 0шГ1, 0ш8Е, 0шГ0, 0шБ5, 0шГ0, 0шБВ, 0ш20, 0шГ0, 0ш98, 0шГ0, 0шБГ, 0шГ0, 0шБ0, 0шГ1, 0ш87, 0шГ0, 0шБ5, 0ш2Д, 0ш0А, 0 С5: .Байт 0шГ1, 0ш87, 0шГ0, 0шБ8, 0шГ1, 0ш81, 0шГ0, 0шББ, 0шГ0, 0шБД, 0ш20, 0шГ1, 0ш80, 0шГ0, 0шБ0, 0шГ0, 0шБ2, 0шГ0, 0шБГ, 0шГ0, 0шБД, 0ш20, 0ш30, 0шГ1, 0ш88, 0ш32, 0ш35, 0ш0А, 0 С6: .Байт 0шГ1, 0ш87, 0шГ0, 0шБ8, 0шГ1, 0ш81, 0шГ0, 0шББ, 0шГ0, 0шБД, 0ш20, 0шГ1, 0ш80, 0шГ0, 0шБ0, 0шГ0, 0шБ2, 0шГ0, 0шБГ, 0шГ0, 0шБД, 0ш20, 0ш30, 0шГ1, 0ш88, 0ш32, 0ш34, 0ш0А, 0 С7: .Байт 0шГ1, 0ш87, 0шГ0, 0шБ8, 0шГ1, 0ш81, 0шГ0, 0шББ, 0шГ0, 0шБД, 0ш20, 0шГ0, 0шБГ, 0шГ0, 0шБ5, 0ш20, 0шГ1, 0ш80, 0шГ0, 0шБ0, 0шГ0, 0шБ2, 0шГ0, 0шБГ, 0шГ0, 0шБД, 0ш20, 0ш30, 0шГ1, 0ш88, 0ш32, 0ш34, 0ш0А, 0 С8: .Байт 0шГ1, 0ш87, 0шГ0, 0шБ8, 0шГ1, 0ш81, 0шГ0, 0шББ, 0шГ0, 0шБД, 0ш20, 0шГ1, 0ш80, 0шГ0, 0шБ0, 0шГ0, 0шБ2, 0шГ0, 0шБГ, 0шГ0, 0шБД, 0ш20, 0ш30, 0шГ1, 0ш88, 0ш32, 0ш33, 0ш0А, 0 С9: .Байт 0шГ1, 0ш87, 0шГ0, 0шБ8, 0шГ1, 0ш81, 0шГ0, 0шББ, 0шГ0, 0шБД, 0ш20, 0шГ0, 0шБГ, 0шГ0, 0шБ5, 0ш20, 0шГ1, 0ш80, 0шГ0, 0шБ0, 0шГ0, 0шБ2, 0шГ0, 0шБГ, 0шГ0, 0шБД, 0ш20, 0ш30, 0шГ1, 0ш88, 0ш32, 0ш33, 0ш0А, 0 С10: .Байт 0шГ0, 0ш92, 0шГ1, 0ш8Б, 0шГ1, 0ш85, 0шГ0, 0шБД, 0шГ0, 0шБ4, 0ш0А, 0 ; ------------------------------------------------------------------------------------- ФункцияДлиныСтроки: ; ------------------------------------------------------------------------------------- ; пролог Втолкнуть РФ Копировать РФ, РС ; [РФ + 0ш10] - указатель на строку ; -------------------------------- Копировать РЧ, 0 Копировать РИ, [РФ + 0ш10] Уменьшить1 РИ Уменьшить1 РЧ ЦИКЛ2: Увеличить1 РИ Увеличить1 РЧ Копировать РА, [РИ] БитИ РА, 0шЕЕ ПерейтиЕслиНе0В ЦИКЛ2 Копировать РА, РЧ ; эпилог Копировать РС, РФ Вытолкнуть РФ Назад ; ------------------------------------------------------------------------------------- ФункцияВывода: ; ------------------------------------------------------------------------------------- ; пролог Втолкнуть РФ Копировать РФ, РС ; [РФ + 0ш10] - указатель на строку ; -------------------------------- ; считаем длину строки Втолкнуть [РФ + 0ш10] Вызвать ФункцияДлиныСтроки Увеличить РС, 0ш08 Копировать РД, РА ; длина строки Копировать РА, 1 ; системная команда 'запись файла' Копировать РН, РА ; 1 - консоль Копировать РИ, [РФ + 0ш10] ; указатель на строку ВызватьСистему ; эпилог Копировать РС, РФ Вытолкнуть РФ Назад ; ------------------------------------------------------------------------------------- ФункцияВыводаЧисла: ; ------------------------------------------------------------------------------------- ; пролог Втолкнуть РФ Копировать РФ, РС ; [РФ + 0ш10] - число ; -------------------------------- Втолкнуть РД Втолкнуть РБ Втолкнуть РА Уменьшить РС, 0ш40 ; [РФ - 0ш08] - переменная Копировать РД, [РФ + 0ш10] Копировать РЧ, 1 Копировать РБ, 0ш0а ; код перехода на новую строку в конце строки Цикл: ; берем 16-ричную цифру из РД Копировать РА, РД БитИ РА, 0шЕ БитИли РА, 0ш30 СдвинутьВлево РБ, 8 БитИли РБ, РА Увеличить1 РЧ СдвинутьВправо РД, 4 ПерейтиЕслиНе0В Цикл ; новая строка Втолкнуть РБ Копировать РД, РЧ ; длина строки Копировать РИ, РС ; указатель на строку Копировать РА, 1 ; системная команда 'запись файла' Копировать РН, РА ; 1 - консоль ВызватьСистему Вытолкнуть РБ Вытолкнуть РА Вытолкнуть РБ Вытолкнуть РД ; эпилог Копировать РС, РФ Вытолкнуть РФ Назад ; ------------------------------------------------------------------------------------- Начало: ; ------------------------------------------------------------------------------------- ; пролог Втолкнуть РФ Копировать РФ, РС Уменьшить РС, 8 Втолкнуть С4 Вызвать ФункцияВывода Увеличить РС, 0ш8 Копировать РА, 0ш24 Копировать РБ, РФ Уменьшить РБ, 8 Копировать [РБ], РА Копировать РА, РФ Уменьшить РА, 8 Копировать РА, [РА] Уменьшить РА, 0ш25 ПерейтиЕслиНе0 ПослеЕсли1 Втолкнуть С5 Вызвать ФункцияВывода Увеличить РС, 0ш8 ПослеЕсли1: Копировать РА, РФ Уменьшить РА, 8 Копировать РА, [РА] Уменьшить РА, 0ш24 ПерейтиЕслиНе0 ПослеЕсли3 Втолкнуть С6 Вызвать ФункцияВывода Увеличить РС, 0ш8 ПослеЕсли3: Копировать РА, РФ Уменьшить РА, 8 Копировать РА, [РА] Уменьшить РА, 0ш24 ПерейтиЕслиНе0 Иначе6 Втолкнуть С6 Вызвать ФункцияВывода Увеличить РС, 0ш8 Перейти ПослеЕсли5 Иначе6: Втолкнуть С7 Вызвать ФункцияВывода Увеличить РС, 0ш8 ПослеЕсли5: Копировать РА, РФ Уменьшить РА, 8 Копировать РА, [РА] Уменьшить РА, 0ш23 ПерейтиЕслиНе0 Иначе8 Втолкнуть С8 Вызвать ФункцияВывода Увеличить РС, 0ш8 Перейти ПослеЕсли7 Иначе8: Втолкнуть С9 Вызвать ФункцияВывода Увеличить РС, 0ш8 ПослеЕсли7: Втолкнуть С10 Вызвать ФункцияВывода Увеличить РС, 0ш8 ; эпилог Копировать РС, РФ Вытолкнуть РФ ; выход Копировать РА, 0ш3В ; системная команда - 'выход' БитИсключающееИли РН, РН ; результат программы ВызватьСистему
rax:
./rex ./output.bin 00000000: 7Е 45 4В 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF............| 00000010: 02 00 3Д 00 01 00 00 00 78 00 01 00 00 00 00 00 |..>.....x.......| 00000020: 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |@...............| 00000030: 00 00 00 00 40 00 38 00 01 00 00 00 00 00 00 00 |....@.8.........| 00000040: 01 00 00 00 05 00 00 00 78 00 00 00 00 00 00 00 |........x.......| 00000050: 78 00 01 00 00 00 00 00 78 00 01 00 00 00 00 00 |x.......x.......| 00000060: 38 00 00 00 00 00 00 00 38 00 00 00 00 00 00 00 |8.......8.......| 00000070: 10 00 00 00 00 00 00 00 Д9 А1 01 00 00 Г0 А1 Г0 |................| 00000080: ББ Г0 Б5 Г0 Б4 Г1 83 Г1 8Д Г1 89 Г0 Б8 Г0 Б9 20 |............... | 00000090: Г1 88 Г0 Б0 Г0 Б3 3А 20 Г0 Б4 Г0 БД Г0 Б1 Г0 Б0 |......: ........| 000000А0: Г0 Б2 Г0 ББ Г1 8Е Г0 Б5 Г0 БВ 20 Г0 98 Г0 БГ Г0 |.......... .....| 000000Б0: Б0 Г1 87 Г0 Б5 2Д 0А 00 Г1 87 Г0 Б8 Г1 81 Г0 ББ |................| 000000В0: Г0 БД 20 Г1 80 Г0 Б0 Г0 Б2 Г0 БГ Г0 БД 20 30 Г1 |.. .......... 0.| 000000Г0: 88 32 35 0А 00 Г1 87 Г0 Б8 Г1 81 Г0 ББ Г0 БД 20 |.25............ | 000000Д0: Г1 80 Г0 Б0 Г0 Б2 Г0 БГ Г0 БД 20 30 Г1 88 32 34 |.......... 0..24| 000000Е0: 0А 00 Г1 87 Г0 Б8 Г1 81 Г0 ББ Г0 БД 20 Г0 БГ Г0 |............ ...| 00000100: Б5 20 Г1 80 Г0 Б0 Г0 Б2 Г0 БГ Г0 БД 20 30 Г1 88 |. .......... 0..| 00000110: 32 34 0А 00 Г1 87 Г0 Б8 Г1 81 Г0 ББ Г0 БД 20 Г1 |24............ .| 00000120: 80 Г0 Б0 Г0 Б2 Г0 БГ Г0 БД 20 30 Г1 88 32 33 0А |......... 0..23.| 00000130: 00 Г1 87 Г0 Б8 Г1 81 Г0 ББ Г0 БД 20 Г0 БГ Г0 Б5 |........... ....| 00000140: 20 Г1 80 Г0 Б0 Г0 Б2 Г0 БГ Г0 БД 20 30 Г1 88 32 | .......... 0..2| 00000150: 33 0А 00 Г0 92 Г1 8Б Г1 85 Г0 БД Г0 Б4 0А 00 55 |3..............U| 00000160: 48 89 Д5 48 В7 В1 00 00 00 00 48 8Б 75 10 48 ЕЕ |H..H......H.u.H.| 00000170: ВД 48 ЕЕ В9 48 ЕЕ В6 48 ЕЕ В1 48 8Б 06 48 81 Д0 |.H..H..H..H..H..| 00000180: ЕЕ 00 00 00 0Е 85 ДА ЕЕ ЕЕ ЕЕ 48 89 В8 48 89 ДВ |..........H..H..| 00000190: 5Г В3 55 48 89 Д5 ЕЕ 75 10 Д8 В1 ЕЕ ЕЕ ЕЕ 48 81 |].UH...u......H.| 000001А0: В4 08 00 00 00 48 89 В2 48 В7 В0 01 00 00 00 48 |.....H..H......H| 000001Б0: 89 В7 48 8Б 75 10 0Е 05 48 89 ДВ 5Г В3 55 48 89 |..H.u...H..].UH.| 000001В0: Д5 52 53 50 48 81 ДВ 40 00 00 00 48 8Б 55 10 48 |.RSPH..@...H.U.H| 000001Г0: В7 В1 01 00 00 00 48 В7 В3 0А 00 00 00 48 89 Г0 |......H......H..| 000001Д0: 48 81 Д0 0Е 00 00 00 48 81 В8 30 00 00 00 48 В1 |H......H..0...H.| 000001Е0: Д3 08 48 09 В3 48 ЕЕ В1 48 В1 ДА 04 0Е 85 ГБ ЕЕ |..H..H..H.......| 00000200: ЕЕ ЕЕ 53 48 89 ВА 48 89 Д6 48 В7 В0 01 00 00 00 |..SH..H..H......| 00000210: 48 89 В7 0Е 05 5Б 58 5Б 5А 48 89 ДВ 5Г В3 55 48 |H....[X[ZH..].UH| 00000220: 89 Д5 48 81 ДВ 08 00 00 00 68 7Г 00 01 00 Д8 5Е |..H......h}...._| 00000230: ЕЕ ЕЕ ЕЕ 48 81 В4 08 00 00 00 48 В7 В0 24 00 00 |...H......H..$..| 00000240: 00 48 89 ДБ 48 81 ДБ 08 00 00 00 48 89 03 48 89 |.H..H......H..H.| 00000250: Д8 48 81 Д8 08 00 00 00 48 8Б 00 48 81 Д8 25 00 |.H......H..H..%.| 00000260: 00 00 0Е 85 11 00 00 00 68 Б8 00 01 00 Д8 20 ЕЕ |........h..... .| 00000270: ЕЕ ЕЕ 48 81 В4 08 00 00 00 48 89 Д8 48 81 Д8 08 |..H......H..H...| 00000280: 00 00 00 48 8Б 00 48 81 Д8 24 00 00 00 0Е 85 11 |...H..H..$......| 00000290: 00 00 00 68 Г5 00 01 00 Д8 Е5 ЕД ЕЕ ЕЕ 48 81 В4 |...h.........H..| 000002А0: 08 00 00 00 48 89 Д8 48 81 Д8 08 00 00 00 48 8Б |....H..H......H.| 000002Б0: 00 48 81 Д8 24 00 00 00 0Е 85 16 00 00 00 68 Г5 |.H..$.........h.| 000002В0: 00 01 00 Д8 ВА ЕД ЕЕ ЕЕ 48 81 В4 08 00 00 00 Д9 |........H.......| 000002Г0: 11 00 00 00 68 Е2 00 01 00 Д8 Б4 ЕД ЕЕ ЕЕ 48 81 |....h.........H.| 000002Д0: В4 08 00 00 00 48 89 Д8 48 81 Д8 08 00 00 00 48 |.....H..H......H| 000002Е0: 8Б 00 48 81 Д8 23 00 00 00 0Е 85 16 00 00 00 68 |..H..#.........h| 00000300: 14 01 01 00 Д8 89 ЕД ЕЕ ЕЕ 48 81 В4 08 00 00 00 |.........H......| 00000310: Д9 11 00 00 00 68 31 01 01 00 Д8 73 ЕД ЕЕ ЕЕ 48 |.....h1....s...H| 00000320: 81 В4 08 00 00 00 68 53 01 01 00 Д8 62 ЕД ЕЕ ЕЕ |......hS....b...| 00000330: 48 81 В4 08 00 00 00 48 89 ДВ 5Г 48 В7 В0 3В 00 |H......H..]H..<.| 00000340: 00 00 48 31 ЕЕ 0Е 05 |..H1...| 00000347:
Вывод программы:
Следующий шаг: добавляем Иначе.
число равно 0ш24
число равно 0ш24
число не равно 0ш23
Выход