Странное поведение переменных (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, который я использую)


person Raven Dreamer    schedule 19.07.2010    source источник
comment
Мы не сможем догадаться, что происходит не так, если вы покажете нам только те строки кода, которые, по вашему думанию, вызывают проблему. Пожалуйста, опубликуйте краткий полный пример, демонстрирующий проблему, с которой вы столкнулись. Не забудьте четко указать как ожидаемые, так и фактические результаты.   -  person Greg Hewgill    schedule 19.07.2010


Ответы (2)


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

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

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

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

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

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

person Raven Dreamer    schedule 19.07.2010