在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位)程序状态寄存器(下面汇编语言中就是对这个寄存器设置后使用不同寄存器器组),下面是修改使用寄存器组用到的位

寄存器组

从上面的图片可以知道,有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 <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,这当然会出现错误。切换使用寄存器的时候一定注意数据的传递情况,否则很可能出现错误。

相关推荐
MGT_979610 小时前
基于51单片机的台灯控制(Proteus仿真)
嵌入式硬件·51单片机·proteus
夜间去看海11 小时前
基于51单片机的倒计时音乐播放系统设计
单片机·嵌入式硬件·51单片机
Whappy0011 天前
51单片机-DA(数字转模拟)
单片机·嵌入式硬件·51单片机
Whappy0011 天前
51单片机-AD(模拟信号转数字信号)-实验()
单片机·嵌入式硬件·51单片机
夜间去看海1 天前
基于51单片机的自动清洗系统(自动洗衣机)
嵌入式硬件·51单片机·proteus·洗衣机
MGT_97963 天前
基于51单片机的GPS定位系统(仿真)
单片机·嵌入式硬件·51单片机
Whappy0014 天前
51单片机-DS18B20(温度传感器)&AT24C02(存储芯片) & IIC通信-实验2-温度实时监测(可设置阈值)
单片机·嵌入式硬件·51单片机
Whappy0014 天前
51单片机-AT24C02(IIC总线介绍及其时序编写步骤)-第一节(下一节实战)
单片机·嵌入式硬件·51单片机
梦境虽美,却不长5 天前
51单片机快速入门之按键应用拓展
单片机·嵌入式硬件·51单片机
会编程的果子君5 天前
51单片机-系列-单片机基础知识入门&&流水灯
单片机·嵌入式硬件·51单片机