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的累加

相关推荐
我在人间贩卖青春4 天前
汇编之伪指令
汇编·伪指令
我在人间贩卖青春4 天前
汇编之伪操作
汇编·伪操作
济6174 天前
FreeRTOS基础--堆栈概念与汇编指令实战解析
汇编·嵌入式·freertos
myloveasuka4 天前
汇编TEST指令
汇编
我在人间贩卖青春4 天前
汇编编程驱动LED
汇编·点亮led
我在人间贩卖青春4 天前
汇编和C编程相互调用
汇编·混合编程
myloveasuka5 天前
寻址方式笔记
汇编·笔记·计算机组成原理
请输入蚊子5 天前
《操作系统真象还原》 第六章 完善内核
linux·汇编·操作系统·bochs·操作系统真像还原
myloveasuka5 天前
指令格式举例
汇编·笔记·计算机组成原理
我在人间贩卖青春6 天前
汇编之分支跳转指令
汇编·arm·分支跳转