当前位置: 首页 > news >正文

用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

相关文章:

  • 计算机毕业设计ssm趣评美食管理评论系统lrt3w系统+程序+源码+lw+远程部署
  • 《JavaScript从入门到精通》|变量作用域|垃圾回收|闭包【函数进阶篇】
  • 工程项目管理概述
  • 【Q-Learning】TD算法的一种
  • 【QT】Qt调用OCX控件详解
  • 设立“丰收杯”建设吨粮田 国稻种芯-株洲:破解种粮世界性难题
  • Linux内核设计与实现 第一章 Linux内核简介
  • dubbo java api
  • switch选择结构
  • Vue基础(九)——ElementUI
  • Linux(一)最简单的LED驱动程序(应用层和驱动层分析)
  • 猿创征文 | [云原生]为微服务保驾护航之链路跟踪skywalking保姆级搭建教程
  • 雅思口语高分课程
  • java面向对象面试题的考点整理
  • Mac 下 brew 切换为国内源,安装 sshfs
  • [PHP内核探索]PHP中的哈希表
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • (三)从jvm层面了解线程的启动和停止
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 【剑指offer】让抽象问题具体化
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • JavaScript中的对象个人分享
  • jQuery(一)
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • React-flux杂记
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • vue的全局变量和全局拦截请求器
  • Spring Batch JSON 支持
  • ​Linux·i2c驱动架构​
  • !!java web学习笔记(一到五)
  • # Maven错误Error executing Maven
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (多级缓存)多级缓存
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .NET MVC 验证码
  • .NET 设计模式—简单工厂(Simple Factory Pattern)
  • .net快速开发框架源码分享
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析
  • @reference注解_Dubbo配置参考手册之dubbo:reference
  • @RequestParam,@RequestBody和@PathVariable 区别
  • [ IO.File ] FileSystemWatcher
  • [1] 平面(Plane)图形的生成算法