算术运算指令知识汇总IC解密
1.IC解密加法指令ADD和ADDC
ADD指令将源操作数和累加器A中的数相加,加法的结果存入累加器A,并且运算结果会影响PSW中的CY、OV、AC和P标志位。ADD指令对标志位的影响如下:当加法结果的第7位有进位时,则进位标志位CY被置1,否则被清0;如果加法结果的第3位有进位,则辅助进位标志位AC被置1,否则被清0;如果加法结果的第6位和第7位的进位情况不一致,则溢出标志位OV被置1,否则被清0;运算结束时,奇偶标志位P的值由累加器A中的数决定,若累加器A中的值以二进制表示后,其中“1”的个数为奇数个,则P为1,否则P为0。
ADDC指令与ADD指令的唯一区别是,前者在源操作数和累加器A的加法基础上再加上CY中的值。
2.IC解密十进制调整指令DA
指令ADD和ADDC将其源操作数和目的操作数作为二进制数(或十六进制数)进行加法计算,遵循“逢2进1”(或“逢16进1”)的二进制(或十六进制)计算规则,得到的运算结果为二进制数(或十六进制数)。如果用ADD和ADDC指令进行压缩BCD码(十进制数)的加法计算,则得不到正确的十进制计算结果,而使用DA指令可以将ADD和ADDC指令的运算结果调整为十进制的运算结果。
IC解密使用“DA A”指令进行十进制调整时,必须满足以下要求:在DA指令之前必须进行ADD或ADDC加法运算,并且参与加法运算的操作数必须是压缩BCD码数。
“DA A”指令调整时,先处理“个位”,再处理“十位”,“个位”的处理结果将影响“十位”的调整,具体步骤如下:
(1)调整BCD码运算结果的“个位”
1)若累加器A中运算结果的“个位”(即低4位)数大于9(非BCD码),则在累加器A的“个位”上加“6”。这样做是因为:在BCD码计算时,结果大于9则应产生进位,但是ADD和ADDC按照十六进制进行计算,只有结果大于15时才进位,从而导致“晚”进位,所以此时加“6”相当于将“逢16进1”的十六进制运算强制调整为“逢10进1”十进制运算。
2)若累加器A中运算结果的“个位”(即低4位)产生进位(辅助进位标志位(AC)=1),则在累加器A的“个位”上加“6”。这样处理的理由是:“个位”产生进位,意味着BCD码加法结果的个位大于15而产生了进位,但是该进位将使BCD码加法结果的个位数被减去16,而正常的十进制加法进位应该使个位数被减去10,所以需通过加“6”操作补上多减去的“6”。