Переменные ведут себя странно (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
устанавливается в обоих случаях.