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

Assembly 如何在汇编代码中比较负数和正数?,assembly,msp430,16-bit,texas-instruments,Assembly,Msp430,16 Bit,Texas Instruments,我使用的是TI MPS430G2553启动板和代码生成器Studio v6 我试图与数组中的数字进行比较。我在数组中循环,在每个数字处,我将该数字与数组中的下一个数字进行比较。如果下一个数字小于当前数字,它们将切换位置。否则,什么也不会发生 我使用以下命令比较它们: cmp 0(array),1(array) jl SWITCH 问题是,数组中的一些数字是负数,它们被视为两个补码,例如,当比较55和-9时,它不会切换它们,因为它将-9视为246(当我将其分配给寄存器,并使用调试模式时,寄存器包

我使用的是TI MPS430G2553启动板和代码生成器Studio v6

我试图与数组中的数字进行比较。我在数组中循环,在每个数字处,我将该数字与数组中的下一个数字进行比较。如果下一个数字小于当前数字,它们将切换位置。否则,什么也不会发生

我使用以下命令比较它们:

cmp 0(array),1(array)
jl SWITCH
问题是,数组中的一些数字是负数,它们被视为两个补码,例如,当比较55和-9时,它不会切换它们,因为它将-9视为246(当我将其分配给寄存器,并使用调试模式时,寄存器包含数字246)

我如何解决这个问题?我查找的所有内容都表明解决方案是使用
jl
命令,但我已经在这样做了

我的内存窗口显示此数组
101755-92236-7
37 8-77 8


你做错了什么<在MSP430汇编语言中,代码>jl在有符号小于条件上分支:
JL标签跳转到标签if(N.XOR.V)=1
(其中N和V是负的和有符号的溢出状态位,因此它与x86的JL指令相同。请参阅

MSP430有一个
JLO
在无符号小于条件下进行分支(如果进位被重置),您没有使用它(这是正确的,因为您希望在有符号条件下进行分支)。它还有
JHS
(更高或相同,JC的同义词),但我没有看到x86的JA的等价物(上面:C==0&&Z==0).无论如何,您不需要未签名的分支


我猜你做错了什么:

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

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

另外,对于数组偏移量,您只使用0对1,但这只是一个字节,CMP(而不是CMP.B)使用的元素比这个大,所以您可能正在进行一个覆盖两个数组元素的16位访问


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

我将
CMP0(ptr),1(ptr)
更改为
cmp.B0(ptr),1(ptr)
,并对每个数字减去(或添加)128。字节数是-128、-1、0、-127和128“模256”您将得到范围0,…255,或者可能有一个比较有符号或在负号上跳转(jl=无符号时更少)。当我这样做时,它仍然将-9视为246。我将128添加到246,得到374,这仍然大于55+128。您需要添加模256(即截断到8位).
128+246的低位8位为118,低于(128+55)=183。@PeterCordes:我如何添加模256?它不在指令集中。截断为8位=模256。无论我使用cmp、cmp.b还是cmp.w,我都会得到相同的结果。将JL切换到JLO也不起作用。我如何知道我是零扩展还是符号扩展?@MattD:用调试器查看内存内容。这就是我一直在做的ole time。我应该寻找什么具体的东西吗?@MattD:是的,是
0 55 0-9…
还是
55-9…
。从这个问题上看,内存中到底有什么还不清楚。
cmp.b 0(数组),1(数组)
如果它们没有任何零填充的话应该可以使用,除非MSP430有一些与我所期望的不同的棘手之处。你只在问题中发布了关于寄存器中看到的内容,而不是内存中看到的内容。