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

相关推荐
xxwxx__16 天前
51单片机 + ESP8266 TCP通信实战:从零实现WiFi远程控制
c语言·嵌入式硬件·tcp/ip·51单片机
智者知已应修善业17 天前
【51单片机串口通信甲机四个按键模拟四位二进制值发送乙机以十进制显示2位数码管】2024-6-14
c++·经验分享·笔记·算法·51单片机
深圳市晶科鑫实业有限公司18 天前
国产TCXO温补晶振是否可以完美替代欧美日系主流型号
人工智能·stm32·单片机·物联网·51单片机·信息与通信
xxwxx__18 天前
51单片机串口通信完全指南:从原理到实战(发送、接收、回环与控制)
c语言·单片机·嵌入式硬件·51单片机
智者知已应修善业19 天前
【51单片机2个外部中断显示中断历时,初始化8左移3位共阳数码管】2024-6-6
c++·经验分享·笔记·算法·51单片机
智者知已应修善业20 天前
【51单片机8位数码管同时倒计时从9999】2024-1-25
c++·经验分享·笔记·算法·51单片机
H__Rick20 天前
C51学习-DAY4
嵌入式硬件·学习·51单片机·硬件工程
H__Rick20 天前
C51学习-DAY7
单片机·嵌入式硬件·学习·51单片机