汇编的使用总结

一、汇编的组成

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 操作数

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

异常模式和异常源

相关推荐
Ronin-Lotus9 天前
微处理器原理与应用篇---ARM常见汇编指令
汇编·arm开发·微处理原理与应用
永夜的黎明12 天前
【二进制安全作业】250616课上作业1-栈溢出漏洞利用
c语言·汇编·安全
Geometry Fu15 天前
物联网控制技术 知识点总结 第三章 汇编语言 第四章 C51语言
汇编·物联网·51单片机
半桔15 天前
【Linux手册】进程的状态:从创建到消亡的“生命百态”
linux·运维·服务器·汇编·深度学习·面试
一条叫做nemo的鱼18 天前
从汇编的角度揭开C++ this指针的神秘面纱(下)
java·汇编·c++·函数调用·参数传递
一条叫做nemo的鱼18 天前
从汇编的角度揭开C++ this指针的神秘面纱(上)
汇编·c++·算法·函数调用·this指针·参数传递
qwertyuiop_i20 天前
汇编(函数调用)
汇编·windows·函数调用
不忘不弃20 天前
由汇编代码确定switch语句
汇编
南玖yy20 天前
深入理解 x86 汇编中的符号扩展指令:从 CBW 到 CDQ 的全解析
开发语言·汇编·arm开发·后端·架构·策略模式
iCxhust20 天前
汇编字符串比较函数
c语言·开发语言·汇编·单片机·嵌入式硬件