Переход на дальний адрес в реальном режиме

У меня есть ситуация, когда мне нужно перейти на дальний адрес в реальном режиме, у меня есть значение сегмента в регистре fs и смещение в регистре gs, и во время перехода я должен поддерживать точное содержимое регистра, я придумал один идея как следующая,

mov bp, fs
shl ebp, 16
mov bp, gs
jmp ebp

предполагая, что bp, fs и gs не читаются в вызываемом пункте назначения, другой способ, который я только что нашел в NASM far jump / far call в реальном режиме и соглашения кода ASM, и я могу использовать,

push fs
push gs
retf

Мне интересно, какой метод мне следует использовать или есть ли другой способ добиться этого? У меня нет особых навыков в сборке x86, поэтому, пожалуйста, простите мое невежество.

С уважением,

Арка


person Arka Sharma    schedule 11.08.2015    source источник


Ответы (1)


Если производительность имеет значение, несовпадающие пары вызов / возврат приводят к отключению предиктора обратного адреса , что приводит к эквивалентному неверному предсказанию ветвления в этом retf и позже возвращается. (Если far call / far ret даже участвует в этом; они могут не участвовать, IDK.) В противном случае это очевидный выбор.

jmp ebp - это ближний прыжок (не меняется cs), так что это не сработает. Вы бы использовали seg:off как 32-битное целое число, установив это значение для EIP, а не для CS: IP.

Вам нужен дальний прыжок (jmp ptr16:16 или jmp m16:16). Версия ptr16:16 требует, чтобы целевой адрес был закодирован в инструкции (чтобы это не был косвенный переход). Единственная доступная косвенная (переменная адресата) кодировка дальнего перехода имеет пару сегмент: смещение в памяти, а не регистр (а)

mov [mem], fs
mov [mem+2], gs
jmp far [mem]

синтаксис из https://courses.engr.illinois.edu/ece390/archive/spr2002/books/labmanual/inst-ref-jmp.html

push/push/retf будет значительно меньше и не требует отдельного рабочего места, поэтому, вероятно, лучше. Если производительность имеет значение, измеряйте оба варианта.

mem пространство может находиться в стеке или статическом хранилище. Но если вам нужно определенное содержимое стека при достижении места назначения, вы не сможете оставить лишний материал в стеке, а использование пространства под стеком будет небезопасным. (И вы можете обращаться к стеку только с использованием режимов адресации, таких как [bp-4], а не относительно [sp], если только вы не используете 386 для 32-битных режимов адресации, таких как jmp far [esp+4] или что-то еще.)

person Peter Cordes    schedule 11.08.2015