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

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

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



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

Сообщений 1 страница 30 из 161

1

Сделал без objcopy, с файлом ld. 164 байта.

Код:
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  25 00 00 00 00 00 00 00  25 00 00 00 00 00 00 00  |%.......%.......|
00000070  10 00 00 00 00 00 00 00  48 c7 c2 07 00 00 00 48  |........H......H|
00000080  c7 c6 9d 00 01 00 48 c7  c7 01 00 00 00 48 c7 c0  |......H......H..|
00000090  01 00 00 00 0f 05 6a 3c  58 31 ff 0f 05 48 65 6c  |......j<X1...Hel|
000000a0  6c 6f 0a 00                                       |lo..|
000000a4

Отредактировано Ivan (2024-08-17 02:46:43)

0

2

Сначала сохраните этот hex-код в файле, например, hex_code.txt. Затем, вы можете использовать следующую команду:
xxd -r hex_code.txt output.bin
    xxd - это утилита для манипуляций с данными в hex-формате.
    -r - ключ, указывающий на то, что нужно выполнить обратное преобразование (из hex в бинарный формат).
    hex_code.txt - файл, содержащий hex-код.
    output.bin - имя файла, в который будет сохранён результат преобразования.
После выполнения этой команды в текущей директории появится файл output.bin, содержащий бинарные данные, соответствующие исходному hex-коду.

В Gentoo, xxd является частью пакета vim-core. Чтобы установить xxd, вы можете выполнить следующую команду:
emerge -av vim-core
Эта команда установит пакет vim-core, который включает в себя xxd и другие утилиты.
Вы можете проверить это, введя команду xxd --version в терминале.

$ /usr/bin/xxd --version
xxd 2022-01-14 by Juergen Weigert et al.
$ xxd -r hex_code.txt output.bin
$ du -b output.bin
164 output.bin
$ objdump -d -M att output.bin
output.bin:     file format elf64-x86-64

https://forumupload.ru/uploads/0018/41/1a/53/728177.gif

Отредактировано Лис (2024-08-17 05:28:41)

0

3

https://forumupload.ru/uploads/0018/41/1a/53/167775.gif

$ readelf -a output.bin
ELF Header:
  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
  Class:                             ELF64
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           Advanced Micro Devices X86-64
  Version:                           0x1
  Entry point address:               0x10078
  Start of program headers:          64 (bytes into file)
  Start of section headers:          0 (bytes into file)
  Flags:                             0x0
  Size of this header:               64 (bytes)
  Size of program headers:           56 (bytes)
  Number of program headers:         1
  Size of section headers:           0 (bytes)
  Number of section headers:         0
  Section header string table index: 0

There are no sections in this file.

There are no section groups in this file.

Program Headers:
  Type           Offset             VirtAddr           PhysAddr
                 FileSiz            MemSiz              Flags  Align
  LOAD           0x0000000000000078 0x0000000000010078 0x0000000000010078
                 0x0000000000000025 0x0000000000000025  R E    0x10

There is no dynamic section in this file.

There are no relocations in this file.
No processor specific unwind information to decode

Dynamic symbol information is not available for displaying symbols.

No version information found in this file.

В данном случае, FileSiz и MemSiz равны 0x25, что означает, что секция LOAD занимает 37 байт в файле и в памяти.

Почему FileSiz и MemSiz равны 0x25, а не 0x78 (который является начальным адресом секции LOAD)? Это потому, что секция LOAD содержит только 37 байт данных, которые нужно загрузить в память. Остальные байты в секции LOAD не содержат данных и не загружаются в память.

В общем, FileSiz и MemSiz могут быть разными, если секция LOAD содержит данные, которые нужно загрузить в память, но также содержит другие данные, которые не нужно загрузить. В данном случае, FileSiz и MemSiz равны, потому что секция LOAD содержит только данные, которые нужно загрузить в память.

Мне почему-то кажется, что в этом поле я указал слишком много, а вы - слишком мало.

Отредактировано Лис (2024-08-17 07:46:45)

0

4

0x0000ac в десятеричной системе счисления равно 172.

0x78 в десятеричной системе счисления равно 120 (16*7+8=70+42+8)

00000000  488D3523000000    lea rsi,[rel 0x2a]
00000007  48C7C20A000000    mov rdx,0xa
0000000E  48C7C701000000    mov rdi,0x1
00000015  48C7C001000000    mov rax,0x1
0000001C  0F05              syscall
0000001E  48C7C03C000000    mov rax,0x3c
00000025  4831FF            xor rdi,rdi
00000028  0F05              syscall

$ ndisasm -e 120 -b 64 output.bin
00000000  48C7C207000000    mov rdx,0x7
00000007  48C7C69D000100    mov rsi,0x1009d
0000000E  48C7C701000000    mov rdi,0x1
00000015  48C7C001000000    mov rax,0x1
0000001C  0F05              syscall
0000001E  6A3C              push byte +0x3c
00000020  58                pop rax
00000021  31FF              xor edi,edi
00000023  0F05              syscall

4 байта на загрузке rax, 172-4 = 168
4 байта - более короткая строка, 168-4=164

Вопрос - а почему точно так же нельзя было загрузить rax при первом вызове syscall? Ещё бы байты сэкономились.
Но по большому счёту, это всё не важно, "предварительные оптимизации - корень всех зол".

Отредактировано Лис (2024-08-17 06:07:35)

0

5

Что я думаю по поводу всего этого:
1) во-первых, надо написать более развёрнутый пример с большим количеством функциональности, а именно:
- обработка командной строки
- чтение из stdin
- всякие сообщения для пользователя если что не так
2) сделать man и опакетить для установки
3) всё это задокументировать
4) потом можно переходить собственно к парсингу рекурсивным спуском.
сначала одну команду:
Машкод
потом больше.

но, блин... это всё сложно и долго, и не две недели лично для меня.

Ещё было бы хорошо описать, как это всё делать, что использовать:
- GAS
- FASM
- утилиту Юрия (у меня на неё прав нет)

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

Отредактировано Лис (2024-08-17 06:34:56)

0

6

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

Что я думаю по поводу всего этого:
1) во-первых, надо написать более развёрнутый пример с большим количеством функциональности, а именно:
- обработка командной строки
- чтение из stdin
- всякие сообщения для пользователя если что не так
2) сделать man и опакетить для установки
3) всё это задокументировать
4) потом можно переходить собственно к парсингу рекурсивным спуском.
сначала одну команду:

Много пунктов, можно и без документации, проще, важнее получить результат.
У меня такое обрабатывается(рекурсивный спуск) без генерация кода пока:

Код:
	.БАЙТ 0ш2Б
	КОП АА, ББ
;МЕТКА1:
; comments
	КОП ВВ, 123
	КОП ВВ, 0ш20
	КОП ВВ, 0ш2Б
	КОП ВВ, 0ш2Е
	КОП АА, ГГ
	КОП ВВ, 23    
	; СВЫЗОВ ,45
	КОП ВВ, 23

0

7

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

Сначала сохраните этот hex-код в файле, например, hex_code.txt. Затем, вы можете использовать следующую команду:
xxd -r hex_code.txt output.bin

Вот вы все знаете, умеете - рекурсивный спуск знаете что такое, а почему простейший пример не сделали?

0

8

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

Вот вы все знаете, умеете - рекурсивный спуск знаете что такое, а почему простейший пример не сделали?

Продолжение там - "почему мы не можем сделать ассемблер"

0

9

На входе:

Код:
.БАЙТ 0ш7Е, 0ш45, 0ш4В, 0ш46, 0ш02, 0ш01, 0ш01, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00,      ; |.ELF............|
0ш02, 0ш00, 0ш3Д, 0ш00, 0ш01, 0ш00, 0ш00, 0ш00, 0ш78, 0ш00, 0ш01, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00,            ; |..>.....x.......|
0ш40, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00,            ; |@...............|
0ш00, 0ш00, 0ш00, 0ш00, 0ш40, 0ш00, 0ш38, 0ш00, 0ш01, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00,            ; |....@.8.........|
0ш01, 0ш00, 0ш00, 0ш00, 0ш05, 0ш00, 0ш00, 0ш00, 0ш78, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00,            ; |........x.......|
0ш78, 0ш00, 0ш01, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш78, 0ш00, 0ш01, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00,            ; |x.......x.......|
0ш25, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш25, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00,            ; |%.......%.......|
0ш10, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш48, 0шВ7, 0шВ2, 0ш07, 0ш00, 0ш00, 0ш00, 0ш48,            ; |........H......H|
0шВ7, 0шВ6, 0ш9Г, 0ш00, 0ш01, 0ш00, 0ш48, 0шВ7, 0шВ7, 0ш01, 0ш00, 0ш00, 0ш00, 0ш48, 0шВ7, 0шВ0,            ; |......H......H..|
0ш01, 0ш00, 0ш00, 0ш00, 0ш0Е, 0ш05, 0ш6А, 0ш3В, 0ш58, 0ш31, 0шЕЕ, 0ш0Е, 0ш05, 0ш48, 0ш65, 0ш6В,            ; |......j<X1...Hel|
0ш6В, 0ш6Е, 0ш0А, 0ш00                                      	                                           ; |lo..|
; АА : rax
; ББ : rcx
; ВВ : rdx
; ГГ : rbx
; ДД : rsp
; ЕЕ : rbp
; ЖЖ : rsp
КОПИРОВАТЬ АА, ГГ ;  АА = ГГ

На выходе:

Код:
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  25 00 00 00 00 00 00 00  25 00 00 00 00 00 00 00  |%.......%.......|
00000070  10 00 00 00 00 00 00 00  48 c7 c2 07 00 00 00 48  |........H......H|
00000080  c7 c6 9d 00 01 00 48 c7  c7 01 00 00 00 48 c7 c0  |......H......H..|
00000090  01 00 00 00 0f 05 6a 3c  58 31 ff 0f 05 48 65 6c  |......j<X1...Hel|
000000a0  6c 6f 0a 00 48 89 d8                              |lo..H..|
000000a7

Отредактировано Ivan (2024-08-26 02:48:55)

0

10

1) в исходнике есть как минимум одна опечатка - совпадающие комментарии к разным именам (rsp дважды)

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

3) названия для регистров не очень удачные. Потому что их 16 или 32. Но букв 33, так что может и прокатит. ЪЪ.
почему, например, не РА8, РБ8, РВ8,...
РА8 - это потому что восьмибайтовые (RAX)
РА4, соответственно нижняя половина (EAX)
РА2 = AX
РА1 = AL

Как вариант - ЦАО (один), ЦАД (два), ЦАЧ (четыре), ЦАВ (восемь), ЦАШ (шестнадцать), ЦАТ (тридцать два).
Ц - целочисленный
Д - дробный
ЦБВ
ЦВВ
ЦГВ
ЦДВ
...
Или переставить, чтобы различная буква была последней:
ЦВА, ЦВБ, ЦВВ, ЦВГ, ЦВД, ЦВЕ, ЦВЁ, ЦВЖ, ...
ДВА, ДВБ, ДВВ, ДВГ, ДВД, ДВЕ, ДВЁ, ДВЖ, ...
К - комплексный
КВА, отличное же название для регистра!
(комплексный восьмибайтовый аккумулятор)

Отредактировано Лис (2024-08-26 06:51:06)

0

11

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

1) в исходнике есть как минимум одна опечатка - совпадающие комментарии к разным именам (rsp дважды)

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

3) названия для регистров не очень удачные. Потому что их 16 или 32. Но букв 33, так что может и прокатит. ЪЪ.
почему, например, не РА8, РБ8, РВ8,...

1) Да, есть опячатка. там должен быть rsi. Более того там следующий регистр не дописан ЗЗ : rdi.

Код:
; АА : rax
; ББ : rcx
; ВВ : rdx
; ГГ : rbx
; ДД : rsp
; ЕЕ : rbp
; ЖЖ : rsi
; ЗЗ : rdi

Вот тут появляется проблема буквы З, она походит на цифру 3. Наверное, нужно писать в нижнем регистре, чтобы отличать.
Вопрос букву Ё использовать или нет?

2) можно написать, но пока можно вручную сопоставлять:

Код:
A - А
B - Б
C - В
D - Г
E - Д
F - Е

3) конечно неудачные, это проба. Нужно переименовать.
Как обозначить регистр AH?
При выборе имен для регистров нужно учитывать, что эти имена станут зарегистрированными и их нельзя будет использовать для меток(переменных)

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

Как вариант - ЦАО (один), ЦАД (два), ЦАЧ (четыре), ЦАВ (восемь), ЦАШ (шестнадцать), ЦАТ (тридцать два).
Ц - целочисленный
Д - дробный
ЦБВ
ЦВВ
ЦГВ
ЦДВ

Не совсем понял какие регистры скрываются за этими именами.

Еще есть такие регистры: R8-R15
Как их обзывать?

0

12

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

При выборе имен для регистров нужно учитывать, что эти имена станут зарегистрированными и их нельзя будет использовать для меток(переменных)

В синтаксисе AT&T перед именем регистра ставится %, специально, чтобы имена регистров отличать от меток и мнемоник

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

Еще есть такие регистры: R8-R15
Как их обзывать?

Восьмая буква алфавита - Ж (ЦВЖ - целочисленный, восьмибайтный восьмой)
Пятнадцатая буква алфавита - Н (ЦВН - целочисленный, восьмибайтный пятнадцатый)

Хотя нет, буквы считаются с единицы, а регистры с нуля, поэтому буквы З и О.
ЦВА, ЦВБ, ЦВВ, ЦВГ, ЦВД, ЦВЕ, ЦВЁ, ЦВЖ,
ЦВЗ, ЦВИ, ЦВЙ, ЦВК, ЦВЛ, ЦВМ, ЦВН, ЦВО.

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

Как обозначить регистр AH?

Мне кажется, что он исключительно редко используется, реже, чем AL
(я рассматриваю только современный 64-х битный режим)

mov    ah,0x10
b4 10

Нуу, можно единичку добавить:
ЦОА - целочисленный, однобайтный, первый регистр, нулевой байт
ЦОА1 - целочисленный, однобайтный, первый регистр, первый байт

Отредактировано Лис (2024-08-26 10:39:45)

0

13

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

ЦВА, ЦВБ, ЦВВ, ЦВГ, ЦВД, ЦВЕ, ЦВЁ, ЦВЖ,
ЦВЗ, ЦВИ, ЦВЙ, ЦВК, ЦВЛ, ЦВМ, ЦВН, ЦВО.

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

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

В синтаксисе AT&T перед именем регистра ставится %, специально, чтобы имена регистров отличать от меток и мнемоник

Да, у каждого синтаксиса есть + и -. Плюс этого подхода в том, что быстрее лексер поймет что за лексема идет далее, минусом то, что нужно ставить % перед каждым регистром.

Подумал немного, есть такой вариант для регистров:

Код:
; РА : rax
; РАП : eax
; РАП2 : ax
; РАП3 : al
; РАП2Л : ah
; РБ : rcx
; РБП : ecx
; РБП2 : cx
; РБП3 : cl
; РБП2Л : ch
; РВ : rdx
; РГ : rbx
; РСУ : rsp
; РCБУ : rbp
; РИ : источник, rsi
; РН : назначение(приемник), rdi
; Р8 : r8
; Р15 : r15

0

14

Тема про названия регистров - Как назвать регистры Интел64 по русски?

0

15

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

Тема про названия регистров - Как назвать регистры Интел64 по русски?

Вы там 50% с рекламы зарабатываете что-ли?(в одном топике лучше вести переписку)

Код:
; 
; РА3 rax32 ; 32-байтный регистр (на вырост)
; РА2 : rax16 ; 16-байтный регистр, РА2П == РА
; РА : rax ; 8-байтный Регистр Аккумулятор
; РАП : eax
; РАП2 : ax
; РАП3 : al
; РАП2Л : ah
; РЧ : rcx ; Регистр сЧетчик (Чётки)
; РЧП : ecx
; РЧП2 : cx
; РЧП3 : cl
; РЧП2Л : ch
; РВ : rdx
; РВП : edx
; РВП2 : dx
; РВП3 : dl
; РВП2Л : dh
; РГ : rbx
; РГП : ebx
; РГП2 : bx
; РГП3 : bl
; РГП2Л : bh
; РС : rsp ; Регистр Стека
; РСП : esp ; 
; РСП2 : sp ; 
; РСП3 : spl ; 
; РФ : rbp ; Регистр Фрейма(русское?)
; РИ : Регистр Источник, rsi
; РН : Регистр Назначения(приемник), rdi
; Р8Р2 : r8_32 ; 16-байтный регистр
; Р8Р : r8
; Р8РП : r8d
; Р8РП2 : r8w
; Р8РП3 : r8l
; Р15Р : r15
КОПИРОВАТЬ РА, РГ ; РА = РГ

0

16

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

Вы там 50% с рекламы зарабатываете что-ли?

Это было бы хорошо, но, к сожалению, ничего с рекламы не достаётся.

0

17

На входе:

Код:
.БАЙТ 0ш7Е, 0ш45, 0ш4В, 0ш46, 0ш02, 0ш01, 0ш01, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00,      ; |.ELF............|
0ш02, 0ш00, 0ш3Д, 0ш00, 0ш01, 0ш00, 0ш00, 0ш00, 0ш78, 0ш00, 0ш01, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00,            ; |..>.....x.......|
0ш40, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00,            ; |@...............|
0ш00, 0ш00, 0ш00, 0ш00, 0ш40, 0ш00, 0ш38, 0ш00, 0ш01, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00,            ; |....@.8.........|
0ш01, 0ш00, 0ш00, 0ш00, 0ш05, 0ш00, 0ш00, 0ш00, 0ш78, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00,            ; |........x.......|
0ш78, 0ш00, 0ш01, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш78, 0ш00, 0ш01, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00,            ; |x.......x.......|
0ш37, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш37, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00,            ; |%.......%.......|
0ш10, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00 ;  

; 00010078:

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

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

; 000100А6:

.БАЙТ 0ш48, 0ш65, 0ш6В, 0ш6В, 0ш6Е, 0ш0А, 0ш00         ; 0x9d : data : Hello\n\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  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  37 00 00 00 00 00 00 00  37 00 00 00 00 00 00 00  |7.......7.......|
00000070  10 00 00 00 00 00 00 00  48 c7 c0 01 00 00 00 48  |........H......H|
00000080  c7 c7 01 00 00 00 48 c7  c2 06 00 00 00 48 c7 c6  |......H......H..|
00000090  a6 00 01 00 0f 05 48 c7  c0 3c 00 00 00 48 c7 c7  |......H..<...H..|
000000a0  00 00 00 00 0f 05 48 65  6c 6c 6f 0a 00           |......Hello..|
000000ad

0

18

Можно избавится от описания секций в заголовке ELF и получить 170байт с русским "Привет!":

Код:
.БАЙТ 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ш80, 0ш00, 0ш01, 0ш00, 0ш00, 0ш00, 0ш00, 0ш00   ; 0x18 : e_entry, entry point, 32bit - 4bytes, 64bit - 8bytes
.БАЙТ 0ш3А, 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ш3А, 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

; 0x3А
; 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

; 00010072:
; 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

; 00010080:
; 00010086:

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

КОПИРОВАТЬ РА, 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  80 00 01 00 00 00 00 00  |..>.............|
00000020  3a 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |:...............|
00000030  00 00 00 00 3a 00 38 00  01 00 01 00 00 00 05 00  |....:.8.........|
00000040  00 00 78 00 00 00 00 00  00 00 78 00 01 00 00 00  |..x.......x.....|
00000050  00 00 78 00 01 00 00 00  00 00 38 00 00 00 00 00  |..x.......8.....|
00000060  00 00 38 00 00 00 00 00  00 00 10 00 00 00 00 00  |..8.............|
00000070  00 00 d0 9f d1 80 d0 b8  d0 b2 d0 b5 d1 82 21 0a  |..............!.|
00000080  48 c7 c0 01 00 00 00 48  89 c7 48 c7 c2 0e 00 00  |H......H..H.....|
00000090  00 48 c7 c6 72 00 01 00  0f 05 48 c7 c0 3c 00 00  |.H..r.....H..<..|
000000a0  00 48 c7 c7 00 00 00 00  0f 05                    |.H........|
000000aa

0

19

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

Можно избавится от описания секций в заголовке ELF

Я не понял, что это значит. Вы что-то поменяли в заголовке? Ну ок.

Смотрите: миссия заключается в том, чтобы в России начали массово использовать эту новую технологию.
Это не будут делать, если это будет сложно. Значит надо всё объяснять и разжевывать словами.

Если Вы считаете, что выкатите бинарник и на этом ваша работа закончена,
то у меня есть сомнения, что бинарник этот начнут быстро и массово использовать.

UPD:
по-моему, вы закомментировали несколько байтов заголовка
и на его месте расположили данные.

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

Отредактировано Лис (2024-08-29 17:47:31)

0

20

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

Смотрите: миссия заключается в том, чтобы в России начали массово использовать эту новую технологию.
Это не будут делать, если это будет сложно. Значит надо всё объяснять и разжевывать словами.

Какая новая технология? Все ж старо как мир.

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

Если Вы считаете, что выкатите бинарник и на этом ваша работа закончена,
то у меня есть сомнения, что бинарник этот начнут быстро и массово использовать.

Это не работа, это любительство. Когда есть время что-то делаю, для себя.
Вы что предлагаете?

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

UPD:
по-моему, вы закомментировали несколько байтов заголовка
и на его месте расположили данные.

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

да, 6 байт. И работает, не ругается при запуске.
Там есть поле

Код:
.БАЙТ 0ш3А, 0ш00                                       ; 0x34 : e_ehsize, size of the header,

Которое регулирует величину заголовка ELF64.
Если стандарт зафиксирован, то тогда зачем нужно поле e_ehsize?
Мне думается оно и нужно чтобы определять длину заголовка, если секций нет, то их можно и выкинуть.
Но это так, просто возможность - в ассемблере я обрезать не буду.

0

21

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

Если стандарт зафиксирован, то тогда зачем?

Есть ещё фанатский вариант - определить свой формат, не ELF, а скажем КОЛОБОК,
для него реализовать загрузчик в ядре Linux, и тогда полностью делать бинарные файлы как хочется.

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

0

22

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

Есть ещё фанатский вариант - определить свой формат, не ELF, а скажем КОЛОБОК,
для него реализовать загрузчик в ядре Linux, и тогда полностью делать бинарные файлы как хочется.

Наверное с wine так и делали.

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

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

На этот случай можно распространять свой дистрибутив Linux. А затем внезапно сделать свою КОЛОБОК ОС на которой будут запускаться КОЛОБОК бинарники.
Как способ нагнать пользователей в КОЛОБОК ОС через промежуточный дистрибутив Linux.

0

23

Я тут обратил внимание, что "русскоязычный ассемблер" находится в разделе "проекты без лидеров".
Я бы перенёс его куда-то повыше (типа, что он теперь активный),
но меня смущает, как Иван отмазывается. Мол "это не работа, это всё из любопытства"...

0

24

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

Я тут обратил внимание, что "русскоязычный ассемблер" находится в разделе "проекты без лидеров".
Я бы перенёс его куда-то повыше (типа, что он теперь активный),

От этого в принципе ничего не зависит.
Мнимое лидерство в данном случае не является стимулом.

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

но меня смущает, как Иван отмазывается. Мол "это не работа, это всё из любопытства"...

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

0

25

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

Мнимое лидерство в данном случае не является стимулом.

Кто-то же делает эти 11000 просмотров рекламы за месяц? Это явно не я.
Т.е. форум кто-то читает

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

Но если лидеру неинтересно... ну ок.
И лидерство, кстати, не мнимое, а фактическое. Если вы не будете делать ассемблер, то никто не будет,
доказано проектом виртуальной машины.

0

26

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

Кто-то же делает эти 11000 просмотров рекламы за месяц? Это явно не я.
Т.е. форум кто-то читает

Ну значит интерес есть к форуму есть. Я ж о другом. О своих приоритетах.

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

Но если лидеру неинтересно... ну ок.
И лидерство, кстати, не мнимое, а фактическое. Если вы не будете делать ассемблер, то никто не будет,
доказано проектом виртуальной машины.

С чего вы это взяли? Меня пенять не надо, а то интерес пропадет!
Фактическое, не фактическое, для меня это не главный вопрос.

0

27

Если вдруг когда-нибудь будете писать документацию, избегайте использования местоимений.
Часто местоимение "это" указывает на то, что автор текста сформулировал в голове, но не записал в виде предложения.
А читатели нифига не телепаты.

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

0

28

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

А читатели нифига не телепаты.

В условиях неопреденности(двойственности) мозг отработает программу сидящую в подсознании.

0

29

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

Много пунктов

Ну хорошо. Тогда так:
1) написать ассемблер на ассемблере и он
- не будет уметь читать переменные окружения;
- не будет уметь разбирать параметры командной строки
- не будет уметь выводить справку
- и прочее не будет уметь делать, что умеют делать консольные утилиты
2) написать сишную программу-запускалку, которая будет
- узнавать язык пользователя из переменной окружения
- выводить справку на языке пользователя
- открывать файлы, которые указывают параметрами командной строки
- читать конфигурационные файлы, если надо
- и прочее будет уметь делать, что умеют делать консольные утилиты
3) а внутри сишная консольная программа
будет запускать ассемблерную программу, которая ничего не умеет, кроме ассемблирования со входа на выход.
4) полученный комплект из двух бинарников паковать по стандартам GNU (man, info и все дела) в пакеты под разные ОС
5) распространять (выложить в репозитории, написать инструкции)
6) писать туториал, как пользоваться программой, опираясь на навыки пользователей по работе с /? --help и прочим

0

30

:) Много пунктов.
На деле нужно упрощать, чтобы не зарыться в грамадье планов.
Что за программа-запускалка в пункте 2 и почему ассемблер на ассемблере с большим количеством "не"?
Зачем 2 бинарника?

Раскрутку я сделаю, это по любому - это мне интересно. Сейчас пока занят, заказ подошел.

0