• 汇编指令初步


    汇编指令初步

    指令和数据的存储方式

    数据在SRAM存储器中的存储方法

    AVR iATtiny88处理器从SRAM起始地址0x100开始存储数据,0x100之前的空间预留给系统使用

    存储空间 功能 先后顺序
    data区 存储已初始化的变量
    bss区 存储未初始化的变量

    指令机器码在FLASH存储器中的存储方法

    启动
    函数
    退出

    汇编程序分析

    PC指针:程序计数器

    非转移指令

    2个字节为一个指令单元,根据指令占多少字节长度,决定PC加多少

    转移指令

    将PC值更新为将要跳转的地址

    SP堆栈指针

    函数调用时保存调用函数指令的下一条指令地址
    在AVR处理器中,堆栈空间位于SRAM的尾部
    SP指针一直指向栈顶
    call指令与ret指令通常配套执行,分别完成函数执行现场保存与回复工作

    汇编代码分析

    变量的赋值

    例:s[1]=20;//&s[1]=0x0104

    ldi r24,0x14//ldi : load immediate,装载一个字节立即到寄存器
    ldi r25,0x00
    sts 0x0105,r25//sts :store SRAM,向SRAM数据空间中写。
    sts 0x0104,r24
    //load表示装载,也即读操作
    //store表示存储,也即写操作
    
    ldi和lds的区别
    ldi r24,0x14//读一个立即数,其中的0x14为一个16进制的数值
    lds r24,0x0108//从SRAM中读出一个数,其中的0x0108为一个地址
    

    函数的调用

    例:d=funA(s[0],d);

    lds r24,0x0102
    lds r25,0x0103
    ldi r22,0x46;70
    ldi r23,0x01;1
    rcall .-78
    

    1.需要将函数调用的局部变量和全局变量传入寄存器
    局部变量使用ldi
    全局变量使用lds
    2.调用子函数funA
    rcall功能:跳转到子函数的地址处执行
    rcall是相对跳转(r表示relative)目的地址 = 当前地址 + 偏移值
    rcall .-78//要跳转的子函数地址为:0xae(当前地址)+(-78)=0x60(目的地址)

    函数的返回

    例:

    int funA(int x,int y)
    {
    add r22,r24//低位相加
    adc r23,r25//高位相加,(标记位c表示考虑进位),adc为带进位的加法指令
        return x+y;
    mov r24,r22//mov:拷贝指令
    mov r25,r23
    ret
    }
    

    注:AVR处理器约定:从寄存器r25开始(寄存器r26~r31为预留寄存器,专用于间接寻址),依据传递的各个参数的所占字节数,依次往下使用寄存器
    #############
    lds r24,0x0060// 0x0060导出至寄存器r24

    `
    ldi r22,0x14 //将立即数常量0x14写入寄存器R22中

    `

  • 相关阅读:
    系统吞吐量(TPS)、用户并发量、性能测试概念和公式
    javascript 匿名函数和闭包
    构建高可扩Web架构和分布式系统实战
    Javascript prototype 的作用
    myeclipse下载地址
    tomacat7.0配置(windows)
    IEEE802.11
    C#(多态)
    C#(泛型集合的使用)
    C#(对象引用)
  • 原文地址:https://www.cnblogs.com/sgawscd/p/10849342.html
Copyright © 2020-2023  润新知