Вычисление назначения перехода по машинному коду - PullRequest
0 голосов
/ 01 января 2012

Хорошо, мне нужно подключить программу, но для этого я собираюсь скопировать инструкцию E8 <Pointer to Byte Array that contains other code>.Проблема в том, что когда я собираю Call 0x100, я получаю E8 FD, мы знаем, что E8 - это инструкция вызова, поэтому FD должен быть пунктом назначения, так как ассемблер переводит пункт назначения из 0x100 в FD?Спасибо, Брэдли - Imcept

Ответы [ 2 ]

3 голосов
/ 01 января 2012

Существует множество кодов операций перехода / вызова, и некоторые из них являются относительными.Я бы сказал, что на самом деле вы получили не E8 FD, а E8 FD FF.E8 кажется "вызовом 16-битного относительного", а 0x100 - это место, где по умолчанию размещаются инструкции.

Таким образом, вы помещаете call 0x100 по адресу 0x100, и сгенерированный код "do"команда перехода и переход с -3 из фактического указателя инструкции ".-3 потому, что смещение вычисляется из позиции после , когда читается инструкция, которая в случае E8 FD FF равна 0x103.Вот почему сдвиг, если FD FF, big-endian для 0xfffd, то есть 16-битный -3.

0 голосов
/ 01 января 2012

http://wwwcsif.cs.ucdavis.edu/~davis/50/8086 Opcodes.htm
E8 - 16-битный относительный вызов. Например, E8 00 10 означает вызов адреса на ПК + 0x1000.

...