汇编的使用总结

一、汇编的组成

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

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

异常模式和异常源

相关推荐
浩浩测试一下9 小时前
汇编中的JCC指令 (逆向分析)
汇编·逆向·标志位·jcc指令·跳转指令·标志位寄存器
浩浩测试一下10 小时前
汇编中的段与段寄存器(大小)段序 (逆向分析)
汇编·逆向·二进制·字节序·windows编程·内存地址排序
浩浩测试一下1 天前
汇编 call与ret 函数与堆栈 (逆向分析)
汇编·push·函数·pop·call·ret·堆栈逆向
山屿落星辰2 天前
昇腾NPU算子开发:从“手写汇编“到“搭积木“
汇编
浩浩测试一下2 天前
汇编 汇编寻址 (逆向分析)
汇编·寻址·windows编程·二进制逆向·机器码
浩浩测试一下2 天前
汇编 位运算 (逆向分析)
汇编·逆向·位运算·asm·windows编程·二进制逆向
浩浩测试一下2 天前
汇编 高低八位寄存器数据存储方式(逆向分析)
汇编·网络安全·逆向·二进制·免杀·寄存器·windows编程
a83331963 天前
C语言嵌入汇编详解
汇编·单片机·语言
yoyo_zzm4 天前
汇编到PHP:五大编程语言核心特性全解析
开发语言·汇编·php
ComputerInBook6 天前
X64 汇编 MOVSD 的两种用法
汇编·汇编指令·movsd