Keil汇编相关知识

一、汇编的组成

1.汇编指令:在内存中占用内存,执行一条汇编指令会让处理器进行相关运算

分类:数据处理指令,跳转指令,内存读写指令,状态寄存器传送指令,软中断产生指令,协助处理器指令

2.伪操作:不是汇编指令,不占用指令周期,起到声明作用

3.伪指令:不是汇编指令,占用指令内存,当执行伪指令会让处理器进行对应的运算操作,通常伪指令是一条或多条汇编指令的另外一种用法

4.注释:

单行注释:@,其他架构汇编注释可能是;

多行注释:/**/

条件编译:

.if 逻辑值

代码段

.else

代码段

.endif

二、汇编指令的基本格式

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

<opcode>:汇编指令的指令码,由指令码决定现在是哪一个指令

cond:条件码,可以有可无,执行指令前先判断,满足才执行指令

s:指令码后加s,表示指令的运算结果会影响到CPSR寄存器的条件位

Rd:目标寄存器,指令运算结果会保存在目标寄存器中

Rn:第一操作寄存器,只能写寄存器,参与运算的第一个数值

shifter_operand:第二操作数,可以是寄存器,也可以是一个立即数

运算解释:先判断条件码对应条件是否满足,如满足则将第一操作数与第二操作数按指令码进行运算,运算的结果保存在目标寄存器中,并且结果影响CPSR条件位

三、数据搬移指令

1.mov{条件码} 目标寄存器,操作数vn

条件码可有可无,当存在条件码时,需满足条件才能1将操作数的数值搬移到目标寄存器

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

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

3.立即数

能够当作指令的一部分直接去执行的数据,操作数在当作指令的一部分执行时,需要对该操作数进行处理并保存到指令空间的[11:0]位中,如果处理完毕能够保存进去,说明该操作数是立即数。

处理方式:对该操作数进行循环右移偶数位,如果右移过程中,该操作数右移的值有在0-255这个范围内,说明该操作数是一个立即数,此时将循环右移的值保存在指令空间的[7:0]位,循环右移的偶数位数除以2的值保存到指令空间的[11:8]中(快速判断是否立即数:起始位为1和结束位为1之间的位数要小于7是立即数),当循环右移始终得不到0-255的数据,此时将其取反,如果取反值在0-255之间,该数据也是立即数

4.如果要将一个非立即数保存到寄存器中,可以使用伪指令LDR

四、数据移位指令

算术右移:除了最高符号位不变,最低位移出,最高位补0

逻辑右移:lsr{条件码},目标寄存器,第一操作寄存器,第二操作数

最低位移出,最高位补0,将第一操作寄存器的数值右移第二操作数对应的位数

循环右移:ror{条件码},目标寄存器,第一操作寄存器,第二操作数

最低位移出,补到最高位,将第一操作寄存器的数值循环右移第二操作数对应的位数

逻辑左移:lsl{条件码},目标寄存器,第一操作寄存器,第二操作数

将第一操作寄存器的数值左移第二操作数对应的位数

在书写操作数时可以使用c风格移位运算:如:mov r1,#(oxff>>4);

五、位运算指令

与:与0置0,与1不变

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

将第一操作寄存器和第二操作数进行按位与操作,结果保存到目标寄存器中

或:或1置1,或0不变

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

将第一操作寄存器和第二操作数进行按位或操作,结果保存到目标寄存器中

异或:相同为0,相异为1

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

将第一操作寄存器和第二操作数进行按位异或操作,结果保存到目标寄存器中

按位取反

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

将操作数进行按位取反操作,结果保存到目标寄存器中

按位清0:想要运算结果为0,则给一个运算数据1

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

将第一操作寄存器和第二操作数进行按位清零操作,结果保存到目标寄存器中

六、算数运算指令

1.加法指令:

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

将第一操作数寄存器的值加第二操作数,结果保存到目标寄存器,如果在指令后加s,结果会影响CPSR条件位

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

将第一操作数寄存器的值加第二操作数再加上CPSR的c位值,结果保存到目标寄存器,如果在指令后加s,结果会影响CPSR条件位

2.减法指令:

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

将第一操作数寄存器的值减去第二操作数,结果保存到目标寄存器,如果在指令后加s,结果会影响CPSR条件位

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

将第一操作数寄存器的值减去第二操作数再减去CPSR的c位值取反,结果保存到目标寄存器,如果在指令后加s,结果会影响CPSR条件位

3.乘法指令:mul{条件码}{s}目标寄存器,第一操作寄存器,第二操作数

将第一操作数寄存器的值乘以第二操作数,结果保存到目标寄存器,如果在指令后加s,结果会影响CPSR条件位

4.在32位的处理器上进行64位的数据运算:将64位数据保存两个寄存器中,先运算低32位,运算结果影响CPSR位,后运行高32位考虑CPSR位

七、比较指令

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

进行两个数的比较,比较指令的本质时两个数的减法运算,运算结果影响CPSR条件位,一般比较指令会和条件码一起使用,先通过比较指令产生条件,后面的指令加上条件码,判断条件码对应的条件是否满足

练习:使用汇编实现1-100的累加

相关推荐
Crossoads10 小时前
【汇编语言】端口 —— 「从端口到时间:一文了解CMOS RAM与汇编指令的交汇」
android·java·汇编·深度学习·网络协议·机器学习·汇编语言
雪碧透心凉_3 天前
8086汇编(16位汇编)学习笔记00.DEBUG命令使用解析及范例大全
汇编
C66668886 天前
C#多线程
开发语言·汇编·c#
傻童:CPU6 天前
汇编源程序的理解
汇编
木槿716 天前
软件包git没有可安装候选
汇编·git
ok0607 天前
各种开源汇编、反汇编引擎的非专业比较
汇编·开源
roboko_7 天前
MIPS指令集(一)基本操作
汇编
Crossoads7 天前
【汇编语言】内中断(三) —— 中断探险:从do0到特殊响应的奇妙旅程
android·开发语言·javascript·网络·汇编·单片机·机器学习
染指11108 天前
49.第二阶段x86游戏实战2-鼠标点击call深追二叉树
汇编·c++·windows·游戏安全·反游戏外挂·游戏逆向
程序leo源10 天前
深入理解指针
android·c语言·开发语言·汇编·c++·青少年编程·c#