Применение искинов - шоссе империализма (Стенгазета русификаторов ИТ)

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



Ivan хвалится достижениями, но не показывает исходники

Сообщений 31 страница 60 из 161

31

Интересный вопрос, может кто знает:

Код:
b0:	48 8b 3b             	mov    (%rbx),%rdi
  b3:	48                   	rex.W
  b4:	8b                   	.byte 0x8b
  b5:	3d                   	.byte 0x3d

Не проходит такой код:

Код:
mov    (%rbp),%rdi

ему требуется 0 c rbp

Код:
48 8b 7d 00          	mov    0x0(%rbp),%rdi

Почему такие требования?

UPD. Разобрался, такого режима адресации нет для этого регистра.

Отредактировано Ivan (2024-09-05 11:02:05)

0

32

Обрабатываются метки :

Код:
.БАЙТ 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ш86, 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А ; Привет!\n

; 00010086:

;.БАЙТ 0шД9, 0шГ7, 0ш00, 0шЕЕ, 0шЕЕ


ПРЫГНУТЬ МЕТКА2

МЕТКА1:

КОПИРОВАТЬ РА, 1 ; команда запись файла (sys_write)
КОПИРОВАТЬ РН, РА ; 1 - консоль
КОПИРОВАТЬ РД, 14 ; длина текста 
КОПИРОВАТЬ РИ, 0ш10078 ; указатель на строку
ВЫЗВАТЬ_СИСТЕМУ

ПРЫГНУТЬ МЕТКА1

МЕТКА2:

КОПИРОВАТЬ РА, 0ш3В ; sys_exit
КОПИРОВАТЬ РН, 0 ;
ВЫЗВАТЬ_СИСТЕМУ

;ВТОЛКНУТЬ РН
;ВЫТОЛКНУТЬ РА

Выход:

Код:
00000000  7f 45 4c 46 02 01 01 00  00 00 00 00 00 00 00 00  |.ELF............|
00000010  02 00 3e 00 01 00 00 00  86 00 01 00 00 00 00 00  |..>.............|
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  d0 9f d1 80 d0 b8 d0 b2  |................|
00000080  d0 b5 d1 82 21 0a e9 1b  00 00 00 c7 c0 01 00 00  |....!...........|
00000090  00 89 c7 c7 c2 0e 00 00  00 c7 c6 78 00 01 00 0f  |...........x....|
000000a0  05 e9 e5 ff ff ff c7 c0  3c 00 00 00 c7 c7 00 00  |........<.......|
000000b0  00 00 0f 05                                       |....|
000000b4

0

33

Реализованы функции, условный переход, стек, в данном случае в программе выводится 5 раз "Привет!":

Код:
.БАЙТ 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ш86, 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А ; Привет!\n

; 00010086:

ПРЫГНУТЬ МЕТКА2

ПРИВЕТ2:
.БАЙТ 0шГ0, 0ш9Е, 0шГ1, 0ш80, 0шГ0, 0шБ0, 0шГ0, 0шБ2, 0шГ0, 0шБ5, 0шГ1, 0ш82, 0ш21, 0ш0А ; Привет!\n

ФУНКЦИЯ_ПРИВЕТ:
	ВТОЛКНУТЬ РЧ
	КОПИРОВАТЬ РА, 1 ; команда запись файла (sys_write)
	КОПИРОВАТЬ РН, РА ; 1 - консоль
	КОПИРОВАТЬ РД, 14 ; длина текста 
	КОПИРОВАТЬ РИ, ПРИВЕТ ; указатель на строку
	ВЫЗВАТЬ_СИСТЕМУ
	ВЫТОЛКНУТЬ РЧ
	НАЗАД

МЕТКА2:
	КОПИРОВАТЬ РЧ, 5
ЦИКЛ1:
	ВЫЗВАТЬ ФУНКЦИЯ_ПРИВЕТ
	ОТНЯТЬ_1 РЧ
	ПРЫГНУТЬ_ЕСЛИ_НЕ_0 ЦИКЛ1

	КОПИРОВАТЬ РА, 0ш3В ; sys_exit
	КОПИРОВАТЬ РН, 0 ;
	ВЫЗВАТЬ_СИСТЕМУ

hexdump бинарника:

Код:
00000000  7f 45 4c 46 02 01 01 00  00 00 00 00 00 00 00 00  |.ELF............|
00000010  02 00 3e 00 01 00 00 00  86 00 01 00 00 00 00 00  |..>.............|
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  d0 9f d1 80 d0 b8 d0 b2  |................|
00000080  d0 b5 d1 82 21 0a e9 2b  00 00 00 d0 9f d1 80 d0  |....!..+........|
00000090  b0 d0 b2 d0 b5 d1 82 21  0a 51 48 c7 c0 01 00 00  |.......!.QH.....|
000000a0  00 48 89 c7 48 c7 c2 0e  00 00 00 48 c7 c6 78 00  |.H..H......H..x.|
000000b0  01 00 0f 05 59 c3 48 c7  c1 05 00 00 00 e8 d7 ff  |....Y.H.........|
000000c0  ff ff 48 ff c9 0f 85 f2  ff ff ff 48 c7 c0 3c 00  |..H........H..<.|
000000d0  00 00 48 c7 c7 00 00 00  00 0f 05                 |..H........|
000000db

0

34

Ivan написал(а):

5 раз

Ура! Ура! Ура! Ура! Ура!

0

35

Лис написал(а):

Ура! Ура! Ура! Ура! Ура!

Передача аргументов через стек, косвенная адресация:

Код:
.БАЙТ 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ш86, 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А ; Привет!\n

; 00010086:

ПРЫГНУТЬ НАЧАЛО 

УРА:
.БАЙТ 0шГ0, 0шА3, 0шГ1, 0ш80, 0шГ0, 0шБ0, 0ш21, 0ш0А  ; Ура!\n

; -------------------------------------------------------------------------------------

ФУНКЦИЯ_ВЫВОДА:
	; --------------------------------
	; [РФ + 0ш10] - указатель на строку
	; [РФ + 0ш18] - длина строки
	; --------------------------------

	ВТОЛКНУТЬ РФ                  ; пролог функции
	КОПИРОВАТЬ РФ, РС              
	ВТОЛКНУТЬ РЧ                  ; сохраним счетчик

	КОПИРОВАТЬ РА, 1              ; команда запись файла (sys_write)
	КОПИРОВАТЬ РН, РА             ; 1 - консоль
	КОПИРОВАТЬ РД, [РФ + 0ш18]    ; длина строки
	КОПИРОВАТЬ РИ, [РФ + 0ш10]    ; указатель на строку
	ВЫЗВАТЬ_СИСТЕМУ

	ВЫТОЛКНУТЬ РЧ                 ; восстанавливаем счетчик
	ВЫТОЛКНУТЬ РФ                 ; эпилог функции
	НАЗАД

; -------------------------------------------------------------------------------------

ФУНКЦИЯ_ВЫВОДА_ПОВТОРНО:
	; --------------------------------
	; [РФ + 0ш10] - указатель на строку
	; [РФ + 0ш18] - длина строки
	; [РФ + 0ш20] - количество повторов
	; --------------------------------

	ВТОЛКНУТЬ РФ                  ; пролог функции
	КОПИРОВАТЬ РФ, РС              
	ВТОЛКНУТЬ РЧ                  ; сохраним счетчик

	КОПИРОВАТЬ РЧ, [РФ + 0ш20]    ; указатель на строку

	ВТОЛКНУТЬ [РФ + 0ш18]
	ВТОЛКНУТЬ [РФ + 0ш10]

ЦИКЛ1:
	ВЫЗВАТЬ ФУНКЦИЯ_ВЫВОДА
	ОТНЯТЬ_1 РЧ
	ПРЫГНУТЬ_ЕСЛИ_НЕ_0 ЦИКЛ1

	ВЫТОЛКНУТЬ РА
	ВЫТОЛКНУТЬ РА

	ВЫТОЛКНУТЬ РЧ                 ; восстановим счетчик
	ВЫТОЛКНУТЬ РФ                 ; эпилог функции
	НАЗАД

; -------------------------------------------------------------------------------------

НАЧАЛО:
	ВТОЛКНУТЬ 5 
	ВТОЛКНУТЬ 14
	ВТОЛКНУТЬ ПРИВЕТ
	ВЫЗВАТЬ ФУНКЦИЯ_ВЫВОДА_ПОВТОРНО
	ВЫТОЛКНУТЬ РА
	ВЫТОЛКНУТЬ РА

	ВТОЛКНУТЬ 8
	ВТОЛКНУТЬ УРА
	ВЫЗВАТЬ ФУНКЦИЯ_ВЫВОДА_ПОВТОРНО

	ВЫТОЛКНУТЬ РА
	ВЫТОЛКНУТЬ РА
	ВЫТОЛКНУТЬ РА

	КОПИРОВАТЬ РА, 0ш3В           ;  системная команда - выход
	КОПИРОВАТЬ РН, 0              ;  результат программы
	ВЫЗВАТЬ_СИСТЕМУ

; -------------------------------------------------------------------------------------

hexdump:

Код:
00000000  7f 45 4c 46 02 01 01 00  00 00 00 00 00 00 00 00  |.ELF............|
00000010  02 00 3e 00 01 00 00 00  86 00 01 00 00 00 00 00  |..>.............|
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  d0 9f d1 80 d0 b8 d0 b2  |................|
00000080  d0 b5 d1 82 21 0a e9 46  00 00 00 d0 a3 d1 80 d0  |....!..F........|
00000090  b0 21 0a 55 48 89 e5 51  48 c7 c0 01 00 00 00 48  |.!.UH..QH......H|
000000a0  89 c7 48 8b 55 18 48 8b  75 10 0f 05 59 5d c3 55  |..H.U.H.u...Y].U|
000000b0  48 89 e5 51 48 8b 4d 20  ff 75 18 ff 75 10 e8 d0  |H..QH.M .u..u...|
000000c0  ff ff ff 48 ff c9 0f 85  f2 ff ff ff 58 58 59 5d  |...H........XXY]|
000000d0  c3 68 05 00 00 00 68 0e  00 00 00 68 78 00 01 00  |.h....h....hx...|
000000e0  e8 ca ff ff ff 58 58 68  08 00 00 00 68 8b 00 01  |.....XXh....h...|
000000f0  00 e8 b9 ff ff ff 58 58  58 48 c7 c0 3c 00 00 00  |......XXXH..<...|
00000100  48 c7 c7 00 00 00 00 0f  05                       |H........|
00000109

Вывод:

Код:
Привет!
Привет!
Привет!
Привет!
Привет!
Ура!
Ура!
Ура!
Ура!
Ура!

0

36

Не нужно считать длину строки, реализованы битовые операции xor, and, or, sub, add:

Код:
.БАЙТ 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В           ;  системная команда - "выход"
	БИТ_ИСКЛЮЧАЮЩЕЕ_ИЛИ РН, РН    ;  результат программы
	ВЫЗВАТЬ_СИСТЕМУ

; -------------------------------------------------------------------------------------

hex:

Код:
00000000  7f 45 4c 46 02 01 01 00  00 00 00 00 00 00 00 00  |.ELF............|
00000010  02 00 3e 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  e9 a1 00 00 00 d0 9f d1  |................|
00000080  80 d0 b8 d0 b2 d0 b5 d1  82 21 0a 00 d0 a3 d1 80  |.........!......|
00000090  d0 b0 21 0a 00 d0 9f d0  be d0 ba d0 b0 21 0a 00  |..!..........!..|
000000a0  55 48 89 e5 51 48 8b 4d  18 ff 75 10 e8 13 00 00  |UH..QH.M..u.....|
000000b0  00 48 ff c9 0f 85 f2 ff  ff ff 48 81 c4 08 00 00  |.H........H.....|
000000c0  00 59 5d c3 55 48 89 e5  51 ff 75 10 e8 1d 00 00  |.Y].UH..Q.u.....|
000000d0  00 48 81 c4 08 00 00 00  48 89 c2 48 c7 c0 01 00  |.H......H..H....|
000000e0  00 00 48 89 c7 48 8b 75  10 0f 05 59 5d c3 55 48  |..H..H.u...Y].UH|
000000f0  89 e5 48 c7 c1 00 00 00  00 48 8b 75 10 48 ff ce  |..H......H.u.H..|
00000100  48 ff c9 48 ff c6 48 ff  c1 48 8b 06 48 81 e0 ff  |H..H..H..H..H...|
00000110  00 00 00 0f 85 ea ff ff  ff 48 89 c8 5d c3 68 03  |.........H..].h.|
00000120  00 00 00 68 7d 00 01 00  e8 73 ff ff ff 48 81 c4  |...h}....s...H..|
00000130  08 00 00 00 68 8c 00 01  00 e8 62 ff ff ff 48 81  |....h.....b...H.|
00000140  c4 08 00 00 00 68 95 00  01 00 e8 51 ff ff ff 48  |.....h.....Q...H|
00000150  81 c4 10 00 00 00 48 c7  c0 3c 00 00 00 48 31 ff  |......H..<...H1.|
00000160  0f 05                                             |..|
00000162

Вывод:

Код:
Привет!
Привет!
Привет!
Ура!
Ура!
Ура!
Пока!
Пока!
Пока!

0

37

Ivan написал(а):

реализованы битовые операции xor, and, or, sub, add:

Нехватает информации. Что пользователи форума могут с этим делать? Что-то откуда-то скачать? Как-то запустить?

Отредактировано Лис (2024-09-08 05:37:31)

0

38

Лис написал(а):

Нехватает информации. Что пользователи форума могут с этим делать? Что-то откуда-то скачать? Как-то запустить?

Можно скачать по ссылке https://disk.yandex.ru/d/Ync_OnUV03EOyA
Меняйте код в файле input.txt (пока к нему привязка).
Запускаете ./ruasm и получаете исполняемый файл output.bin из input.txt.

Отредактировано Ivan (2024-09-08 11:56:13)

0

39

Большое спасибо, ждём, может кто присоединится (что вряд ли, но мало ли?).

0

40

Переизобретаю С:

Код:
начало {
	асм("
НАЧАЛО:
	; выход
	КОПИРОВАТЬ РА, 0ш3В           ;  системная команда - 'выход'
	БИТ_ИСКЛЮЧАЮЩЕЕ_ИЛИ РН, РН    ;  результат программы
	ВЫЗВАТЬ_СИСТЕМУ
	");
}

0

41

Продолжение темы:

Код:
ура {асм("
.БАЙТ 0шГ0, 0шА3, 0шГ1, 0ш80, 0шГ0, 0шБ0, 0ш21, 0ш0А, 0  ; Ура!\n
.БАЙТ 0
")}

привет {асм("
.БАЙТ 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ш10] - указатель на строку
	; --------------------------------

	ВТОЛКНУТЬ РФ                  ; пролог функции
	КОПИРОВАТЬ РФ, РС              

	КОПИРОВАТЬ РЧ, 0
	КОПИРОВАТЬ РИ, [РФ + 0ш10]
	УМЕНЬШИТЬ_1 РИ
	УМЕНЬШИТЬ_1 РЧ
ЦИКЛ2:
	ПРИБАВИТЬ_1 РИ
	ПРИБАВИТЬ_1 РЧ
	КОПИРОВАТЬ РА, [РИ]
	БИТ_И РА, 0шЕЕ
	ПРЫГНУТЬ_ЕСЛИ_НЕ_0_В ЦИКЛ2
	КОПИРОВАТЬ РА, РЧ

	ВЫТОЛКНУТЬ РФ                 ; эпилог функции
	НАЗАД
")}

ФункцияВывода {асм("
	; [РФ + 0ш10] - указатель на строку
	; --------------------------------

	ВТОЛКНУТЬ РФ                  ; пролог функции
	КОПИРОВАТЬ РФ, РС              
	ВТОЛКНУТЬ РЧ                  ; сохраним счетчик

	; считаем длину строки
	ВТОЛКНУТЬ [РФ + 0ш10]                 
	ВЫЗВАТЬ ФункцияДлиныСтроки
	ПРИБАВИТЬ РС, 0ш08
	КОПИРОВАТЬ РД, РА  ; длина строки

	КОПИРОВАТЬ РА, 1              ; системная команда 'запись файла'
	КОПИРОВАТЬ РН, РА             ; 1 - консоль
	КОПИРОВАТЬ РИ, [РФ + 0ш10]    ; указатель на строку
	ВЫЗВАТЬ_СИСТЕМУ
                                  ; эпилог функции
	ВЫТОЛКНУТЬ РЧ                 ; восстанавливаем счетчик
	ВЫТОЛКНУТЬ РФ                 
	НАЗАД
")}

Начало {
	ФункцияВывода(привет)
	ФункцияВывода(ура)
}

0

42

Замена hexdump для русских шестнадцатеричных кодов.
https://disk.yandex.ru/d/LKUxjXOJyT-Ajw
Пример вывода:

Код:
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 73 00 00 00 г0 а3 г1  |.........s......|
00000080: 80 г0 б0 21 0а 00 00 г0 9е г1 80 г0 б8 г0 б2 г0  |...!............|
00000090: б5 г1 82 21 0а 00 55 48 89 д5 48 в7 в1 00 00 00  |...!..UH..H.....|
000000a0: 00 48 8б 75 10 48 ее вд 48 ее в9 48 ее в6 48 ее  |.H.u.H..H..H..H.|
000000b0: в1 48 8б 06 48 81 д0 ее 00 00 00 0е 85 да ее ее  |.H..H...........|
000000c0: ее 48 89 в8 5г в3 55 48 89 д5 51 ее 75 10 д8 в3  |.H..].UH..Q.u...|
000000d0: ее ее ее 48 81 в4 08 00 00 00 48 89 в2 48 в7 в0  |...H......H..H..|
000000e0: 01 00 00 00 48 89 в7 48 8б 75 10 0е 05 59 5г в3  |....H..H.u...Y].|
000000f0: 68 7г 00 01 00 д8 вв ее ее ее 48 81 в4 08 00 00  |h}........H.....|
00000100: 00 48 в7 в0 3в 00 00 00 48 31 ее 0е 05           |.H..<...H1...|

0

43

Мне кажется, что если делается минимальный забутовочный ассемблер, то не надо в него включать синтаксис Си. Чем меньше синтаксиса, тем проще будет код. Чем проще код, тем меньше его дамп. Чем меньше дамп, тем меньше набивать проще верифицировать.

Поэтому хорошо бы записать синтаксис формально, да объяснить естественноязыковым текстом, как из синтаксиса вручную сделать ассемблерный код рекурсивного спуска.

0

44

Лис написал(а):

Мне кажется, что если делается минимальный забутовочный ассемблер, то не надо в него включать синтаксис Си.

Это не ассемблер, я просто создаю новый язык на русском, задача в принципе, что и у Си.
Это та задумка, которая у меня была изначально.
Входной файл input.ruc:

Код:
асм("
ура: .БАЙТ 0шГ0, 0шА3, 0шГ1, 0ш80, 0шГ0, 0шБ0, 0ш21, 0ш0А, 0  ; Ура!\n
     .БАЙТ 0
")

асм("
привет: .БАЙТ 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ш10] - указатель на строку
	; --------------------------------

	КОПИРОВАТЬ РЧ, 0
	КОПИРОВАТЬ РИ, [РФ + 0ш10]
	УМЕНЬШИТЬ_1 РИ
	УМЕНЬШИТЬ_1 РЧ
ЦИКЛ2:
	ПРИБАВИТЬ_1 РИ
	ПРИБАВИТЬ_1 РЧ
	КОПИРОВАТЬ РА, [РИ]
	БИТ_И РА, 0шЕЕ
	ПРЫГНУТЬ_ЕСЛИ_НЕ_0_В ЦИКЛ2
	КОПИРОВАТЬ РА, РЧ
")}

ФункцияВывода {асм("
	; [РФ + 0ш10] - указатель на строку
	; --------------------------------

	ВТОЛКНУТЬ РЧ                  ; сохраним счетчик

	; считаем длину строки
	ВТОЛКНУТЬ [РФ + 0ш10]                 
	ВЫЗВАТЬ ФункцияДлиныСтроки
	ПРИБАВИТЬ РС, 0ш08
	КОПИРОВАТЬ РД, РА  ; длина строки

	КОПИРОВАТЬ РА, 1              ; системная команда 'запись файла'
	КОПИРОВАТЬ РН, РА             ; 1 - консоль
	КОПИРОВАТЬ РИ, [РФ + 0ш10]    ; указатель на строку
	ВЫЗВАТЬ_СИСТЕМУ
                                  ; эпилог функции
	ВЫТОЛКНУТЬ РЧ                 ; восстанавливаем счетчик
")}

Начало {
	ФункцияВывода(ура)
	;ФункцияВывода("Привет!")
}

Выходной 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

ПРЫГНУТЬ_В Начало

ура: .БАЙТ 0шГ0, 0шА3, 0шГ1, 0ш80, 0шГ0, 0шБ0, 0ш21, 0ш0А, 0  ; Ура!\n
     .БАЙТ 0


привет: .БАЙТ 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ш10] - указатель на строку
	; --------------------------------

	КОПИРОВАТЬ РЧ, 0
	КОПИРОВАТЬ РИ, [РФ + 0ш10]
	УМЕНЬШИТЬ_1 РИ
	УМЕНЬШИТЬ_1 РЧ
ЦИКЛ2:
	ПРИБАВИТЬ_1 РИ
	ПРИБАВИТЬ_1 РЧ
	КОПИРОВАТЬ РА, [РИ]
	БИТ_И РА, 0шЕЕ
	ПРЫГНУТЬ_ЕСЛИ_НЕ_0_В ЦИКЛ2
	КОПИРОВАТЬ РА, РЧ

	; эпилог
	ВЫТОЛКНУТЬ РФ
	НАЗАД

; -------------------------------------------------------------------------------------
    ФункцияВывода:
; -------------------------------------------------------------------------------------
	; пролог
	ВТОЛКНУТЬ РФ
	КОПИРОВАТЬ РФ, РС

	; [РФ + 0ш10] - указатель на строку
	; --------------------------------

	ВТОЛКНУТЬ РЧ                  ; сохраним счетчик

	; считаем длину строки
	ВТОЛКНУТЬ [РФ + 0ш10]                 
	ВЫЗВАТЬ ФункцияДлиныСтроки
	ПРИБАВИТЬ РС, 0ш08
	КОПИРОВАТЬ РД, РА  ; длина строки

	КОПИРОВАТЬ РА, 1              ; системная команда 'запись файла'
	КОПИРОВАТЬ РН, РА             ; 1 - консоль
	КОПИРОВАТЬ РИ, [РФ + 0ш10]    ; указатель на строку
	ВЫЗВАТЬ_СИСТЕМУ
                                  ; эпилог функции
	ВЫТОЛКНУТЬ РЧ                 ; восстанавливаем счетчик

	; эпилог
	ВЫТОЛКНУТЬ РФ
	НАЗАД

; -------------------------------------------------------------------------------------
    Начало:
; -------------------------------------------------------------------------------------
	ВТОЛКНУТЬ ура
	ВЫЗВАТЬ ФункцияВывода
	ПРИБАВИТЬ РС, 0ш8
	; выход
	КОПИРОВАТЬ РА, 0ш3В           ;  системная команда - 'выход'
	БИТ_ИСКЛЮЧАЮЩЕЕ_ИЛИ РН, РН    ;  результат программы
	ВЫЗВАТЬ_СИСТЕМУ

и выходной бинарник:

Код:
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 73 00 00 00 г0 а3 г1  |.........s......|
00000080: 80 г0 б0 21 0а 00 00 г0 9е г1 80 г0 б8 г0 б2 г0  |...!............|
00000090: б5 г1 82 21 0а 00 55 48 89 д5 48 в7 в1 00 00 00  |...!..UH..H.....|
000000а0: 00 48 8б 75 10 48 ее вд 48 ее в9 48 ее в6 48 ее  |.H.u.H..H..H..H.|
000000б0: в1 48 8б 06 48 81 д0 ее 00 00 00 0е 85 да ее ее  |.H..H...........|
000000в0: ее 48 89 в8 5г в3 55 48 89 д5 51 ее 75 10 д8 в3  |.H..].UH..Q.u...|
000000г0: ее ее ее 48 81 в4 08 00 00 00 48 89 в2 48 в7 в0  |...H......H..H..|
000000д0: 01 00 00 00 48 89 в7 48 8б 75 10 0е 05 59 5г в3  |....H..H.u...Y].|
000000е0: 68 7г 00 01 00 д8 вв ее ее ее 48 81 в4 08 00 00  |h}........H.....|
00000100: 00 48 в7 в0 3в 00 00 00 48 31 ее 0е 05           |.H..<...H1...|

т.е. схема следующая:
input.ruc -> input.txt -> bin(elf)

0

45

то не ассемблер, я просто создаю новый язык на русском

Тогда это две разных темы. Ассемблер - одна тема,
язык, компилирующийся в этот ассемблер, - другая.

0

46

Лис написал(а):

Тогда это две разных темы. Ассемблер - одна тема,
язык, компилирующийся в этот ассемблер, - другая.

Почему? Я буду использовать этот язык для раскрутки ассемблера, т.е. это отностится к ассемблеру - все просто.

0

47

Ivan написал(а):

Я буду использовать этот язык для раскрутки ассемблера

Видимо я понимаю слово "раскрутка" каким-то одним способом,
а Вы и alextretyak понимаете это слово каким-то другим способом.

Недостаточно просто скомпилироваться со своих исходников, для того, чтобы владеть процессом переноса цепочки на другую архитектуру, или для кросс-компиляции.

0

48

Лис написал(а):

Видимо я понимаю слово "раскрутка" каким-то одним способом,

Результат один: транслятор ассемблера сможет скомпилировать свой собственный код написанный на своем языке.

Лис написал(а):

Недостаточно просто скомпилироваться со своих исходников, для того, чтобы владеть процессом переноса цепочки на другую архитектуру, или для кросс-компиляции.

Пока не надо думать о том как перенести на другую платформу. Эта задача уже потом.

0

49

Ivan написал(а):

Результат один: транслятор ассемблера сможет скомпилировать свой собственный код написанный на своем языке.

результат неоднинаков. В одном случае весь код контролируется,
во втором случае используется часть чужого рантайм-кода (рантайм-библиотека Си).

0

50

Лис написал(а):

во втором случае используется часть чужого рантайм-кода (рантайм-библиотека Си).

Чужого кода Си не будет, будет голый ассемлер в итоге.

0

51

Ivan написал(а):

в итоге.

Но хватит ли сил этого идеала достинуть?

Что мешает реализовать только часть рантайма напрямую сразу на языке ассемблера и без Си обойтись?

В чём выгода от применения си-синтаксиса уже на этом уровне?

Я считаю, что можно использовать и сишный код и пруверы, но надо уметь разделить сборку на этапы, где этапы могут быть последовательно верифицированы. Вот есть исходный байт-код, вот способ его верифицировать, и он минимален, обеспечивает только функциональность своего уровня.

Втаскивать синтаксис Си на уровень ассемблера - это увеличивать минимальный код неоптимальным способом и удлиннять его верификацию.

0

52

Лис написал(а):

Но хватит ли сил этого идеала достинуть?

Хватит, это не так сложно. И это не идеал.

Лис написал(а):

Что мешает реализовать только часть рантайма напрямую сразу на языке ассемблера и без Си обойтись?

Все просто сейчас уже есть бинарник можно его транслировать на ассемлере, конечно с корректировками, но это нудно и долго. Проще создать вспомогательный язык.

Лис написал(а):

В чём выгода от применения си-синтаксиса уже на этом уровне?

Лис написал(а):

Втаскивать синтаксис Си на уровень ассемблера - это увеличивать минимальный код неоптимальным способом и удлиннять его верификацию.

Вы ничего не поняли. Ассемблер так и останется в том виде как и в файле input.txt.
Я думаю будет понятно когда я сделаю.

0

53

Ivan написал(а):

сейчас уже есть бинарник

Неверифицируемый бинарник, с кодом неизвестного происхождения.

0

54

Лис написал(а):

Неверифицируемый бинарник, с кодом неизвестного происхождения.

У вас есть другие варианты, есть верифицированный бинарник с кодом известного происхождения?

0

55

Ivan написал(а):

У вас есть другие варианты, есть верифицированный бинарник с кодом известного происхождения?

У меня нет.
Но теоретически его можно сделать. И это цель. Это моя цель (не в том смысле, что я сделаю, а в том смысле, что не успокоюсь, пока она не будет достигнута)

0

56

Лис написал(а):

Но теоретически его можно сделать.

С чего-то нужно начинать. Требования будут повышаться по мере развития, таков путь прогресса.

PS. Русифицированный hexdump - rex, который я давал выше, написан на си. Если есть желание можете написать его на ассемблере.

Отредактировано Ivan (2024-09-12 19:38:22)

0

57

Ivan написал(а):

Русифицированный hexdump - rex, который я давал выше, написан на си. Если есть желание можете написать его на ассемблере.

Вот как раз утилиту дампа смысла переписывать на ассемблер нет, так как она не входит в состав минимально необходимого кода.

Но в принципе можно, да. В качестве примера консольной утилиты на ассемблере.
Но можно и просто чистый пример написать, в качестве примера.

0

58

Лис написал(а):

2) утилиту вывода дампа можно написать, чтобы она выводила в кириллице.
Тогда станет возможным сравнение байтов в исходнике, и байтов в дампе.
Сейчас они визуально разные, потому что в дампе используется латиница

Вы писали ранее про hexdump, я ее реализовал (rex), могу с исходниками кинуть, а не только бинарник.

Лис написал(а):

В качестве примера консольной утилиты на ассемблере.

Можно, правда на данном этапе будет рановато - ассемблер сейчас ограниченный.

0

59

Ivan написал(а):

Вы писали ранее про hexdump, я ее реализовал (rex), могу с исходниками кинуть, а не только бинарник.

Я очень рад.

Ivan написал(а):

могу с исходниками кинуть

Чтобы что? Чтобы поиздеваться над Лисом? (мол, он такой простой код не мог написать).
Теоретически это вам нужно выложить, чтобы привлечь людей в команду.
Но почему-то у вас такого желания нет. И это странно. Я и говорю - что-то "не так" с мотивацией.

Что же это может быть? Я вижу только одну причину для такого - Ivan хочет разработать коммерческое решение.
Именно поэтому он анонсирует доступность, но с условиями ("потом, может быть, если сильно попросишь")

И что характерно, конкретно мне эта утилита ничем не поможет. Я не программирую, лапки же.

0

60

Лис написал(а):

Теоретически это вам нужно выложить, чтобы привлечь людей в команду.

Теория.

Лис написал(а):

И что характерно, конкретно мне эта утилита ничем не поможет. Я не программирую, лапки же.

Ну а зачем тогда спрашивали если и не программируете?
С исходниками, без, Лис программировать не будет.

0