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


0 0
原创粉丝点击