Переменные ведут себя странно (Intel 8086)

Изменить: ответил на мой собственный вопрос. Увидеть ниже. -_-

У меня есть переменная, определенная в сегменте.data следующим образом:

retVal DW 0100h  ;stores hex fraction of the intermediate value. Starts at 1.00

Это значение, которое я добавляю или вычитаю, чтобы получить возвращаемое значение.

Первый раз, когда это появляется в сегменте кода, находится в следующем пункте:

sub [retVal], ax     ; 

Я использовал отладчик и могу подтвердить, что во время этой операции регистр топора: 0000h.

Тем не менее, если я добавлю следующую строку кода непосредственно перед ним:

mov dx, 0100h;
mov [retVal], 0100h;

Я получаю совершенно другое значение (тоже неправильно). Я совершенно сбит с толку. Я в корне неправильно использую переменные здесь? Я не понимаю, почему загрузка того же значения, для которого переменная была изначально инициализирована (и еще не изменена), изменила бы результаты.

Есть идеи? В противном случае, кто-то может напомнить мне, как отслеживать значение переменной через CodeView? (Я использую отладчик DOSBox)

2 ответа

Решение

Является ли рассматриваемая программа подпрограммой?

Если это так, и вы вызываете подпрограмму несколько раз, вы сбрасываете переменные, которые вы изменяете?

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

Если это настоящий 8086 (то есть сегментированная архитектура), что ds установить в точке, где вы делаете вычитание? Первое, что приходит на ум, это то, что вы можете менять совершенно другую область памяти.

Кроме того, вы должны предоставить:

  • самая короткая из возможных законченных программ, которые демонстрируют проблемное поведение (и вы можете решить, что решаете свою собственную проблему, делая это - я часто так и делаю).
  • фактические неверные значения, которые retVal устанавливается в обоих случаях.
Другие вопросы по тегам