用ARM进行汇编语言编程(2)算数指令,CPSR寄存器与逻辑运算
ARM 编程模拟器
ARM 编程模拟器网站地址:
https://cpulator.01xz.net/?sys=arm-de1soc
算数指令
add:加
sub:减
mul:乘
现在我们来写一个简单的小程序
.global _start
_start:
mov r0,#3 //r0 = 3
mov r1,#7 //r1 = 7
add r2,r0,r1 //r2 = r0 + r1
运行程序,进入汇编页面
可以看到,寄存器里的值都是我们输入的值,0a是十六进制,十进制为10
减法和加法一样
.global _start
_start:
mov r0,#11 //r0 = 11
mov r1,#1 //r1 = 1
sub r2,r0,r1 //r2 = r0 - r1
运行程序,进入汇编页面
乘法也是类似的
.global _start
_start:
mov r0,#5 //r0 = 5
mov r1,#5 //r1 = 5
mul r2,r0,r1 //r2 = r0 * r1
运行程序,进入汇编页面
在我们运算的时候,总会遇到负数,我们看看在arm里是怎么样的
.global _start
_start:
mov r0,#1 //r0 = 1
mov r1,#6 //r1 = 6
sub r2,r0,r1 //r2 = r0 - r1
运行程序,进入汇编页面
r2寄存器里的值为一个很大的数,fffffffb,将十六进制转换为十进制时可以发现为-5
CPSR寄存器
解决负数的方法就是使用的cpsr寄存器
在这里有一些字母,NZCVI SVC,这些字母都是cpsr寄存器里的特定标志
N:负数或小于
Z:零
C:进位或借位扩展
V:溢出
在这里,N代表负数,我们还可以用一些特别的指令来操作cpsr寄存器
.global _start
_start:
mov r0,#1
mov r1,#6
subs r2,r0,r1 //当你不知道结果是否为负数时,可以在后面加S,这样就可以减少程序的报错
运行程序,进入汇编页面
当我们相加的结果超过了寄存器能存放的大小该怎么办,这时候还是要用CPSR寄存器里的特定标志
.global _start
_start:
mov r0,#0xFFFFFFFF //-1
mov r1,#1
adds r2,r0,r1 //因为相加后的结果超过了32位,就导致溢出了,设置s,之后cpsr寄存器就会进位
逻辑运算
逻辑运算包括and,or,xor
在汇编里的表示如下:
and = and
or = orr
xor = eor
and:
.global _start
_start:
mov r0,#0xff
mov r1,#22
and r2,r0,r1
or则相反:
.global _start
_start:
mov r0,#0xff
mov r1,#22
orr r2,r0,r1
xor:
.global _start
_start:
mov r0,#2
mov r1,#3
eor r2,r0,r1 //将r0与r1里的值进行异或运算,输出结果到r2寄存器里
还有一个特殊的指令是mvn,作用是对正数+1求反
.global _start
_start:
mov r0,#2
mvn r0,r0
r0变成了fffffffd,转换成十进制就是-3,and指令还有一个用
.global _start
_start:
mov r0,#0xff
mvn r0,r0
ands r0,r0,#0x000000ff
在执行了mov指令后,r0寄存器里的值为0xff
执行了mvn指令后,r0寄存器里的值为0xffffff00
进行了and指令后,r0寄存器为0
总结
这是我学习的笔记,有什么错误和不懂的地方欢迎来私信我,或者加我qq