> Не могу понять до конца, как получать дельта смещение.
> Вот есть след строки:
> [1234:0200h] call Get_IP
> [1234:0203h] Get_IP:
> [1234:0203h] pop ax
> [1234:0204h] sub ax,offset Get_IP
> Компилятор при ассемблировании вместо Get_IP поставит ее адрес -
> получится:
> [1234:0200h] call 0203h
> [1234:0203h] pop ax
> [1234:0204h] sub ax,0203h
> Т.е. 203 это типа константы. Дальше заражаем файл размером 1000h,
> получаем:
> [1234:1200h] call Get_IP
> [1234:1203h] Get_IP:
> [1234:1203h] pop ax
> [1234:1204h] sub ax,offset Get_IP
> Но ведь Get_IP= 203h, тогда call Get_IP должен перенести нас не по адресу
> 1203h,а
> по адресу 203h,а почему-то так не получается.
> Я понимаю, что call кладет в стек адрес следующей за ним инструкции и ах
> затем
> будет = 1203h, но почему Get_IP поменялся с 203h на 1203h не понятно, это
> же
> константа????
Все дело в том, что в команде call указывается относительный адрес той
команды, на которую происходит переход. Относительно адреса команды, которая
непосредственно следует за командой call. Поэтому куда бы в файле мы не
записали приведенный код, call всегда будет вызывать просто следующую за ней
команду :-)
Да, Get_IP - константа :-) Но ассемблер при создании объектного модуля
вычисляет смещение до нее относительно следующей команды, и в качестве
операнда команды call сует это смещение.
А процессор при выполнении команды call не делает IP := смещение, а делает
IP := IP + смещение.
Номер выпуска : 4841
Возраст листа : 695 (дней)
Количество подписчиков : 527
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/418684
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru