汇编指令初步

Posted sgawscd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编指令初步相关的知识,希望对你有一定的参考价值。

汇编指令初步

指令和数据的存储方式

数据在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中

`

以上是关于汇编指令初步的主要内容,如果未能解决你的问题,请参考以下文章

《Linux内核 核心知识全解析(完)》

shell编程初步grep及正则表达式

1.基础知识

汇编语言实验二

优化系列MIPS架构汇编优化资料

汇编语言实验二