单片机散转程序中ACALL和SJMP的键号必须乘以4才能得到正确的散转偏移量,为什么要乘以4??

单片机散转程序中ACALL和SJMP的键号必须乘以4才能得到正确的散转偏移量,为什么要乘以4??,第1张

乘以2是常见的,乘以3的也有;

乘以4,不像,请给出程序来分析一下。

---------------------

看明白了。

这书的作者,把各个程序的分支,写成了“调用子程序+转移指令”的形式,所以才有了如此“笨重”的散转方法。

且看它的分支表:

TABLE:

ACALL PRADD 转加法子程序从“TABLE +0”是第O个分支

SJMP PREND 转结束

ACALL PRSUB 转减法子程序从“TABLE +4”是第一个分支

SJMP PREND 转结束

ACALL PRMUL 转乘法子程序从“袜芹TABLE +8”是第二个分支

SJMP PREND 转结束

ACALL PRDIV 转除法子程序从“TABLE +12”是第三个分支

SJMP PREND 转结束

…… 从“TABLE +…………

……

它的每个分支,都是使用了两条2字节的指令,所以各分支,相差4个字节;如果要根据告毁毕分支的号码,找到对应的地址,就应该乘以余庆4。

这种4字节形式的分支表,所能容纳的分支数目,明显少于2字节的分支表。这种笨方法,也写成书,真是不可思议。

SUBB A, #04H 如果结果Cy=1说明键值小于04H,是合理的,否则键值大于04H就出错。

RL A 起键值×2的迟拦扮作用,因为散转表中的每条指令JMP @A+DPTR的代码都是双字节的码灶,所以散转偏移量应该是键值的两倍衡神。如果每组代码是N字节,这里就要×N。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12229712.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-22
下一篇2023-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存