寄存器参考
参考2
[寄存器组使用using参考](https://blog.csdn.net/weixin_46720928/article/details/110221835)
keil中的using关键字参考
官方文档里关于using的说明可参阅2个地方,(1)keil软件菜单栏->Help->uVision Heip,打开帮助文件,然后依次展开Ax51 Assembler User Guide -> Control Statement -> Reference -> USING,(2)帮助文件依次展开CX51 Compiler User‘s Guide-> Language Extensions -> Function Declarations -> Register Banks
C51单片机有关概念
PSW:(8个bit位)程序状态寄存器(下面汇编语言中就是对这个寄存器设置后使用不同寄存器器组),下面是修改使用寄存器组用到的位
寄存器组
从上面的图片可以知道,有4组寄存器。每组寄存器中都有R0到R7,共8个字节。以第0组寄存器为例,地址是00h-07h。
程序寄存器组中的数据使用
(下面的程序实例中也有)从汇编中可以看出,寄存器组中只是存储了运算的数据,而调用的执行命令是在存储命令的(code)内存中。存一个字节的数据使用一个寄存器组中的一个
汇编常用命令
参考:https://blog.csdn.net/zcx515545/article/details/26152169
MOV(英文为Move):对内部数据寄存器RAM和特殊功能寄存器SFR的数据进行传送;
MOVC(Move Code)读取程序存储器数据表格的数据传送;
MOVX (Move External RAM) 对外部RAM的数据传送;
XCH (Exchange) 字节交换;
XCHD (Exchange low-order Digit) 低半字节交换;
PUSH (Push onto Stack) 入栈;
POP (Pop from Stack) 出栈;
ADD(Addition) 加法;
ADDC(Add with Carry) 带进位加法;
SUBB(Subtract with Borrow) 带借位减法;
DA(Decimal Adjust) 十进制调整;
INC(Increment) 加1;DEC(Decrement) 减1;
MUL(Multiplication、Multiply) 乘法;
DIV(Division、Divide) 除法;
RET(Return from subroutine)子程序返回;
LCALL(Long subroutine Call)子程序长调用;
NOP (No Operation) 空操作;
整体c语言代码
#include <reg51.h>
#include <stdio.h>int result;
void add_two(int a,int b,int c) using 1{result = a+b+c;}
void add_one(int a,int b) using 1{add_two(a,b,9);}void main(){add_one(1,2);printf("result:%d",result); //执行结果是9}
整体程序执行过程
从汇编语言分析数据变换
总结认知
导致计算错误的主要原因是上图中的绿线连接的部分:实际的数据存储和计算过程中并不是指向同一个地址的数据。上图中程序中函数add_one使用的1,2都是在寄存器组0中的R7,R6,R5,R4中(由于定义int需要使用2字节存储)。而在计算加的时候是指定了寄存器组1中的R7,R6,R5,R4,这当然会出现错误。切换使用寄存器的时候一定注意数据的传递情况,否则很可能出现错误。