nasm x86, условные переходы к динамическому адресу c - PullRequest
0 голосов
/ 28 марта 2020

Здравствуйте, я столкнулся с проблемой, кажется, что nasm мешает мне, но я хочу спросить, есть ли решение, о котором я не знаю в nasm. Я программирую на Intel x86, создавая COM-файлы.

В моей программе положение вещей не указано c, поэтому я использую bp для вычисления правильного смещения вещей. Например, если я хочу получить доступ к буферу переменных, я использую lea dx, [bp + buffer]

Так что в моем коде я хочу использовать условные переходы для указания c меток в коде, но, поскольку местоположение программы меняется, я хотел сделать что-то вроде этого: jc [bp + EXIT], загрузка в регистр тоже не работает.

Где в этом примере EXIT будет частью, где программа закрывается. Но я хочу перейти к множеству разных мест в коде, а не просто к выходу.

Итак, я спрашиваю, есть ли что-то, что позволяет мне делать условные переходы по динамическим адресам памяти, которые являются динамическими c относительно БП? То есть они работают, даже если местоположение кода изменится в памяти позже? Если нет, то какое было бы лучшее решение для такого поведения?

Ответы [ 2 ]

2 голосов
/ 02 апреля 2020

Условные переходы могут кодировать только короткий или (на 386+) ближний, постоянный пункт назначения перехода. Чтобы позволить вам прыгать косвенно с определенным условием, вы можете отменить условие , к которому хотите перейти. Это обратное условие может быть использовано для перехода к другой инструкции перехода. Первый прыжок эффективно позволит вам пропустить другой прыжок, если ваше заданное условие непрямого прыжка не выполнено. (Только условное jcxz нельзя напрямую инвертировать.)

Вот ваш пример, сделанный таким образом. Я использовал локальную метку .

    jnc .skip
        ; here if Carry Flag is set
    jmp near [bp + EXIT]
.skip:

Если вы предпочитаете, вы можете сохранить первоначальный смысл вашего состояния, но использовать постоянное назначение перехода для передачи выполнения к расположенной инструкции косвенного перехода где-то в стороне.

    jc jmp_bp_exit
        ; other code to continue execution here


jmp_bp_exit:
        ; here if Carry Flag is set
    jmp near [bp + EXIT]
1 голос
/ 01 апреля 2020

После некоторых проб и ошибок я обнаружил, что вместо этого могу использовать cmov c.

...