• 在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语言代码

    #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
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    整体程序执行过程

    在这里插入图片描述

    从汇编语言分析数据变换

    在这里插入图片描述

    总结认知

    导致计算错误的主要原因是上图中的绿线连接的部分:实际的数据存储和计算过程中并不是指向同一个地址的数据。上图中程序中函数add_one使用的1,2都是在寄存器组0中的R7,R6,R5,R4中(由于定义int需要使用2字节存储)。而在计算加的时候是指定了寄存器组1中的R7,R6,R5,R4,这当然会出现错误。切换使用寄存器的时候一定注意数据的传递情况,否则很可能出现错误。

  • 相关阅读:
    JSP(三)-- JSP注意事项
    设计模式-中介者模式
    MySQL大小版本升级步骤
    并列关系表合集PPT模板
    使用 Wireshark 抓包工具快速分析 IoT 物联网终端设备的网络通信行为
    软件测试之Web安全测试详解
    31、学习 Java 中的枚举类型
    【疑问&解决】访问CSDN文章的3种方式(自定义域名) | 关于网址的后缀:spm=1001.2014.3001.5501 | .m3u8文件、HLS协议? | 文心一言2023--7月15~16测试
    测试环境搭建教程(APP+WEB)
    QT信号槽机制
  • 原文地址:https://blog.csdn.net/weixin_43794311/article/details/134006958