История изменений
Исправление hateyoufeel, (текущая версия) :
Обе компании используют термин EPIC. Это не случайность.
Думаю, тебе стоит рассказать перцам из МЦСТ, что они не VLIW сделали. Потому что:
Микропроцессор «Эльбрус» (1891ВМ4Я) – универсальный микропроцессор с архитектурой «Эльбрус» на основе архитектуры широкого командного слова (VLIW).
Отсюда: http://www.mcst.ru/Elbrus
Что за дурацкие попытки шланговать? Ты же прекрасно понимаешь, что имеется в виду средняя длина инструкций в используемом софте. Какой-нибудь веб-сервер там, текстовый или графический редактор, и тому подобное.
Прости, я не телепат чтобы знать заранее о том, что именно лоровские шизофреники имеют ввиду. Но специально для тебя я набыдлокодил небольшой говноскрипт, считающий среднюю длину инструкции в бинарике. Итак…
Во-первых, судя по первой попавшейся статье средняя длина инструкций у x86-64 заметно больше 8 бит. И даже больше 16 бит. И даже больше 32 бит.
Последнее – ЛПП. Скрипт:
#!/usr/bin/env python3
from os import popen
import sys
if len(sys.argv) != 2:
print("Provide binary path")
sys.exit(-1)
binpath = sys.argv[1]
cmd = "objdump -r -j .text -d {} | cut -d: -f2 | cut -d$'\t' -f 2".format(binpath)
ilens = []
ldict = {}
allowed = set(string.digits + 'a' + 'b' + 'c' + 'd' + 'e' + 'f')
with popen(cmd) as output:
for instr in output:
instr = instr.strip()
instr = instr.replace(' ', '')
l = len(instr)
# skip invalid output from objdump
if l == 0:
continue
if not (set(instr) <= allowed):
continue
l = l * 4 # 4 bits per hex character
ilens.append(l)
ldict[l] = ldict.get(l, 0) + 1
avg = sum(ilens) / len(ilens)
print(f"Average instruction length: {avg} bits")
for l,n in ldict.items():
print(f"Number of {l} bit instructions: {n}")
Результаты на разных прогах:
△ ~ ./instrlen.py /nix/store/qzp74yjsymgpfmr0shcqdzzcrf90x83c-coreutils-full-9.5/bin/coreutils
Average instruction length: 31.862272649418344 bits
Number of 40 bit instructions: 48979
Number of 56 bit instructions: 26298
Number of 16 bit instructions: 42203
Number of 24 bit instructions: 49934
Number of 8 bit instructions: 9953
Number of 32 bit instructions: 22353
Number of 48 bit instructions: 16300
▲ ~ ./instrlen.py /nix/store/7lyjbaz0s8rgy4j4iyxz47gi78w72cm0-librewolf-128.0-2/lib/librewolf/librewolf
Average instruction length: 30.25957125758014 bits
Number of 8 bit instructions: 15486
Number of 16 bit instructions: 25239
Number of 32 bit instructions: 34675
Number of 24 bit instructions: 45895
Number of 40 bit instructions: 24776
Number of 48 bit instructions: 10936
Number of 56 bit instructions: 19275
▲ ~ ./instrlen.py /nix/store/06dr82w4336x3iwyik7b4criw3gxbwhs-ghc-9.8.2/lib/ghc-9.8.2/bin/ghc-9.8.2
Average instruction length: 29.644412695634006 bits
Number of 56 bit instructions: 58068
Number of 8 bit instructions: 37035
Number of 32 bit instructions: 77798
Number of 40 bit instructions: 32445
Number of 16 bit instructions: 92952
Number of 48 bit instructions: 15599
Number of 12 bit instructions: 3239
Number of 24 bit instructions: 37032
▲ ~ ./instrlen.py /nix/store/sdbyh7alvqicf4m42dl9gynqsb8alxzs-reaper-7.18/opt/REAPER/.reaper-wrapped
Average instruction length: 31.763740057415408 bits
Number of 8 bit instructions: 150371
Number of 40 bit instructions: 408041
Number of 48 bit instructions: 236383
Number of 56 bit instructions: 275544
Number of 32 bit instructions: 292061
Number of 16 bit instructions: 418928
Number of 24 bit instructions: 485239
Number of 12 bit instructions: 71
▲ ~ ./instrlen.py /nix/store/rb9n6mhvp93f9kyir6zijajbvprnvp3c-nginx-1.26.1/bin/nginx
Average instruction length: 31.912063492063492 bits
Number of 32 bit instructions: 45594
Number of 16 bit instructions: 42845
Number of 24 bit instructions: 49604
Number of 8 bit instructions: 15590
Number of 56 bit instructions: 32944
Number of 48 bit instructions: 15033
Number of 40 bit instructions: 50389
В общем, средняя длина получается чуть меньше 32 бит. Больше всего инструкций по 2 и 3 байта. Я так прозреваю, в остальных раздутая длина вызвана константами или смещениями.
P.S. хз откуда 12-битные инструкции взялись. Возможно, артефакт из objdump. Но в среднем цифры примерно такие.
Исправление hateyoufeel, :
Обе компании используют термин EPIC. Это не случайность.
Думаю, тебе стоит рассказать перцам из МЦСТ, что они не VLIW сделали. Потому что:
Микропроцессор «Эльбрус» (1891ВМ4Я) – универсальный микропроцессор с архитектурой «Эльбрус» на основе архитектуры широкого командного слова (VLIW).
Отсюда: http://www.mcst.ru/Elbrus
Что за дурацкие попытки шланговать? Ты же прекрасно понимаешь, что имеется в виду средняя длина инструкций в используемом софте. Какой-нибудь веб-сервер там, текстовый или графический редактор, и тому подобное.
Прости, я не телепат чтобы знать заранее о том, что именно лоровские шизофреники имеют ввиду. Но специально для тебя я набыдлокодил небольшой говноскрипт, считающий среднюю длину инструкции в бинарике. Итак…
Во-первых, судя по первой попавшейся статье средняя длина инструкций у x86-64 заметно больше 8 бит. И даже больше 16 бит. И даже больше 32 бит.
Последнее – ЛПП. Скрипт:
#!/usr/bin/env python3
from os import popen
import sys
if len(sys.argv) != 2:
print("Provide binary path")
sys.exit(-1)
binpath = sys.argv[1]
cmd = "objdump -r -j .text -d {} | cut -d: -f2 | cut -d$'\t' -f 2".format(binpath)
ilens = []
ldict = {}
allowed = set(string.digits + 'a' + 'b' + 'c' + 'd' + 'e' + 'f')
with popen(cmd) as output:
for instr in output:
instr = instr.strip()
instr = instr.replace(' ', '')
l = len(instr)
# skip invalid output from objdump
if l == 0:
continue
if not (set(instr) <= allowed):
continue
l = l * 4 # 4 bits per hex character
ilens.append(l)
ldict[l] = ldict.get(l, 0) + 1
avg = sum(ilens) / len(ilens)
print(f"Average instruction length: {avg} bits")
for l,n in ldict.items():
print(f"Number of {l} bit instructions: {n}")
Результаты на разных прогах:
△ ~ ./instrlen.py /nix/store/qzp74yjsymgpfmr0shcqdzzcrf90x83c-coreutils-full-9.5/bin/coreutils
Average instruction length: 31.862272649418344 bits
Number of 40 bit instructions: 48979
Number of 56 bit instructions: 26298
Number of 16 bit instructions: 42203
Number of 24 bit instructions: 49934
Number of 8 bit instructions: 9953
Number of 32 bit instructions: 22353
Number of 48 bit instructions: 16300
▲ ~ ./instrlen.py /nix/store/7lyjbaz0s8rgy4j4iyxz47gi78w72cm0-librewolf-128.0-2/lib/librewolf/librewolf
Average instruction length: 30.25957125758014 bits
Number of 8 bit instructions: 15486
Number of 16 bit instructions: 25239
Number of 32 bit instructions: 34675
Number of 24 bit instructions: 45895
Number of 40 bit instructions: 24776
Number of 48 bit instructions: 10936
Number of 56 bit instructions: 19275
▲ ~ ./instrlen.py /nix/store/06dr82w4336x3iwyik7b4criw3gxbwhs-ghc-9.8.2/lib/ghc-9.8.2/bin/ghc-9.8.2
Average instruction length: 29.644412695634006 bits
Number of 56 bit instructions: 58068
Number of 8 bit instructions: 37035
Number of 32 bit instructions: 77798
Number of 40 bit instructions: 32445
Number of 16 bit instructions: 92952
Number of 48 bit instructions: 15599
Number of 12 bit instructions: 3239
Number of 24 bit instructions: 37032
▲ ~ ./instrlen.py /nix/store/sdbyh7alvqicf4m42dl9gynqsb8alxzs-reaper-7.18/opt/REAPER/.reaper-wrapped
Average instruction length: 31.763740057415408 bits
Number of 8 bit instructions: 150371
Number of 40 bit instructions: 408041
Number of 48 bit instructions: 236383
Number of 56 bit instructions: 275544
Number of 32 bit instructions: 292061
Number of 16 bit instructions: 418928
Number of 24 bit instructions: 485239
Number of 12 bit instructions: 71
▲ ~ ./instrlen.py /nix/store/rb9n6mhvp93f9kyir6zijajbvprnvp3c-nginx-1.26.1/bin/nginx
Average instruction length: 31.912063492063492 bits
Number of 32 bit instructions: 45594
Number of 16 bit instructions: 42845
Number of 24 bit instructions: 49604
Number of 8 bit instructions: 15590
Number of 56 bit instructions: 32944
Number of 48 bit instructions: 15033
Number of 40 bit instructions: 50389
В общем, средняя длина получается чуть меньше 32 бит. Больше всего инструкций по 2 и 3 байта. Я так прозреваю, в остальных раздутая длина вызвана константами или смещениями.
P.S. хз откуда 12-битные инструкции в REAPER взялись. Возможно, артефакт из objdump. Но в среднем цифры примерно такие.
Исправление hateyoufeel, :
Обе компании используют термин EPIC. Это не случайность.
Думаю, тебе стоит рассказать перцам из МЦСТ, что они не VLIW сделали. Потому что:
Микропроцессор «Эльбрус» (1891ВМ4Я) – универсальный микропроцессор с архитектурой «Эльбрус» на основе архитектуры широкого командного слова (VLIW).
Отсюда: http://www.mcst.ru/Elbrus
Что за дурацкие попытки шланговать? Ты же прекрасно понимаешь, что имеется в виду средняя длина инструкций в используемом софте. Какой-нибудь веб-сервер там, текстовый или графический редактор, и тому подобное.
Прости, я не телепат чтобы знать заранее о том, что именно лоровские шизофреники имеют ввиду. Но специально для тебя я набыдлокодил небольшой говноскрипт, считающий среднюю длину инструкции в бинарике. Итак…
Во-первых, судя по первой попавшейся статье средняя длина инструкций у x86-64 заметно больше 8 бит. И даже больше 16 бит. И даже больше 32 бит.
Последнее – ЛПП. Скрипт:
#!/usr/bin/env python3
from os import popen
import sys
if len(sys.argv) != 2:
print("Provide binary path")
sys.exit(-1)
binpath = sys.argv[1]
cmd = "objdump -r -j .text -d {} | cut -d: -f2 | cut -d$'\t' -f 2".format(binpath)
ilens = []
ldict = {}
allowed = set(string.digits + 'a' + 'b' + 'c' + 'd' + 'e' + 'f')
with popen(cmd) as output:
for instr in output:
instr = instr.strip()
instr = instr.replace(' ', '')
l = len(instr)
# skip invalid output from objdump
if l == 0:
continue
if not (set(instr) <= allowed):
continue
l = l * 4 # 4 bits per hex character
ilens.append(l)
ldict[l] = ldict.get(l, 0) + 1
avg = sum(ilens) / len(ilens)
print(f"Average instruction length: {avg} bits")
for l,n in ldict.items():
print(f"Number of {l} bit instructions: {n}")
Результаты на разных прогах:
△ ~ ./instrlen.py /nix/store/qzp74yjsymgpfmr0shcqdzzcrf90x83c-coreutils-full-9.5/bin/coreutils
Average instruction length: 31.862272649418344 bits
Number of 40 bit instructions: 48979
Number of 56 bit instructions: 26298
Number of 16 bit instructions: 42203
Number of 24 bit instructions: 49934
Number of 8 bit instructions: 9953
Number of 32 bit instructions: 22353
Number of 48 bit instructions: 16300
▲ ~ ./instrlen.py /nix/store/7lyjbaz0s8rgy4j4iyxz47gi78w72cm0-librewolf-128.0-2/lib/librewolf/librewolf
Average instruction length: 30.25957125758014 bits
Number of 8 bit instructions: 15486
Number of 16 bit instructions: 25239
Number of 32 bit instructions: 34675
Number of 24 bit instructions: 45895
Number of 40 bit instructions: 24776
Number of 48 bit instructions: 10936
Number of 56 bit instructions: 19275
▲ ~ ./instrlen.py /nix/store/06dr82w4336x3iwyik7b4criw3gxbwhs-ghc-9.8.2/lib/ghc-9.8.2/bin/ghc-9.8.2
Average instruction length: 29.644412695634006 bits
Number of 56 bit instructions: 58068
Number of 8 bit instructions: 37035
Number of 32 bit instructions: 77798
Number of 40 bit instructions: 32445
Number of 16 bit instructions: 92952
Number of 48 bit instructions: 15599
Number of 12 bit instructions: 3239
Number of 24 bit instructions: 37032
▲ ~ ./instrlen.py /nix/store/sdbyh7alvqicf4m42dl9gynqsb8alxzs-reaper-7.18/opt/REAPER/.reaper-wrapped
Average instruction length: 31.763740057415408 bits
Number of 8 bit instructions: 150371
Number of 40 bit instructions: 408041
Number of 48 bit instructions: 236383
Number of 56 bit instructions: 275544
Number of 32 bit instructions: 292061
Number of 16 bit instructions: 418928
Number of 24 bit instructions: 485239
Number of 12 bit instructions: 71
▲ ~ ./instrlen.py /nix/store/rb9n6mhvp93f9kyir6zijajbvprnvp3c-nginx-1.26.1/bin/nginx
Average instruction length: 31.912063492063492 bits
Number of 32 bit instructions: 45594
Number of 16 bit instructions: 42845
Number of 24 bit instructions: 49604
Number of 8 bit instructions: 15590
Number of 56 bit instructions: 32944
Number of 48 bit instructions: 15033
Number of 40 bit instructions: 50389
В общем, средняя длина получается чуть меньше 32 бит. Больше всего инструкций по 2 и 3 байта. Я так прозреваю, в остальных раздутая длина вызвана константами или смещениями.
Исправление hateyoufeel, :
Обе компании используют термин EPIC. Это не случайность.
Думаю, тебе стоит рассказать перцам из МЦСТ, что они не VLIW сделали. Потому что:
Микропроцессор «Эльбрус» (1891ВМ4Я) – универсальный микропроцессор с архитектурой «Эльбрус» на основе архитектуры широкого командного слова (VLIW).
Отсюда: http://www.mcst.ru/Elbrus
Что за дурацкие попытки шланговать? Ты же прекрасно понимаешь, что имеется в виду средняя длина инструкций в используемом софте. Какой-нибудь веб-сервер там, текстовый или графический редактор, и тому подобное.
Прости, я не телепат чтобы знать заранее о том, что именно лоровские шизофреники имеют ввиду. Но специально для тебя я набыдлокодил небольшой говноскрипт, считающий среднюю длину инструкции в бинарике. Итак…
Во-первых, судя по первой попавшейся статье средняя длина инструкций у x86-64 заметно больше 8 бит. И даже больше 16 бит. И даже больше 32 бит.
Последнее – ЛПП. Скрипт:
#!/usr/bin/env python3
from os import popen
import sys
if len(sys.argv) != 2:
print("Provide binary path")
sys.exit(-1)
binpath = sys.argv[1]
cmd = "objdump -r -j .text -d {} | cut -d: -f2 | cut -d$'\t' -f 2".format(binpath)
ilens = []
ldict = {}
allowed = set(string.digits + 'a' + 'b' + 'c' + 'd' + 'e' + 'f''')
with popen(cmd) as output:
for instr in output:
instr = instr.strip()
instr = instr.replace(' ', '')
l = len(instr)
# skip invalid output from objdump
if l == 0:
continue
if not (set(instr) <= allowed):
continue
l = l * 4 # 4 bits per hex character
ilens.append(l)
ldict[l] = ldict.get(l, 0) + 1
avg = sum(ilens) / len(ilens)
print(f"Average instruction length: {avg} bits")
for l,n in ldict.items():
print(f"Number of {l} bit instructions: {n}")
Результаты на разных прогах:
△ ~ ./instrlen.py /nix/store/qzp74yjsymgpfmr0shcqdzzcrf90x83c-coreutils-full-9.5/bin/coreutils
Average instruction length: 31.862272649418344 bits
Number of 40 bit instructions: 48979
Number of 56 bit instructions: 26298
Number of 16 bit instructions: 42203
Number of 24 bit instructions: 49934
Number of 8 bit instructions: 9953
Number of 32 bit instructions: 22353
Number of 48 bit instructions: 16300
▲ ~ ./instrlen.py /nix/store/7lyjbaz0s8rgy4j4iyxz47gi78w72cm0-librewolf-128.0-2/lib/librewolf/librewolf
Average instruction length: 30.25957125758014 bits
Number of 8 bit instructions: 15486
Number of 16 bit instructions: 25239
Number of 32 bit instructions: 34675
Number of 24 bit instructions: 45895
Number of 40 bit instructions: 24776
Number of 48 bit instructions: 10936
Number of 56 bit instructions: 19275
▲ ~ ./instrlen.py /nix/store/06dr82w4336x3iwyik7b4criw3gxbwhs-ghc-9.8.2/lib/ghc-9.8.2/bin/ghc-9.8.2
Average instruction length: 29.644412695634006 bits
Number of 56 bit instructions: 58068
Number of 8 bit instructions: 37035
Number of 32 bit instructions: 77798
Number of 40 bit instructions: 32445
Number of 16 bit instructions: 92952
Number of 48 bit instructions: 15599
Number of 12 bit instructions: 3239
Number of 24 bit instructions: 37032
▲ ~ ./instrlen.py /nix/store/sdbyh7alvqicf4m42dl9gynqsb8alxzs-reaper-7.18/opt/REAPER/.reaper-wrapped
Average instruction length: 31.763740057415408 bits
Number of 8 bit instructions: 150371
Number of 40 bit instructions: 408041
Number of 48 bit instructions: 236383
Number of 56 bit instructions: 275544
Number of 32 bit instructions: 292061
Number of 16 bit instructions: 418928
Number of 24 bit instructions: 485239
Number of 12 bit instructions: 71
▲ ~ ./instrlen.py /nix/store/rb9n6mhvp93f9kyir6zijajbvprnvp3c-nginx-1.26.1/bin/nginx
Average instruction length: 31.912063492063492 bits
Number of 32 bit instructions: 45594
Number of 16 bit instructions: 42845
Number of 24 bit instructions: 49604
Number of 8 bit instructions: 15590
Number of 56 bit instructions: 32944
Number of 48 bit instructions: 15033
Number of 40 bit instructions: 50389
В общем, средняя длина получается чуть меньше 32 бит. Больше всего инструкций по 2 и 3 байта. Я так прозреваю, в остальных раздутая длина вызвана константами или смещениями.
Исправление hateyoufeel, :
Обе компании используют термин EPIC. Это не случайность.
Думаю, тебе стоит рассказать перцам из МЦСТ, что они не VLIW сделали. Потому что:
Микропроцессор «Эльбрус» (1891ВМ4Я) – универсальный микропроцессор с архитектурой «Эльбрус» на основе архитектуры широкого командного слова (VLIW).
Отсюда: http://www.mcst.ru/Elbrus
Что за дурацкие попытки шланговать? Ты же прекрасно понимаешь, что имеется в виду средняя длина инструкций в используемом софте. Какой-нибудь веб-сервер там, текстовый или графический редактор, и тому подобное.
Прости, я не телепат чтобы знать заранее о том, что именно лоровские шизофреники имеют ввиду. Но специально для тебя я набыдлокодил небольшой говноскрипт, считающий среднюю длину инструкции в бинарике. Итак…
Во-первых, судя по первой попавшейся статье средняя длина инструкций у x86-64 заметно больше 8 бит. И даже больше 16 бит. И даже больше 32 бит.
Последнее – ЛПП. Скрипт:
#!/usr/bin/env python3
from os import popen
import sys
if len(sys.argv) != 2:
print("Provide binary path")
sys.exit(-1)
binpath = sys.argv[1]
cmd = "objdump -r -j .text -d {} | cut -d: -f2 | cut -d$'\t' -f 2".format(binpath)
ilens = []
ldict = {}
with popen(cmd) as output:
for instr in output:
instr = instr.strip()
instr = instr.replace(' ', '')
l = len(instr)
if l == 0:
continue
l = l * 4 # 4 bits per hex character
ilens.append(l)
ldict[l] = ldict.get(l, 0) + 1
avg = sum(ilens) / len(ilens)
print(f"Average instruction length: {avg} bits")
for l,n in ldict.items():
print(f"Number of {l} bit instructions: {n}")
Результаты на разных прогах:
△ ~ ./instrlen.py /nix/store/qzp74yjsymgpfmr0shcqdzzcrf90x83c-coreutils-full-9.5/bin/coreutils
Average instruction length: 31.862272649418344 bits
Number of 40 bit instructions: 48979
Number of 56 bit instructions: 26298
Number of 16 bit instructions: 42203
Number of 24 bit instructions: 49934
Number of 8 bit instructions: 9953
Number of 32 bit instructions: 22353
Number of 48 bit instructions: 16300
▲ ~ ./instrlen.py /nix/store/7lyjbaz0s8rgy4j4iyxz47gi78w72cm0-librewolf-128.0-2/lib/librewolf/librewolf
Average instruction length: 30.25957125758014 bits
Number of 8 bit instructions: 15486
Number of 16 bit instructions: 25239
Number of 32 bit instructions: 34675
Number of 24 bit instructions: 45895
Number of 40 bit instructions: 24776
Number of 48 bit instructions: 10936
Number of 56 bit instructions: 19275
▲ ~ ./instrlen.py /nix/store/06dr82w4336x3iwyik7b4criw3gxbwhs-ghc-9.8.2/lib/ghc-9.8.2/bin/ghc-9.8.2
Average instruction length: 29.644412695634006 bits
Number of 56 bit instructions: 58068
Number of 8 bit instructions: 37035
Number of 32 bit instructions: 77798
Number of 40 bit instructions: 32445
Number of 16 bit instructions: 92952
Number of 48 bit instructions: 15599
Number of 12 bit instructions: 3239
Number of 24 bit instructions: 37032
▲ ~ ./instrlen.py /nix/store/sdbyh7alvqicf4m42dl9gynqsb8alxzs-reaper-7.18/opt/REAPER/.reaper-wrapped
Average instruction length: 31.763740057415408 bits
Number of 8 bit instructions: 150371
Number of 40 bit instructions: 408041
Number of 48 bit instructions: 236383
Number of 56 bit instructions: 275544
Number of 32 bit instructions: 292061
Number of 16 bit instructions: 418928
Number of 24 bit instructions: 485239
Number of 12 bit instructions: 71
▲ ~ ./instrlen.py /nix/store/rb9n6mhvp93f9kyir6zijajbvprnvp3c-nginx-1.26.1/bin/nginx
Average instruction length: 31.912063492063492 bits
Number of 32 bit instructions: 45594
Number of 16 bit instructions: 42845
Number of 24 bit instructions: 49604
Number of 8 bit instructions: 15590
Number of 56 bit instructions: 32944
Number of 48 bit instructions: 15033
Number of 40 bit instructions: 50389
В общем, средняя длина получается чуть меньше 32 бит. Больше всего инструкций по 2 и 3 байта. Я так прозреваю, в остальных раздутая длина вызвана константами или смещениями.
Исходная версия hateyoufeel, :
Обе компании используют термин EPIC. Это не случайность.
Думаю, тебе стоит рассказать перцам из МЦСТ, что они не VLIW сделали. Потому что:
Микропроцессор «Эльбрус» (1891ВМ4Я) – универсальный микропроцессор с архитектурой «Эльбрус» на основе архитектуры широкого командного слова (VLIW).
Отсюда: http://www.mcst.ru/Elbrus
Что за дурацкие попытки шланговать? Ты же прекрасно понимаешь, что имеется в виду средняя длина инструкций в используемом софте. Какой-нибудь веб-сервер там, текстовый или графический редактор, и тому подобное.
Прости, я не телепат чтобы знать заранее о том, что именно лоровские шизофреники имеют ввиду. Но специально для тебя я набыдлокодил небольшой говноскрипт, считающий среднюю длину инструкции в бинарике. Итак…
Во-первых, судя по первой попавшейся статье средняя длина инструкций у x86-64 заметно больше 8 бит. И даже больше 16 бит. И даже больше 32 бит.
Последнее – ЛПП. Скрипт:
#!/usr/bin/env python3
from os import popen
import sys
if len(sys.argv) != 2:
print("Provide binary path")
sys.exit(-1)
binpath = sys.argv[1]
cmd = "objdump -r -j .text -d {} | cut -d: -f2 | cut -d$'\t' -f 2".format(binpath)
ilens = []
ldict = {}
with popen(cmd) as output:
for instr in output:
instr = instr.strip()
instr = instr.replace(' ', '')
l = len(instr)
if l == 0:
continue
l = l * 4 # 4 bits per hex character
ilens.append(l)
ldict[l] = ldict.get(l, 0) + 1
avg = sum(ilens) / len(ilens)
print(f"Average instruction length: {avg} bits")
for l,n in ldict.items():
print(f"Number of {l} bit instructions: {n}")
Результаты на разных прогах:
△ ~ ./instrlen.py /nix/store/qzp74yjsymgpfmr0shcqdzzcrf90x83c-coreutils-full-9.5/bin/coreutils
Average instruction length: 31.862272649418344 bits
Number of 88 bit instructions: 1
Number of 40 bit instructions: 48979
Number of 56 bit instructions: 26298
Number of 16 bit instructions: 42203
Number of 24 bit instructions: 49934
Number of 8 bit instructions: 9953
Number of 32 bit instructions: 22353
Number of 48 bit instructions: 16300
▲ ~ ./instrlen.py /nix/store/7lyjbaz0s8rgy4j4iyxz47gi78w72cm0-librewolf-128.0-2/lib/librewolf/librewolf
Average instruction length: 30.25957125758014 bits
Number of 88 bit instructions: 1
Number of 8 bit instructions: 15486
Number of 16 bit instructions: 25239
Number of 32 bit instructions: 34675
Number of 24 bit instructions: 45895
Number of 40 bit instructions: 24776
Number of 48 bit instructions: 10936
Number of 56 bit instructions: 19275
▲ ~ ./instrlen.py /nix/store/06dr82w4336x3iwyik7b4criw3gxbwhs-ghc-9.8.2/lib/ghc-9.8.2/bin/ghc-9.8.2
Average instruction length: 29.644412695634006 bits
Number of 88 bit instructions: 1
Number of 56 bit instructions: 58068
Number of 8 bit instructions: 37035
Number of 32 bit instructions: 77798
Number of 40 bit instructions: 32445
Number of 16 bit instructions: 92952
Number of 48 bit instructions: 15599
Number of 12 bit instructions: 3239
Number of 24 bit instructions: 37032
▲ ~ ./instrlen.py /nix/store/sdbyh7alvqicf4m42dl9gynqsb8alxzs-reaper-7.18/opt/REAPER/.reaper-wrapped
Average instruction length: 31.763740057415408 bits
Number of 88 bit instructions: 1
Number of 8 bit instructions: 150371
Number of 40 bit instructions: 408041
Number of 48 bit instructions: 236383
Number of 56 bit instructions: 275544
Number of 32 bit instructions: 292061
Number of 16 bit instructions: 418928
Number of 24 bit instructions: 485239
Number of 12 bit instructions: 71
▲ ~ ./instrlen.py /nix/store/rb9n6mhvp93f9kyir6zijajbvprnvp3c-nginx-1.26.1/bin/nginx
Average instruction length: 31.912063492063492 bits
Number of 88 bit instructions: 1
Number of 32 bit instructions: 45594
Number of 16 bit instructions: 42845
Number of 24 bit instructions: 49604
Number of 8 bit instructions: 15590
Number of 56 bit instructions: 32944
Number of 48 bit instructions: 15033
Number of 40 bit instructions: 50389
В общем, средняя длина получается чуть меньше 32 бит. Больше всего инструкций по 2 и 3 байта. Я так прозреваю, в остальных раздутая длина вызвана константами или смещениями.