网店营销网站,wordpress 分类列表插件,网站怎么响应式布局,营销型网站的类型Linux 学习记录52(ARM篇) 本文目录 Linux 学习记录52(ARM篇)一、汇编语言相关语法1. 汇编语言的组成部分2. 汇编指令的类型3. 汇编指令的使用格式 二、基本数据处理指令1. 数据搬移指令(1. 格式(2. 指令码类型(3. 使用示例 2. 立即数(1. 一条指令的组成 3. 移位操作指令(1. 格式…Linux 学习记录52(ARM篇) 本文目录 Linux 学习记录52(ARM篇)一、汇编语言相关语法1. 汇编语言的组成部分2. 汇编指令的类型3. 汇编指令的使用格式 二、基本数据处理指令1. 数据搬移指令(1. 格式(2. 指令码类型(3. 使用示例 2. 立即数(1. 一条指令的组成 3. 移位操作指令(1. 格式(2. 指令码类型(3. 使用示例 4. 位运算指令(1. 格式(2. 指令码(3. 运算规则(4. 使用示例(5. 练习 5. 算数运算指令(1. 格式(2. 指令码(3. 使用示例(4. 关于32位的处理器进行64位数据的运算原理 6. 比较指令(1. 概述(2. 比较指令结果的条件码(3. 使用示例 7. 跳转指令(1. 概述(2. 不保存返回地址(3. 跳转之前保存返回地址 练习1. 实现1-100的累加 一、汇编语言相关语法
1. 汇编语言的组成部分
1.伪操作不参与到程序的执行但是可以告诉编译器程序应该怎么执行或者程序中每一个部分有什么含义.text .global .globl .end .if .else .endif
2.汇编指令编译器将一条汇编指令编译成一条机器码执行指令后可以让ALU做出对应的运算操作实现特定的功能
3.伪指令不是汇编指令但是可以起到和汇编指令一样的作用通常一条伪指令的实现需要多条汇编指令一起完成4.汇编里的注释单行注释使用 其他架构下的汇编单行注释 可能会使用;多行注释/**/条件注释根据if后面的数值真假来去执行不同的指令段如果为真执行指令段1否则执行指令段2.if 数值指令段1.else指令段2.endif 2. 汇编指令的类型 基本的数据处理指令 数据搬移指令数据移位指令算数运算指令位运算指令比较指令 跳转指令内存读写指令程序状态寄存器读写指令软中断指令 3. 汇编指令的使用格式
格式opcode{cond}{s} Rd, Rn, shifter_operand解释
opcode : 指令码
cond : 条件码 默认汇编指令是无条件执行的使用条件码之后可以让汇编有条件的执行
s: 状态位 指令的执行结果会影响cpsr的NZCV位
Rd : 目标寄存器 运行的结果放到目标寄存器
Rn : 第一个操作寄存器只能是一个寄存器shifter_operand 第二个操作数 1 可以是一个普通的寄存器2 可以是一个立即数3 可以是经过移位操作的寄存器
opcode{cond}{s} 连到一起写
Rd, Rn, shifter_operand 使用逗号隔开
opcode{cond}{s}和Rd, Rn, shifter_operand直接使用空格隔开一条汇编指令占一行
汇编代码中不严格区分大小写
二、基本数据处理指令
1. 数据搬移指令
(1. 格式
opcode{cond}{s} Rd, shifter_operand
指令码 目标寄存器 操作数(2. 指令码类型
1. mov:将操作数搬移到寄存器中
2. mvn:将操作数按位取反后搬移到目标寄存器中(3. 使用示例
.text
.global _start
_start:mov r0,#0XFF 将0XFF搬移到r0寄存器中mvn r1,#0XFF 将0XFF按位取反结果存放到R1寄存器中stop:b stop
.end 2. 立即数
能够当作指令的一部分去执行的数据叫做立即数。一个立即数可以通过一个0-255之间的数字进行循环右移得到
如何判断一个数据是不是立即数
在0-255内找到一个数据将数据循环右移偶数位如果能够得到这个数据就说明这个数据是一个立即数
ex1:0X104-二进制0000 0000 0000 0000 0000 0001 0000 0100
找到一个0-255范围内的数0000 0000 0000 0000 0000 0000 0100 0001——》0X41
0x41循环右移30位可以得到0X104所以0X104就是立即数ex:0X101-二进制:0000 0000 0000 0000 0000 0001 0000 0001(1. 一条指令的组成
在32位下一条指令大小为32字节
[0:7] 0-255的数据 进行循环右移的数据通过这个数据循环右移偶数位可以得到第二操作数
[8:11] 低八位循环右移的偶数位对应拖偶数由这个区间的数值*2得到
[12:15] Rd 目标寄存器标识
[16:19] Rn 操作寄存器标识
[20:21] s 状态位
[22:25] opcond 指令码
[26:27] 001
[28:31] cond 条件码注意对于立即数的判断如果数据mov指令的操作数0XFFFF0000,则在计算机处理时按照MVN指令进行判断 可以使用伪指令 3. 移位操作指令
(1. 格式
格式opcode{cond}{s} Rd, Rn, shifter_operand解释
opcode : 指令码
cond : 条件码 默认汇编指令是无条件执行的使用条件码之后可以让汇编有条件的执行
s: 状态位 指令的执行结果会影响cpsr的NZCV位
Rd : 目标寄存器 运行的结果放到目标寄存器
Rn : 第一个操作寄存器只能是一个寄存器shifter_operand 第二个操作数 (2. 指令码类型
1. 左移运算 低位补0
2. lsr:右移运算 高位补0
3. ror:循环右移 低位移出的数据补到最高位(3. 使用示例
.text
.global _start _start:mov r0,#0XFFlsl r1,r0,#4 将r0的值左移4位结果放到r1中 R10XFF0lsr r2,r0,#4 将r0的值右移4位结果放到r2中 R20XFror r3,r0,#4 将r0的值循环右移4位结果放到r3中 R30XF000000F
stop:b stop
.end 4. 位运算指令
(1. 格式
格式opcode{cond}{s} Rd, Rn, shifter_operand解释
opcode : 指令码
cond : 条件码 默认汇编指令是无条件执行的使用条件码之后可以让汇编有条件的执行
s: 状态位 指令的执行结果会影响cpsr的NZCV位
Rd : 目标寄存器 运行的结果放到目标寄存器
Rn : 第一个操作寄存器只能是一个寄存器shifter_operand 第二个操作数 (2. 指令码
1. and按位与 与0清0与1不变
2. orr:按位或 或1置1 或0不变
3. eor:按位异或 相同为0 不同为1
4. bic:按位清0 想要哪一位设置为0只需要将这一位用bic指令和相同位为1的数进行运算(3. 运算规则 (4. 使用示例
.text
.global _start _start:mov r0,#0XFFand r1, r0,#0XF r10XForr r2,r0,#0XF00 r20XFFFeor r3,r0,#0XF R30XF0bic r4,r0,#0X14 R40XEB
stop:b stop
.end (5. 练习
LDR r0,0X123456780001 0010 0011 0100 0101 0110 0111 1000
1.将r0寄存器的第4位清0其他位不变
bic r0,r0,#(14)
或者
and r0,r0,#(~(14))2.将R0寄存器的第7位置1其他位不变orr r0,r0,#(17)3.将r0寄存器的第[31:28]清0其他位不变
bic r0,r0,#(0XF28)4.将r0寄存器第[7:4]位置1其他位不变
ORR r0,r0,#(0XF4)5.将R0寄存器的第[15:11]位设置为10101其他位不变
思路把指定的几位设置为特定的数值先把这几位清0在赋值
BIC r0,r0,#(0X1F11)先清0
ORR r0,r0,#(0X1511)再赋值5. 算数运算指令
(1. 格式
格式opcode{cond}{s} Rd, Rn, shifter_operand解释
opcode : 指令码
cond : 条件码 默认汇编指令是无条件执行的使用条件码之后可以让汇编有条件的执行
s: 状态位 指令的执行结果会影响cpsr的NZCV位
Rd : 目标寄存器 运行的结果放到目标寄存器
Rn : 第一个操作寄存器只能是一个寄存器shifter_operand 第二个操作数 (2. 指令码
1. add :进行加法运算
2. adc:进行加法运算的时候考虑到CPSR的c位
3. sub:进行减法运算
4. sbc进行减法运算时考虑到CPSR的C位
5. mul:乘法运算(3. 使用示例
1.加法1MOV r0,#1mov r1,#3add r2,r0,r1 将r0r1的结果存放r2寄存器
2.加法2MOV r0,#0XFFFFFFFEmov r1,#3adds r2,r0,r1 将r0r1的结果存放r2寄存器s结果进位就会影响到CPSR的c位3.减法运算
MOV r0,#3mov r1,#0XFFFFFFFEsubs r2,r0,r1 将r0-r1的结果存放r2寄存器(4. 关于32位的处理器进行64位数据的运算原理
原理一个64位的数据放在两个寄存器中分别存放这个数据的高64位以及低64位
进行64位数据运算时将两个64位数据的低32位运算高32位运算以加法为例子MOV r0,#0X3 第一个64位数的低32位 mov r1,#0X1 第一个数的高32位mov r2,#0XFFFFFFFE 第2个64位数的低32位mov r3,#0X4 第二个64位数据的高32位adds r4,r0,r2 两个低32位数运算结果影响到CPSR的C位adc r5,r1,r3 两个高32位数据运算结果存放在r5中考虑到C位6. 比较指令
(1. 概述 格式 opcode Rn, shifter_operand opcode:比较指令的指令码是cmp 功能将第一操作寄存器和第二操作数的值进行比较 本质比较指令的本质就是拿进行比较的两个数值进行减法运算并且减法运算的结果会影响到CPSR的条件位 我们可以根据条件位的数值进行两个数值的判断再根据判断的结果做不同的操作 一般比较指令和条件码都是一起使用的 (2. 比较指令结果的条件码
条件码助记符后缀标志含义0000eqz置位相等0001nez清零不相等0010csc置位无符号数大于或等于0011ccc清零无符号数小于0100min置位负数0101pln清零正数或零0110vsv置位溢出0111vcv清零未溢出1000hic置位z清零无符号数大于1001lsc清零z置位无符号数小于或等于1010gen等于v带符号数大于或等于1011ltn不等于v带符号数小于1100gtz清零且n等于v带符号数大于1101lez置位或n不等于v带符号数小于或等于1110al忽略无条件执行
(3. 使用示例
.text
.global _start _start:MOV r0,#0X3 mov r1,#0X1 cmp r0,r1 数值比较根据比较的结果执行不同的指令addeq r2,r1,r0 如果两个数相等两数相加将结果保存至r2中subcs r3,r0,r1 如果r0r1,就做减法运算将结果保存在r3寄存器mulcc r4,r0,r1 如果r0r1,就做乘法运算结果保存在r4寄存器中
stop:b stop
.end 7. 跳转指令
(1. 概述
格式
opcode{cond} label
功能跳转到指定的标签下功能码
1. b :跳转到指定的标签下返回地址不保存
2.bl:跳转到指定的标签下返回地址保存至 LR寄存器中(2. 不保存返回地址
.text
.global _start _start:MOV r0,#0X3 mov r1,#0X1 b fun 跳转到fun标签cmp r0,r1 数值比较根据比较的结果执行不同的指令addeq r2,r1,r0 如果两个数相等两数相加将结果保存至r2中subcs r3,r0,r1 如果r0r1,就做减法运算将结果保存在r3寄存器mulcc r4,r0,r1 如果r0r1,就做乘法运算结果保存在r4寄存器中
fun:mov r3,#3mov r4,#4
stop:b stop
.end (3. 跳转之前保存返回地址
.text
.global _start
_start:MOV r0,#0X3 mov r1,#0X1 bl fun 跳转到fun标签,返回地址保存至LR寄存器cmp r0,r1 数值比较根据比较的结果执行不同的指令addeq r2,r1,r0 如果两个数相等两数相加将结果保存至r2中subcs r3,r0,r1 如果r0r1,就做减法运算将结果保存在r3寄存器mulcc r4,r0,r1 如果r0r1,就做乘法运算结果保存在r4寄存器中
fun:mov r3,#3mov r4,#4mov pc,lr 程序返回
stop:b stop
.end练习
1. 实现1-100的累加
.text
.global _start
_start:mov r0,#0 将r0作为计数器mov r1,#0 将r1作为和stop:add r0,#1 累计循环次数cmp r0,#101 比较循环次数beq over 当满足条件时跳转至over处addls r1,r1,r0 当循环次数小于101时累加b stop over: 当循环结束跳转到次处mov r2,r1 将r1计算的结果赋值给r2
.end