汇编的使用总结

一、汇编的组成

1、汇编指令(指令集)

数据处理指令:

数据搬移指令

数据移位指令

位运算指令

算术运算指令

比较指令

跳转指令

内存读写指令

状态寄存器传送指令

异常产生指令等

2、伪指令

不是汇编指令,但是可以起到指令的作用,伪指令也会占用一定内存空间

3、伪操作

不占用指令内存,能够在程序编译过程中起到编译引导作用的内容

4、注释

二、汇编指令

2.1基本格式

<opcode>{<cond>}{s} <Rd>,<Rn>,<shifter_operand>

注释:

opcode:指令的功能码,用来表示当前指令的作用

(可以写,也可以不写

cond:条件码

s:表示进行运算时运算的结果会影响到CPSR条件位

Rd:目标寄存器

Rn:第一操作寄存器

shifter_operand:第二操作寄存器

2.2数据搬移指令

1、mov{条件码} 目标寄存器 操作数

将操作数搬移到目标寄存器

2、mvn{条件码} 目标寄存器 操作数

将操作数按位取反后搬移到目标寄存器

注意:

操作数可以是一个寄存器,也可以是一个立即数

立即数:能够经过编码之后保存到指令空间中直接当作指令一部分去执行的数据。

如果想要把一个非立即数搬移到目标寄存器,使用**伪指令ldr,**格式:ldr 目标寄存器,=数据

2.3数据移位指令

1、逻辑左移

lsl{条件码} 目标寄存器,第一操作寄存器,第二操作数

将第一操作寄存器的数据左移第二操作数位数,结果保存到目标寄存器

2、逻辑右移

lsr{条件码} 目标寄存器,第一操作寄存器,第二操作数

将第一操作寄存器的数据右移第二操作数位数,结果保存到目标寄存器

3、循环右移

ror{条件码} 目标寄存器,第一操作寄存器,第二操作数

将第一操作寄存器的数据循环右移第二操作数位数,结果保存到目标寄存器

2.4位运算指令

1、与运算

and{条件码} 目标寄存器,第一操作寄存器,第二操作数

将第一操作寄存器的数据和第二操作数进行与运算,结果保存到目标寄存器

2、或运算

orr{条件码} 目标寄存器,第一操作寄存器,第二操作数

将第一操作寄存器的数据和第二操作数进行或运算,结果保存到目标寄存器

3、异或运算

eor{条件码} 目标寄存器,第一操作寄存器,第二操作数

将第一操作寄存器的数据和第二操作数进行异或运算,结果保存到目标寄存器

4、按位取反

mvn{条件码} 目标寄存器,第一操作寄存器,第二操作数

5、按位清零

bic{条件码} 目标寄存器,第一操作寄存器,第二操作数

将第一操作寄存器的数据和第二操作数进行与运算,结果保存到目标寄存器

2.5算术运算

1、加法运算

add{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数

目标寄存器=第一操作寄存器+第二操作数

2、考虑CPSR条件位的加法运算

adc{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数

目标寄存器=第一操作寄存器+第二操作数+cpsr寄存器c位的值

3、减法运算

sub{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数

目标寄存器=第一操作寄存器-第二操作数

4、考虑CPSR条件位的减法运算

sbc{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数

目标寄存器=第一操作寄存器-第二操作数-cpsr寄存器c位的值

5、乘法运算

mul{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数

目标寄存器=第一操作寄存器*第二操作数

2.6比较指令

1、cmp 第一操作寄存器,第二操作数

将第一操作寄存器和第二操作数进行比较

2、tst 目标寄存器,#(0x1<<N)

用来判断目标寄存器的第N位是否为0

3、teq 目标寄存器,第二操作数

判断目标寄存器的值是否和第二操作数相等

2.7跳转指令

1、b 标签

跳转到指定的标签下,跳转后LR寄存器不保存程序返回地址

2、bl 标签

跳转到指定的标签下,跳转后LR寄存器保存程序返回地址

2.8内存读写指令

①单寄存器内存读写指令

写:

1、str 目标寄存器,[目标地址]

将目标寄存器中四字节数据写入到目标地址对应的内存中

2、strh 目标寄存器,[目标地址]

将目标寄存器中二字节数据写入到目标地址对应的内存中

3、strb 目标寄存器,[目标地址]

将目标寄存器中一字节数据写入到目标地址对应的内存中

读:

1、ldr 目标寄存器,[目标地址]

从目标寄存器中读取四字节数据到目标地址对应的内存中

2、ldrh 目标寄存器,[目标地址]

将目标寄存器中读取二字节数据到目标地址对应的内存中

3、ldrb 目标寄存器,[目标地址]

将目标寄存器中读取一字节数据到目标地址对应的内存中


②批量寄存器内存读写指令

写:

1、stm 基地址,{寄存器列表}

将寄存器列表中所有寄存器的数据写入到基地址为首地址的内存中

读:

1、ldm 基地址,{寄存器列表}

从基地址开始往下读取数据,保存到寄存器列表中的每一个寄存器中

批量寄存器地址增长方式

Ⅰ、ia后缀 先向基地址读写数据,基地址再往大地址方向增长

Ⅱ、ib后缀基地址先往大地址方向增长,再向基地址读写数据

Ⅲ、da后缀先向基地址读写数据,基地址再往小地址方向增长

Ⅳ、da后缀 基地址先往小地址方向增长,再向基地址读写数据


③栈内存读写

压栈:

push {寄存器列表}

出栈:

pop {寄存器列表}

栈的分类:

1、空栈和满栈

2、增栈和减栈

组合:空增栈(EA) 空减栈(ED) 满增栈(FA) 满减栈(FD)

2.9状态寄存器传送指令

1、读状态寄存器指令

mrs 目标寄存器,CPSR

读取CPSR寄存器数值,保存到目标寄存器

2、修改状态寄存器

msr CPSR,操作数

修改CPSR寄存器的数值为操作数

2.10软中断产生指令

1、swi 操作数

操作数是一个立即数,就是产生软中断的中断号

异常模式和异常源

相关推荐
CHANG_THE_WORLD11 小时前
switch语句在汇编层面的几种优化方式 ,为什么能进行优化
汇编·算法·switch·汇编分析·switch case·switch case 汇编·switch case 语句
SundayBear1 天前
嵌入式进阶:C语言内联汇编
c语言·开发语言·汇编
CC-NX3 天前
32位汇编:实验5算数运算类指令使用
汇编·win32·算数运算
伐尘3 天前
【汇编】RAX,eax,ax,ah,al 关系
汇编
CHANG_THE_WORLD3 天前
c语言位运算 汇编代码分析
c语言·开发语言·汇编
CHANG_THE_WORLD3 天前
if条件语句 三目运算符 汇编分析
汇编·算法·条件语句·if 语句·汇编分析·条件语句汇编分析
CHANG_THE_WORLD4 天前
有符号数和无符号数的 汇编视角 区别
汇编
南飞测绘视界5 天前
【编号220】中国国内生产总值历史数据汇编1952-2021合订本(PDF扫描版)
汇编·pdf·年鉴
Ayanami_Reii7 天前
汇编和C语言结构
c语言·汇编·笔记
脑子慢且灵9 天前
C语言与Java语言编译过程及文件类型
java·c语言·开发语言·汇编·编辑器