2016-05-27 2 views
1

Я работаю над некоторым кодом в MASM Assembly, используя библиотеки Kip Irvine. У меня есть некоторый код, как это:Почему я получаю странное значение при уменьшении счетчика типа WORD в MASM Assembly?

mov eax, n_var 
mov icount, eax 
mov ecx,0 

.WHILE icount >= ecx 

mov esi, icount 
fld vector_sol[esi * 8] 

dec icount 
.ENDW 

Проблема заключается в том, что когда icount является 0, то в следующем icount петли должно быть -1, но вместо этого, он получает значение 4294967295. То же самое происходит, если я попытаюсь цикл с регистром вместо icount.

+4

Это нормально, если вы печатаете его как без знака. Используйте подписанный вывод. Однако вы не показывали, как вы печатаете. – Jester

+4

Также не знаю, что использует оператор '> ='. Вы должны воздерживаться от этих вспомогательных вещей (например, '.WHILE'), особенно если вы новичок. Просто код чистый asm. – Jester

+0

Действительно, '-1' кодируется как' FFFFFFFFh', а '4294967295' также кодируется как' FFFFFFFFh'. Разница заключается в их * контексте *. –

ответ

2
mov ecx,0 
.WHILE icount >= ecx 

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

Перед использованием директив .WHILE и .ENDW вы должны понимать, как они работают. Из инструкции MASM мы узнаем:

Эти конструкции работают много, как они делают на языке высокого уровня, таких как C или Pascal. Имейте в виду следующие пункты:

  • Эти директивы генерируют соответствующие инструкции процессора. Они не являются новыми инструкциями.
  • Они требуют правильного использования подписанных и неподписанных данных.

Эти директивы вызывают выполнение набора инструкций на основе оценки какого-либо условия. Это условие может быть выражением, которое оценивается как , подписанное или значение unsigned, выражение, использующее двоичные операторы в C (& &, || или!) Или состояние флага. Для получения дополнительной информации о операторах выражения см. Стр. 178.
Оценка условия требует, чтобы ассемблер знал, являются ли операнды в условии подписанными или неподписанными. Чтобы явно указать, что именованная ячейка памяти содержит целое число со знаком, используйте директивы распределения подписей SBYTE, SWORD и SDWORD.

Так короче переменная icount должны быть признаны в качестве SDWORD, потому что тогда, когда dec icount приносит значение вплоть до -1 условие, пока не перестанет быть правдой, таким образом, выход из цикла.