;该程序用于测试STC90C516RD+ ACALL 执行时的16位二进制编码中addr8~addr12是否为10010
;以下内容摘自STC90C51RC-RD+-CHINESE数据手册
;ACALL addr 11
;功能:绝对调用
;说明:ACALL指令实现无条件调用位于addr11参数所表示地址的子例程。在执行该指令时,
;首先将PC的值增加2,即使得PC指向ACALL的下一条指令,然后把16位PC的低8位和
;高8位依次压入栈,同时把栈指针两次加1?然后,把当前PC值的高5位、ACALL指
;令第1字节的7~5位和第2字节组合起,得到一个16位目的地址,该地址即为即将调
;用的子例程的入口地址。要求该子例程的起始地址必须与紧随ACALL之后的指令处
;于同1个2KB 的程序存储页中,ACALL指令在执行时不会改变各个标志位。
;ACALL指令二进制编码:
;15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
;a10a9 a8 1 0 0 1 0 a7 a6 a5 a4 a3 a2 a1 a0
;预期
;addr11位于0002H->0000000000000010B
;000(addr11中a10到a8)+10010+00000010(addr11中a7到a0) =1201H
;步骤:
;点击DEBUG
;点击MEMORY WINDOWS
;在address 里输入00
ORG 00H
START:
ACALL TEST1 ;ACALL 指令操作
TEST1: ;(PC)<- (PC)+ 2
END ;(SP) <-(SP) + 1
;((SP)<-(PC7-0)
;(SP) <-(SP) + 1
;((SP)) <-(PC(PC15-8)
;(PC10-0)<-页码地址
;结果
;执行前,SP=0x07,执行后,SP=0x09;
;PC值变化与预期相符;
;ACALL指二进制编码为1102与预期1202不符;
;分析
;1:可能是由于STC的内部结构未完全符合msc-51标准
;2:STC数据手册出错
;3:STC单片机未被keil uVision收录,编绎时才有此现象。
;初步判断
;根据百度ACALL的说活,ACALL指令二进制编码应该是
;(addr11中a10到a8)+10001+(addr11中a7到a0),故可能是STC公司数据手册写错了,
;仅当ACALL指令的详解中,便出错了两次,希望中国人以后能够做到严谨,如同德国人的处事风格一样。
附:截图如下