这个还是比较简单的,如果是开方,三角计算,则更难。 |
yzwzfyz 发表于 2021-11-18 16:13 看了你写的解答,令我惊叹万分,为啥我就写不出这样的,如此层次清晰的,感觉只要识字的就能看懂的,答复呢? |
R67是16位二进制数,R345是BCD结果。 1、HB2:将结果清0,准累计结果。 2、HB3:先将R67的最高位移出,或0或1。 3、移出的0或1,放入结果的末位,进行BCD调整。 理解:假设最高位是1(也就是你举例的),它将被移入CY,通过ADDC,被加入到R5的末位中,未来还会被向高位移动15次,并且还会被BCD调整15次,加上本次,一共被移位、调整16次。 每左移一次相当于是二进制乘2,16次移动是还原成原值(原来在第几位的还是在第几位),这个很好理解。而每次乘2后会被进行BCD调整,就变成了10进制了。进行16次移位16次BCD调整,是否能正确地转换,就不太好理解了。 不过你可以做个试验:R67=1000000000000000,16次操作后看看是否 R345=032768。如此,便于你理解。 第1234次操作后, R345=0008, 第5次操作后, R345=0016,(移位变成0010H,BCD调整后变成0016) 第6次操作后, R345=0032,(移位变成002CH,BCD调整后变成0032) 第7次操作后, R345=0064,(移位变成0064H,BCD调整后变成0064) 第8次操作后, R345=0128,(移位变成00C8H,BCD调整后变成0128) ...... |
我的做法是这样的。 做一个表:分别对应16位中各个位的BCD值,B15...B0,如果该位是1就加这个值(BCD加法),是0就不加,这样很好理解。 B15:032768 B14: 016384 B13:008192 …… B0 : 000001 |
yzwzfyz 发表于 2021-11-18 15:12 ?? 是说我么? 我补充一下, 这个应该是中间步骤, 或者整个代码都是汇编写的。 R6, R7 是原始的16位2进制数, 范围是: 0~65535 转译出来的 十是进制BCD 保存在 R3,R4,R5 由于,没有把他们移回R5,R6,R7 不在传参位,所以,故计要么还有一段代码,要么就是整个代码就是汇编写的,所以不需要放到传参位。 |
要说清楚,是哪16位,转换成放在哪里。 |
188610329 发表于 2021-11-16 14:38 好的,谢谢,我去查查相关资料 |
讲就是: 2进制除法,就是这么一个计算过程。16位就是16次,32位就是32次, 说白了,就是利用加法器实现除法。你看看2进制运算方面的资料就能看明白了。说要说半天了。 |