2016-01-24 42 views
1

我正在写微控制器msp430的模拟器。我不能理解我应该什么时候设置进位。例如在add指令中: 1+0x7FFF设置进位或者1+0xFFFFmsp430中的进位位

+1

17位不是16位0x7FFF + 1表示N位置位但不是进位。与0x8000 + 0x8000一样,0xFFFF + 1设置进位位。进位位是msbit的执行位。真正的问题是你在减法上做了什么,你倒置第二个操作数并进行1,但是你是否反转了执行?一些架构,你做了一些你没有。最简单的方法就是获得10美元的msp430并尝试一下。如果msbit进位和执行不同,通常会设置V标志。而n只是15位。 –

+1

哦,对了(看我的模拟器)如果是字节操作,那么0xFF + 1,第9位出来的alu基本上是进位位,第7位是n位等等,如果是的话是一个字操作,它就像上面的0xFFFF + 1是0x0000,进位位设置为0x8000 + 0x8000。 –

回答

0

对于ADD指令,进位位设置为无符号溢出。

你可以从TI documents的例子中推断出来。特别地,ADD指令(page 3-22)的文档中的第二个例子说,如果结果大于0xff(以及ADDADDA极限分别为0xffff0xfffff - 8,16和20位)上发生ADD.B进位:

ADD.B   #10,R5  ; Add 10 to Lowbyte of R5 
JC TONI     ; Carry occurred, if (R5) ≥ 246 [0Ah+0F6h] 
......      ; No carry 

除了进位位之外,msp430状态寄存器中还有一个NEGATIVE位确认了这一事实。

至少有一些现有的开源MSP430仿真器,即mspsim和Avrora。我建议将它们用作参考实现。

+0

这很有道理。我认为,如果我们有负位,那么为16位数字签名的范围是-32768到32767,当我们越过这个范围时,我们设置进位位,但这是错误的。 – user3191398

0

有两条不同的指令可以实现<,JL(如果小于则跳转)和JLO(如果低于跳转)。

JL的文件说,它

允许有符号整数的比较。

JLO的文件说,它

用于无符号数的比较。

JLO和JNC一样,因此C是无符号的进位。