如何在汇编代码中比较负数和正数?

时间:2016-10-22 01:53:20

标签: assembly msp430 16-bit texas-instruments

我正在使用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

Non-Standard Options section

2 个答案:

答案 0 :(得分:2)

你做错了什么。使用MSP430汇编语言according to this insn set guide I googled up在签名的小于条件上jl分支:
JL Label Jump to Label if (N .XOR. V) = 1(其中N和V是Negative和signed-Overflow状态位,因此它与x86的JL指令相同。请参阅Understanding Carry vs. Overflow conditions/flags for signed vs. unsigned.

MSP430有一个JLO在无符号低于条件的情况下分支(如果Carry-bit被重置),你没有使用它(这是正确的,因为你想在有符号的条件下进行分支) 。它也有JHS(更高或相同,JC的同义词),但我没有看到x86的JA的等价物(上图:C == 0&& Z == 0)。无论如何,你无论如何都不想要无符号分支。

我猜你做错了什么:

你说你在寄存器中看到246。所以你的数字肯定只有8位。你使用的是CMP,而不是CMP.B,所以我认为这意味着你要比较字大小的数组元素(除非你的汇编程序神奇地推断出.B来自array被用作操作数的东西)。 insn set ref将其列为CMP(.B) src,dst

您是否将数字零扩展为16位而不是符号扩展?这可以解释为什么CMP没有按照你想要的方式设置标志。

另外,对于数组偏移,你只使用0和1,但这只是一个字节而CMP(不是CMP.B)使用的元素比那个大,所以也许你正在进行16位访问两个数组元素?

(其中一些可能是错误的,因为我以前从未使用过MSP430,但它看起来像x86 / ARM / M68k /其他典型的汇编语言。)

答案 1 :(得分:0)

我将cmp 0(ptr),1(ptr)更改为cmp.b 0(ptr),1(ptr)并且有效