Есть ли ассемблер, который позволит мне «встроить» машинный код?

Я много искал в Google способ включения машинного кода прямо в исходный файл сборки. Мне не повезло.

Что я подразумеваю под «встроенным машинным кодом», может быть неясно, поэтому позвольте мне привести пример того, что я ищу:

; here's my normal assembly code...
mov eax, 8
add eax, 10
; now I would like to be able to add some machine code
__machinecode__("40") ; this is equivalent to 'inc eax' (I think!)

Итак, это все.


person Aaron    schedule 09.04.2013    source источник
comment
отличный вопрос!! просто из любопытства ЗАЧЕМ ТЫ ЭТО СДЕЛАТЬ?   -  person Alex Gordon    schedule 10.04.2013
comment
@АртёмЦарионов Возможны разные причины. Возможно, ассемблер устарел и не поддерживает какие-то новые инструкции. Может случиться так, что кто-то хочет протестировать свой дизассемблер или эмулятор и должен быть уверен, что, например, обе кодировки mov eax, ebx покрываются, и другой порядок префиксов инструкций покрывается, недопустимые инструкции покрываются и так далее. Еще одна причина заключается в использовании кода в качестве данных (например, для сжатия вашей 256-байтовой демонстрационной сборки), и вы должны быть уверены, что у вас правильная кодировка. Есть и другие причины.   -  person Alexey Frunze    schedule 10.04.2013
comment
@AlexeyFrunze довольно классная причина! спасибо!   -  person Alex Gordon    schedule 10.04.2013
comment
вы имели в виду 40 гексов? .байт 40ч?   -  person old_timer    schedule 10.04.2013
comment
@АртёмЦарионов Также можно использовать двойной код (интересно, какое правильное английское слово), я имею в виду код с более чем одним возможным декодированием в зависимости от начального смещения выполнения (с переходом или вызовом 2-го или более позднего байта инструкции для получить другие скрытые инструкции). Например, в x86-64: db 'jH5j6j7': push 0x48; xor eax, 0x376a366a. db 'H5j6j7': xor rax, 0x376a366a. db 'j6j7': push 0x36; push 0x37... Другой причиной может быть то, что некоторые ассемблеры могут не поддерживать некоторые недокументированные инструкции.   -  person nrz    schedule 10.04.2013


Ответы (1)


Все известные мне ассемблеры имеют такую ​​возможность.

mov eax, 8
db 90h ; this is "nop"
add eax, 10
person Alexey Frunze    schedule 09.04.2013
comment
Вау, это было быстро. Позвольте мне просто попробовать это, тогда я соглашусь. - person Aaron; 10.04.2013
comment
@JesusPlusPlus11 сначала ты ответишь на мой вопрос - person Alex Gordon; 10.04.2013
comment
@АртёмЦарионов Это невежливо. Но вы можете получить мой ответ вместо его. - person Alexey Frunze; 10.04.2013
comment
@AlexeyFrunze У меня возникли проблемы с попыткой сделать это в GNU Assembler, не могли бы вы еще раз взглянуть на мой вопрос? - person Aaron; 10.04.2013
comment
Что, если вы уроните все деньги на пол? Я имею в виду доллары. - person Alexey Frunze; 10.04.2013
comment
@AlexeyFrunze Деньги обратно не возьму, спасибо, теперь работает! - person Aaron; 10.04.2013