arm入门
来源:互联网 发布:华为云计算做得怎么样 编辑:程序博客网 时间:2024/05/21 19:22
area Init, code, readonly
code32
entry
start
;一、op2的形式
;1.立即数
mov r0, #0x100
mov r2, #1
;对于立即数的概念,在机器码中0-11位可以存储立即数,但是其中后八位组成的数可以直接作为立即数,但是超出八位的,可以要通过位移偶数个位数得到前面0-255就可以组成
;在ARM汇编的数据处理指令中经常会使用到常数,而ARM汇编中规定使用的常数必 须是立即数。ARM立即数的是由一个8位的常数循环右移偶数位得到的,其中循环右移 的位数由一个4位2进制的两倍表示,公式如下:
;immediate=immed_8<<(2*rotate_imm4) “<<”表示循环右移 简单的说一个常数如果可以由一个8位的常数循环移位偶数位得到,那么就是立即数。
;2.寄存器
mov r1, r0
;3.寄存器移位立即数位
mov r1, r0, lsl #2
;4.寄存器移位寄存器位
;将十六进制转换成十进制
mov r1, r0, lsl r2
;二.桶形移位器
; lsl
; r0循环右移22位
; 为什么没循环左移 等价于 循环左移32-22位
mov r0, r0, ror #22
; C的循环右移22位:(a<<10)|(a>>22)
; 数据处理类指令
; mov mvn
mvn r0, #0 ; op2的反码赋给r0,按照位数取反给r0
; 给r0 赋为 -4
mvn r0, #0x4
add r0, r0, #1
;add op2的形式
mov r3, #2
mov r4, #1
add r2, r0, r1 ; r2 = r0 + r1
add r2, r0, #0x20
add r2, r0, r3, lsr #1
add r2, r0, r3, lsr r4
; 三.立即数: 0-255以内的数据经过循环右移偶数位。
;mov r0, #0x12345678
mov r0, #0xe0000001
--
mov r0, #0x00001f80
;机器码
mov r0, r1
; 四. 影响标志位(加s)
; N: rd结果为负数 置1, 结果为非负 清0
; Z: rd结果为0 置1, 结果为非0 清0
; C: 1.加法: 进位 c=1 无进位 c=0(无符号数相加,是否有进位)
; 2.减法: 借位 c=0 无借位 c=1
; 3.移位: 最后往C移的数据。
; V: 有溢出 v=1 无溢出 v = 0 (将参与运算的两个数理解为有符号数(补码)
; 运算结果超出了寄存器的表示范围,为溢出 v=1.
mov r0, #0 ; 不影响标志位
movs r0, #0 ; 加s影响标志位
mvn r1, #0 ; -1
mov r0, #1 ;1 v = 0
add r2, r0, r1
adds r2, r0, r1 ; c = 1 z = 1 进位(无符号数理解)
mov r0, #1
mov r1, #2
subs r2, r1, r0 ; r2 = r1 - r0 c = 1
subs r2, r0, r1 ; r2 = r0 - r1 c = 0 N =1
; v 一个字节:-128 - 127 -256
mov r0, #0x80000000 ;; -128 + (-128) 超出了表示范围
adds r2, r0, r0 ; z = 1 c = 1 v = 1(有符号数理解)
adds r2, r0, r1 lsl #2
stop
b stop
end
code32
entry
start
;一、op2的形式
;1.立即数
mov r0, #0x100
mov r2, #1
;对于立即数的概念,在机器码中0-11位可以存储立即数,但是其中后八位组成的数可以直接作为立即数,但是超出八位的,可以要通过位移偶数个位数得到前面0-255就可以组成
;在ARM汇编的数据处理指令中经常会使用到常数,而ARM汇编中规定使用的常数必 须是立即数。ARM立即数的是由一个8位的常数循环右移偶数位得到的,其中循环右移 的位数由一个4位2进制的两倍表示,公式如下:
;immediate=immed_8<<(2*rotate_imm4) “<<”表示循环右移 简单的说一个常数如果可以由一个8位的常数循环移位偶数位得到,那么就是立即数。
;2.寄存器
mov r1, r0
;3.寄存器移位立即数位
mov r1, r0, lsl #2
;4.寄存器移位寄存器位
;将十六进制转换成十进制
mov r1, r0, lsl r2
;二.桶形移位器
; lsl
; r0循环右移22位
; 为什么没循环左移 等价于 循环左移32-22位
mov r0, r0, ror #22
; C的循环右移22位:(a<<10)|(a>>22)
; 数据处理类指令
; mov mvn
mvn r0, #0 ; op2的反码赋给r0,按照位数取反给r0
; 给r0 赋为 -4
mvn r0, #0x4
add r0, r0, #1
;add op2的形式
mov r3, #2
mov r4, #1
add r2, r0, r1 ; r2 = r0 + r1
add r2, r0, #0x20
add r2, r0, r3, lsr #1
add r2, r0, r3, lsr r4
; 三.立即数: 0-255以内的数据经过循环右移偶数位。
;mov r0, #0x12345678
mov r0, #0xe0000001
--
mov r0, #0x00001f80
;机器码
mov r0, r1
; 四. 影响标志位(加s)
; N: rd结果为负数 置1, 结果为非负 清0
; Z: rd结果为0 置1, 结果为非0 清0
; C: 1.加法: 进位 c=1 无进位 c=0(无符号数相加,是否有进位)
; 2.减法: 借位 c=0 无借位 c=1
; 3.移位: 最后往C移的数据。
; V: 有溢出 v=1 无溢出 v = 0 (将参与运算的两个数理解为有符号数(补码)
; 运算结果超出了寄存器的表示范围,为溢出 v=1.
mov r0, #0 ; 不影响标志位
movs r0, #0 ; 加s影响标志位
mvn r1, #0 ; -1
mov r0, #1 ;1 v = 0
add r2, r0, r1
adds r2, r0, r1 ; c = 1 z = 1 进位(无符号数理解)
mov r0, #1
mov r1, #2
subs r2, r1, r0 ; r2 = r1 - r0 c = 1
subs r2, r0, r1 ; r2 = r0 - r1 c = 0 N =1
; v 一个字节:-128 - 127 -256
mov r0, #0x80000000 ;; -128 + (-128) 超出了表示范围
adds r2, r0, r0 ; z = 1 c = 1 v = 1(有符号数理解)
adds r2, r0, r1 lsl #2
stop
b stop
end
0 0
- arm入门
- arm入门
- arm入门
- ARM入门文章_1
- keil for arm 入门
- keil for arm 入门
- ARM入门文章_1
- ARM入门资料
- GNU ARM汇编入门
- GNU ARM汇编入门
- GNU ARM汇编入门
- 【转载】ARM入门
- ARM 入门笔记
- ARM串口编程入门
- GNU ARM汇编入门
- ARM+LINUX如何入门
- ARM入门学习经验
- GNU ARM汇编入门
- mysql学习笔记
- Java_final的使用
- 3Dmax无法安装
- BP神经网络的数学原理及其算法实现
- C语言快速排序算法
- arm入门
- 标签a没有href属性
- hdu 2612 bfs 广搜 距离和的最小值
- NYOJ 会场安排问题
- 二月的最后一天-吃完火锅回来
- 我的几篇博客(补充简历专用)
- win10系统取消打开应用提示
- Activity/View/Window/Layout 之间的关系分析
- Java 运算符之 & | ~ ^