Итак, мне нужно подключить программу, но для этого я собираюсь скопировать инструкции E8 <Pointer to Byte Array that contains other code>
. Проблема в том, что когда я собираю Call 0x100
, я получаю E8 FD
. Мы знаем, что E8 является инструкцией вызова, поэтому FD должен быть пунктом назначения, поэтому как ассемблер принимает адресат от 0x100 до FD? Спасибо, Bradley - ImceptРасчет кода перехода на компьютерный код
ответ
http://wwwcsif.cs.ucdavis.edu/~davis/50/8086 Opcodes.htm
E8 - это 16-битный относительный вызов. Так, например, E8 00 10
означает вызов адреса на ПК + 0x1000.
Существует множество кодов опций перехода/вызова, а некоторые из них относительны. Я бы сказал, что вы действительно получили не E8 FD
, а E8 FD FF
. E8
, по-видимому, является «call 16-bit relative» и 0x100
- это место, где по умолчанию размещены инструкции.
Итак, вы положили call 0x100
по адресу 0x100, а сгенерированный код «выполнил команду перехода и прыгнул -3 от фактического указателя инструкции». -3
- это потому, что сдвиг вычисляется с позиции после инструкция считывается, которая в случае E8 FD FF
равна 0x103. Вот почему сдвиг, если FD FF
, big-endian для 0xfffd
, который является 16-битным -3
.
Я соглашусь, что фактические коды операций не были «E8 FD FF», потому что тогда у вас будет бесконечный цикл. –
Да, это могло быть «E8 FD 00», в каком случае инструкция была поставлена на адрес 0x00. Что мне кажется немного необычным, так как моя память слабо говорит мне, что 0x100 должно быть началом кода в старой DOS, но в этом случае оно может быть 0x00. Исходный адрес 'call 0x100' не был указан, поэтому я могу только догадываться. –
Что такое целевой машинный код? Нет способа «E8FD» означает «вызов 0x100» –
Я открыл его в EMU8086, и да, это означает CALL 0x100. Но, возможно, я не знаю, о чем говорю. – iDomo
Какой ассемблер вы используете? –