2016-10-22 10 views
2

Я использую стартовую панель TI MPS430G2553 и Code Composer Studio v6Как сравнить отрицательные числа с положительными в коде сборки?

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

Я сравниваю их с помощью этой команды:

cmp 0(array),1(array) 
jl SWITCH 

Проблема заключается в том, некоторые из чисел в массиве являются отрицательными, и они рассматриваются в качестве их двоек дополняют, например, когда сравните 55 и -9, он не переключает их, потому что обрабатывает -9 как 246 (когда я назначаю его регистру и использую режим отладки, регистр содержит номер 246)

Как это решить? все, что я ищу, говорит, что решение состоит в использовании команды jl, но я уже это делаю.

мое окно памяти показывает для этого массива 10 17 55 -9 22 36 -7 37 8 -77 8

Here is the instruction set my professor gave me

+2

Вычесть (или добавить) 128 на каждое число. Числа байтов: -128, ... -1, 0, ...127 и добавив 128 «по модулю 256», вы получите диапазон 0, ... 255, или, может быть, есть знак сравнения или переход на минус (jl = less без знака). –

+0

Когда я это делаю, он по-прежнему обрабатывает -9 как 246. Я добавляю от 128 до 246 и получаю 374, что еще больше 55 + 128 –

+0

Вам нужно добавить modulo 256 (т. Е. Усекать до 8 бит). Низкие 8 бит «128 + 246» дают вам 118, что ниже (128 + 55) = 183. –

ответ

2

Вы делаете что-то неправильно. jl ветви на подписанную менее чем условие, в MSP430 ассемблере, according to this insn set guide I googled up:.
JL Label Jump to Label if (N .XOR. V) = 1 (где N и V являются Отрицательные и знаково-перелива биты состояния, так что совпадает с инструкцией JL X86 посмотрим Understanding Carry vs. Overflow conditions/flags for signed vs. unsigned.

MSP430 имеет JLO для ветвления на неподписанном более низком состоянии (если сбрасывается бит переноса), и вы не используете это (что верно, так как вы хотите разветвиться на подписанном условии). Он также имеет JHS (более высокий или То же самое, синоним для JC), но я не вижу эквивалента для JA x86 (выше: C == 0 & Z == 0). В любом случае вы не хотите, чтобы беззнаковые ветви в любом случае.


У меня есть предположение, что в вы делаете неправильно:

Вы говорите, что вы видите 246 в реестре. Таким образом, ваши номера, безусловно, всего 8 бит. Вы используете CMP, а не CMP.B, поэтому я думаю, что это означает, что вы сравниваете элементы массива размера слова (если ваш ассемблер не магически не передает .B от чего-то около array, используемого в качестве операнда). Набор insn ref перечисляет его как CMP(.B) src,dst.

Вы увеличили число нулей до 16 бит вместо расширения знака? Это объясняет, почему CMP не устанавливает флаги так, как вы хотите.

Кроме того, вы используете только 0 против 1 для смещений массива, но это только один байт, а CMP (не CMP.B) использует более крупные элементы, чем это, поэтому, возможно, вы делаете 16-битный доступ, который охватывает два элемента массива?

(Часть этого может быть неправильным, так как я никогда не использовал MSP430 раньше, но это выглядит как x86/ARM/M68K/других типичных языков ассемблера.)

+0

Получаю те же результаты, могу ли я использовать cmp, cmp.b или cmp.w. Переключение JL на JLO тоже не работает. Как я узнаю, что я ноль или расширяю? –

+0

@MattD: посмотрите содержимое памяти с помощью отладчика. –

+0

Это то, что я делал все это время. Я должен искать что-то конкретное? –

0

Я изменил cmp 0(ptr),1(ptr) к cmp.b 0(ptr),1(ptr) и работал