CALL CS:DWORD PTR [ROMRTN] ;PROBLEM 1
как работает упоминание строки кода в ПРОБЛЕМЕ 1
Эта инструкция выполняет дальний вызов ячейки памяти, адрес которой хранится в переменной, помеченной ROMRTN .
ROMRTN DD 0FE000000H ;Main ROM entry point.
Несмотря на то, что вы видите это как 32-битное двойное слово, вам действительно нужно рассматривать его как сегмент: смещенная пара .В конце концов, это 16-битный код!
ROMRTN DD 0FE00h:0000h ;Main ROM entry point.
или записан так, как он хранится в памяти (x86 - младший порядок байтов):
ROMRTN DW 0000h, 0FE00h ;Main ROM entry point.
Дальний вызов затем переходит кячейка памяти с линейным адресом 0FE000h.То есть вы умножаете слово сегмента (здесь это 0FE00h) на 16, а затем добавляете слово смещения (здесь это 0000h).
CALL ROM_CALL ;PROBLEM 2
Тогда что произойдет, когда мы вызовемROM_CALL в ПРОБЛЕМЕ 2.
Эта инструкция выполняет почти полный вызов подпрограммы, помеченной ROM_CALL .
Программист мог выбрать встроенный код подпрограммы, но, вероятно, полныйПрограмма выполняет несколько системных вызовов bios и, таким образом, сохраняет многоуровневый подход.Также возможно, что указатель, хранящийся в ROMRTN , со временем изменяется, что делает эту процедуру гибкой частью программы.