• 用ARM进行汇编语言编程(2)算数指令,CPSR寄存器与逻辑运算


    ARM 编程模拟器

    ARM 编程模拟器网站地址:

    https://cpulator.01xz.net/?sys=arm-de1soc
    
    • 1

    算数指令

    add:加
    sub:减
    mul:乘
    
    • 1
    • 2
    • 3

    现在我们来写一个简单的小程序

    在这里插入图片描述

    .global _start
    _start:
    	mov r0,#3  //r0 = 3
    	mov r1,#7  //r1 = 7
    	add r2,r0,r1    //r2 = r0 + r1 
    
    • 1
    • 2
    • 3
    • 4
    • 5

    运行程序,进入汇编页面

    在这里插入图片描述

    可以看到,寄存器里的值都是我们输入的值,0a是十六进制,十进制为10
    减法和加法一样

    在这里插入图片描述

    .global _start
    _start:
    	mov r0,#11  //r0 = 11
    	mov r1,#1  //r1 = 1
    	sub r2,r0,r1    //r2 = r0 - r1 
    
    • 1
    • 2
    • 3
    • 4
    • 5

    运行程序,进入汇编页面

    在这里插入图片描述

    乘法也是类似的

    .global _start
    _start:
    	mov r0,#5  //r0 = 5
    	mov r1,#5  //r1 = 5
    	mul r2,r0,r1    //r2 = r0 * r1 
    
    • 1
    • 2
    • 3
    • 4
    • 5

    运行程序,进入汇编页面

    在这里插入图片描述

    在我们运算的时候,总会遇到负数,我们看看在arm里是怎么样的

    .global _start
    _start:
    	mov r0,#1  //r0 = 1
    	mov r1,#6  //r1 = 6
    	sub r2,r0,r1    //r2 = r0 - r1 
    
    • 1
    • 2
    • 3
    • 4
    • 5

    运行程序,进入汇编页面

    在这里插入图片描述

    r2寄存器里的值为一个很大的数,fffffffb,将十六进制转换为十进制时可以发现为-5

    在这里插入图片描述

    CPSR寄存器

    解决负数的方法就是使用的cpsr寄存器

    在这里插入图片描述

    在这里有一些字母,NZCVI SVC,这些字母都是cpsr寄存器里的特定标志

    N:负数或小于
    Z:零
    C:进位或借位扩展
    V:溢出
    
    • 1
    • 2
    • 3
    • 4

    在这里,N代表负数,我们还可以用一些特别的指令来操作cpsr寄存器

    .global _start
    _start:
    	mov r0,#1
    	mov r1,#6
    	subs r2,r0,r1  //当你不知道结果是否为负数时,可以在后面加S,这样就可以减少程序的报错
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    运行程序,进入汇编页面

    在这里插入图片描述

    当我们相加的结果超过了寄存器能存放的大小该怎么办,这时候还是要用CPSR寄存器里的特定标志

    .global _start
    _start:
    	mov r0,#0xFFFFFFFF   //-1
    	mov r1,#1
    	adds r2,r0,r1  //因为相加后的结果超过了32位,就导致溢出了,设置s,之后cpsr寄存器就会进位
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    逻辑运算

    逻辑运算包括and,or,xor
    在汇编里的表示如下:

    and = and
    or = orr
    xor = eor
    
    • 1
    • 2
    • 3

    and:

    .global _start
    _start:
    	mov r0,#0xff
    	mov r1,#22
    	and r2,r0,r1
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    or则相反:

    .global _start
    _start:
    	mov r0,#0xff
    	mov r1,#22
    	orr r2,r0,r1
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    xor:

    .global _start
    _start:
    	mov r0,#2
    	mov r1,#3
    	eor r2,r0,r1   //将r0与r1里的值进行异或运算,输出结果到r2寄存器里
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    还有一个特殊的指令是mvn,作用是对正数+1求反

    .global _start
    _start:
    	mov r0,#2
    	mvn r0,r0
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    r0变成了fffffffd,转换成十进制就是-3,and指令还有一个用

    .global _start
    _start:
    	mov r0,#0xff
    	mvn r0,r0
    	ands r0,r0,#0x000000ff
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在执行了mov指令后,r0寄存器里的值为0xff

    在这里插入图片描述

    执行了mvn指令后,r0寄存器里的值为0xffffff00

    在这里插入图片描述

    进行了and指令后,r0寄存器为0

    在这里插入图片描述

    总结

    这是我学习的笔记,有什么错误和不懂的地方欢迎来私信我,或者加我qq

  • 相关阅读:
    1.初识MySQL
    Linux离线安装elasticsearch|header|kibna插件最详细
    Linux chage 命令用法
    Java 微服务管理工具V2.0来了
    【AI设计模式】02-数据表示-嵌入(Embeddings)模式
    Hololens开发之实时音视频通讯--02初始化项目+添加必要碰撞组件
    2022-01-28-JQuery
    抄写Linux源码(Day12:从 MBR 到 C main 函数 (1) )
    2023年优化算法之之霸王龙优化算法(TROA),原理公式详解,附matlab代码
    软件测试永远的家——银行测试,YYDS
  • 原文地址:https://blog.csdn.net/qq_45894840/article/details/126646693