在keil中debug分析单片机数据和函数调用过程(c51为例),使用寄存器组导致错误原因分析

寄存器参考
参考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位)程序状态寄存器(下面汇编语言中就是对这个寄存器设置后使用不同寄存器器组),下面是修改使用寄存器组用到的位 ![在这里插入图片描述](https://file.jishuzhan.net/article/1716744116290719746/5d2306dbe6b70c699dc0de7e0956d6e4.webp) ### 寄存器组 从上面的图片可以知道,有**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语言代码 ```c #include #include 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 } ``` ## 整体程序执行过程 ![在这里插入图片描述](https://file.jishuzhan.net/article/1716744116290719746/92b16775b40457b435cb59cf0b193b01.webp) ## 从汇编语言分析数据变换 ![在这里插入图片描述](https://file.jishuzhan.net/article/1716744116290719746/4dd307a90e15135582a7e9f91c6c6478.webp) ## 总结认知 导致计算错误的主要原因是上图中的绿线连接的部分:实际的数据存储和计算过程中并不是指向同一个地址的数据。上图中程序中函数add_one使用的1,2都是在寄存器组0中的**R7,R6,R5,R4** 中(由于定义int需要使用2字节存储)。而在计算加的时候是指定了寄存器组1中的**R7,R6,R5,R4**,这当然会出现错误。切换使用寄存器的时候一定注意数据的传递情况,否则很可能出现错误。

相关推荐
范纹杉想快点毕业11 小时前
ZYNQ PS 端 UART 接收数据数据帧(初学者友好版)嵌入式编程 C语言 c++ 软件开发
c语言·笔记·stm32·单片机·嵌入式硬件·mcu·51单片机
方圆工作室12 小时前
51单片机驱动数码管
单片机·嵌入式硬件·51单片机
糖糖单片机设计18 小时前
硬件开发_基于物联网的沼气池环境监测系统
stm32·单片机·嵌入式硬件·物联网·51单片机
猫头虎2 天前
2025最新超详细FreeRTOS入门教程:第十三章 FreeRTOS临界区与原子操作
stm32·单片机·嵌入式硬件·物联网·51单片机·proteus·iot
大阳1232 天前
51单片机4(温度传感器DS18B20)
开发语言·单片机·嵌入式硬件·算法·51单片机
小莞尔3 天前
【51单片机】【protues仿真】基于51单片机公交报站系统
stm32·单片机·嵌入式硬件·51单片机·proteus
小莞尔4 天前
【51单片机】【protues仿真】基于51单片机宠物投食系统
c语言·stm32·单片机·嵌入式硬件·51单片机
清风6666664 天前
基于51单片机手机无线蓝牙APP控制风扇调速设计
单片机·mongodb·智能手机·毕业设计·51单片机·课程设计
猫头虎4 天前
2025最新超详细FreeRTOS入门教程:第八章 FreeRTOS任务通知
stm32·单片机·嵌入式硬件·物联网·硬件架构·51单片机·硬件工程
小莞尔5 天前
【51单片机】【protues仿真】基于51单片机停车场的车位管理系统
c语言·开发语言·单片机·嵌入式硬件·51单片机