基础汇编语言编程

news2024/12/30 3:32:36

目录

什么是汇编语言?

工程搭建

新建工程

环境设置

 测试是否成功

 正式学习汇编语言

数据处理指令

填充,加,减,乘

 思考:我们可以看到R0寄存器可以存放8位十六进制数,那么0x12345678能不能用mov存入?

与,或,异或,左移,右移

思考:UART通信过程中为什么数据位规定8-9位?

思考:如果规定12或者更多可以吗?有什么影响?

CPSR寄存器的(NZCV位)

 N位(负标记位)检测

 思考:为什么N位为什么没有置为1?

 Z位(0标记位)和C(进位和借位标记)

 存储位数过多数据存储原理(ADC)

 对内存的读写(STR,LDR)

回到最初的问题:如何赋值0x12345678?

对内存读写基础操作

前索引

后索引

自动索引(前后索引)

 批量寄存器操作


注:本文章记录自己现阶段学到的基础汇编语言编程

什么是汇编语言?

汇编语言是一种低级程序设计语言,用于编写计算机程序。它是与特定计算机体系结构相关的,通过使用符号代表机器指令数据,以便于人们理解和编写程序。

由于汇编语言是与特定体系结构相关的,所以每种计算机体系结构都有自己的汇编语言。常见的汇编语言包括x86(用于大多数个人电脑)、ARM(用于移动设备和嵌入式系统)等。本文主要记录基础ARM汇编语言。

编写汇编语言程序需要对计算机体系结构和指令集有深入的了解,并且编写的程序可以直接在相应的计算机上运行。汇编语言程序通常用于对性能要求非常高或需要直接访问硬件的应用,如操作系统、驱动程序、嵌入式系统等。

工程搭建

新建工程

 

环境设置

 

 测试是否成功

输入下方汇编代码测试

	AREA RESET,CODE,READONLY
ENTER
	MOV R1,#1
 END

 正式学习汇编语言

数据处理指令对数据进行逻辑、算数运算

在汇编语言中;是注释的意思

	AREA RESET,CODE,READONLY 
	;AREA	指定代码属性
	;RESET	代码片段名称
	;CODE	存放代码
	;READONLY	只读
ENTER	;顶头写的我们称为标号 ENTER是程序入口
	MOV R1,#1	;前面有空格的我们称为指令
 END    ;END是结尾

数据处理指令

填充,加,减,乘

	AREA RESET,CODE,READONLY 
ENTER	
	MOV R0,#1	;将1值填充到R0寄存器
	MOV R1,#2	;将2值填充到R1寄存器
	ADD R2,R1,R0	;R2寄存器值=R1+R0
	SUB R3,R1,R0	;R3=R1-R0
	MUL R4,R1,R0	;R4=R1*R0
 END

 

 上面演示了基础操作,主要说下第二个界面

 我们看看上面指令最终结果,对应寄存器存储了对应的运算结果

 思考:我们可以看到R0寄存器可以存放8位十六进制数,那么0x12345678能不能用mov存入?

	AREA RESET,CODE,READONLY 
ENTER	
	MOV R0,#0x12345678	;将0x12345678值填充到R0寄存器
 END

 程序报错了

ARM.S(3): error: A1510E: Immediate 0x12345678 cannot be represented by 0-255 and a rotation

 ARM.S(3): error: A1510E: Immediate 0x12345678不能用0-255

这里引入了立即数概念

立即数(Immediate value)是在汇编语言中表示常数或立即数据的一种方式。它是直接包含在指令中的固定数值,而不是通过寄存器或内存引用获取。

通过测试我们得到当前操作立即数范围是0-255,255后面都是离散的。

那么如何赋值0x12345678?后面会讲解。

与,或,异或,左移,右移

	AREA RESET,CODE,READONLY 
ENTER	
	MOV R1,#1	;将1值填充到R0寄存器
	AND R2,R1,#0 ;R2=R1&0	与
	ORR R3,R2,#1 ;R3=R2|1	或
	EOR R3,R1,#1 ;R3=R1^1	异或
	LSR R3,R2,R1 ;R3=R2<<R1
	LSL R3,R2,R1 ;R3=R2>>R1
 END

思考:UART通信过程中为什么数据位规定8-9位?

  • 8位可以表示256个不同的数值,足够用于表示大部分常见的字符、数字和符号
  • UART通信的具体配置(包括数据位、停止位、波特率等)应该根据通信双方的协商和需求进行设置,以确保正确的数据传输和解析,8位常用。

思考:如果规定12或者更多可以吗?有什么影响?

12位是可行的,但会存在一些影响和限制

  • 兼容性问题:UART通信是由双方协商决定的,两个设备必须都支持12位才行
  • 增加传输开销:增加数据位数量会导致数据字节传输开销增加
  • 设备复杂性增加:位数越多,硬件设计和软件设计实现复杂
  • 干扰和误差率增加:较长的数据位序列更容易受到噪声和干扰的影响

CPSR寄存器的(NZCV位)

 N位(负标记位)检测

	AREA RESET,CODE,READONLY 
ENTER
	;N位负标记位
	MOV R0,#1	;将1值填充到R0寄存器
	MOV R1,#2	;将2值填充到R1寄存器
	SUB R2,R0,R1	;R2=R0-R1
 END

 思考:为什么N位为什么没有置为1?

默认情况下数据运算不会对条件位(NZCV)产生影响,我们可以在指令后添加后缀 'S'
	AREA RESET,CODE,READONLY 
ENTER
	;N位负标记位
	MOV R0,#1	;将1值填充到R0寄存器
	MOV R1,#2	;将2值填充到R1寄存器
	SUBS R2,R0,R1	;R2=R0-R1
 END

 Z位(0标记位)和C(进位和借位标记)

	AREA RESET,CODE,READONLY 
ENTER
	;N位负标记位
	MOV R0,#1	;将1值填充到R0寄存器
	MOV R1,#1	;将2值填充到R1寄存器
	SUBS R2,R0,R1	;R2=R0-R1
 END

 

	AREA RESET,CODE,READONLY 
ENTER
	;N位负标记位
	MOV R0,#0xFFFFFFFF	;将0xFFFFFFFF值填充到R0寄存器
	MOV R1,#3	;将3值填充到R1寄存器
	ADDS R2,R0,R1	;R2=R0+R1
 END

 存储位数过多数据存储原理(ADC)

假设有两个数据,怎么进行存储? 

第一个数        0x00000001 FFFFFFFF

第二个数        0x00000005 00000002

我们可以:
第一个数的低32位放到R1,高32bit放R2

第二个数的低32位放R3,高32bit放R4

低加低高加高 运算结构的低32bit放R5,高32bit放R6

	AREA RESET,CODE,READONLY 
ENTER
	;N位负标记位
	MOV R1,#0xFFFFFFFF	;NUM1低32位放R1
	MOV R2,#0x00000001	;NUM1高32位放R2
	MOV R3,#0x00000002	;NUM2低32位放R3
	MOV R4,#0x00000005	;NUM2高32位放R4
	ADDS R5,R1,R3	;R5=R1+R3	存放低位
	ADDS R6,R2,R4	;R6=R2+R4	存放高位
 END

 上面的代码能达到我们想要的效果吗?

 正确操作是添加C特殊的标志位,使用ADC进行运算

	AREA RESET,CODE,READONLY 
ENTER
	;N位负标记位
	MOV R1,#0xFFFFFFFF	;NUM1低32位放R1
	MOV R2,#0x00000001	;NUM1高32位放R2
	MOV R3,#0x00000002	;NUM2低32位放R3
	MOV R4,#0x00000005	;NUM2高32位放R4
	ADDS R5,R1,R3	;R5=R1+R3	存放低位
	ADC R6,R2,R4	;R6=R2+R4+'C'	存放高位
 END

 对内存的读写(STR,LDR)

回到最初的问题:如何赋值0x12345678?

使用LDR命令就能完成赋值操作

	AREA RESET,CODE,READONLY 
ENTER
	LDR R1,=0x12345678
 END

 但是R5此时却变为了0x07800000

R5 变为了 0x07800000,而不是 R1。这可能是因为汇编器在分配常量池地址时,将立即数 0x12345678 分配到了常量池的偏移量为 0x07800000 的位置,并将该地址加载到了 R5 寄存器中。

对内存读写基础操作

	AREA RESET,CODE,READONLY 
ENTER
	MOV R0,#0x40000000 ;设置R0值为0x40000000
	MOV R1,#0xFF
	STR R1,[R0]		;将R1值存放到地址0x40000000
	LDR R2,[R0]		;将地址0x40000000的值取出放到R2
 END

前索引

	AREA RESET,CODE,READONLY 
ENTER
	MOV R0,#0x40000000 ;设置R0值为0x40000000
	MOV R1,#0xFF	   ;设置R1值为0xFF
	STR R1,[R0,#4]	   ;将R1值存放到地址0x40000004
 END

 

后索引

	AREA RESET,CODE,READONLY 
ENTER
	MOV R0,#0x40000000 ;设置R0值为0x40000000
	MOV R1,#0xFF	   ;设置R1值为0xFF
	STR R1,[R0],#4	   
	;将R1值存放到地址0x40000000
	;RO地址变为Ox40000004
 END

自动索引(前后索引)

	AREA RESET,CODE,READONLY 
ENTER
	MOV R0,#0x40000000 ;设置R0值为0x40000000
	MOV R1,#0xFF	   ;设置R1值为0xFF
	STR R1,[R0,#4]!	   
	;将R1值存放到地址0x40000004
	;RO地址变为Ox40000004
 END

 批量寄存器操作

	AREA RESET,CODE,READONLY 
ENTER
	MOV R0,#0x40000000
	MOV R1,#1
	MOV R2,#2
	MOV R3,#3
	MOV R4,#4
	MOV R5,#5
	STM R0,{R1-R5}
	LDM R0,{R6-R10}
 END

	AREA RESET,CODE,READONLY 
ENTER
	;空增
	MOV R0,#0x40000000
	MOV R1,#1
	MOV R2,#2
	MOV R3,#3
	MOV R4,#4
	MOV R5,#5
	STMIA R0!,{R1-R5}
	;满增
	MOV R0,#0x40000000
	MOV R1,#1
	MOV R2,#2
	MOV R3,#3
	MOV R4,#4
	MOV R5,#5
	STMIB R0!,{R1-R5}
	
	;空减
	MOV R0,#0x4000000C
	MOV R1,#1
	MOV R2,#2
	MOV R3,#3
	MOV R4,#4
	MOV R5,#5
	STMDA R0!,{R1-R5}
	;满减
	MOV R0,#0x4000000C
	MOV R1,#1
	MOV R2,#2
	MOV R3,#3
	MOV R4,#4
	MOV R5,#5
	STMDB R0!,{R1-R5}
 END

 上述四段代码分开测试能得到结果

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/630463.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java SSM 摄影作品网站myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM 摄影作品网站系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代 码和数据库&#xff0c;系统主要采…

会用Python做副业的人,有多豪横!

前两天一个朋友找到我吐槽&#xff0c;说工资一发交完房租水电&#xff0c;啥也不剩&#xff0c;搞不懂朋友圈里那些天天吃喝玩乐的同龄人钱都是哪来的&#xff1f; 确实如此&#xff0c;刚毕业的大学生工资起薪都很低&#xff0c;在高消费、高租金的城市&#xff0c;别说存钱…

浏览器跨域请求

跨域是浏览器的一种同源策略&#xff0c;所以该概念只存在于通过浏览器访问服务里。 如果缺少了同源策略&#xff0c;则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的&#xff0c;浏览器只是针对同源策略的一种实现 请求的url地址,必须与浏览器上的…

Vue3 ElementPlus Dialog封装 (二:使用provide inject)

引言 上一章Vue3 ElementPlus Dialog封装 &#xff08;一&#xff1a;使用props emit&#xff09; propemit实现的方法用于父子组件比较方便, 跨多层次组件比较麻烦 vue3 中 还提供了provide和inject方法供组件间通信(参考官网图片), 本篇使用该方法实现上章效果 实现原理 参考…

K8S之Ingress 对外暴露应用(十四)

• Ingress为弥补NodePort不足而生 • Pod与Ingress的关系 • Ingress Controller • Ingress 规则配置 一&#xff0c;Ingress为弥补NodePort不足而生 NodePort存在的不足&#xff1a; • 一个端口只能一个服务使用&#xff0c;端口需提前规划 • 只支持4层负载均衡二&#x…

九耶丨阁瑞钛伦特-大型计算机硬件组成(二)

TSO&#xff1a; TSO是Time Sharing Option的缩写&#xff0c;用户可以通过TSO命令和系统进行交互式工作。TSO命令直接使用并不方便&#xff0c;所以IBM又在TSO下开发了程序产品ISPF/PDF&#xff08;Interactive System Productivity/Program Development Facility)其中ISPF支…

VAPS XT4.2 与 VS2013 安装

VAPS XT4.2 与 VS2013 安装 安装顺序 安装 VS2013安装 License tool安装 VAPS XT4.2VS2013 的安装 安装 VS2013,安装内容全选,安装路径选择D盘;VS2013 激活,网上找密钥,比如:【BWG7X-J98B3-W34RT-33B3R-JVYW9】;电脑重启;Win+R,sysdm.cpl,打开环境变量,查看VS相关的…

Linux SSH命令实战教程,提升你的服务器管理基本功!

前言 大家好&#xff0c;又见面了&#xff0c;我是沐风晓月&#xff0c;本文是专栏【linux基本功-基础命令实战】的第62篇文章。 专栏地址&#xff1a;[linux基本功-基础命令专栏] &#xff0c; 此专栏是沐风晓月对Linux常用命令的汇总&#xff0c;希望能够加深自己的印象&am…

java生成、识别条形码和二维码

一、概述 使用 zxing 开源库 Zxing主要是Google出品的&#xff0c;用于识别一维码和二维码的第三方库主要类:BitMatrix 位图矩阵MultiFormatWriter 位图编写器MatrixToImageWriter 写入图片 可以生成、识别条形码和二维码 内置三种尺寸&#xff1a;enum Size {SMALL, MIDDLE, …

【习题】习题 2 - 编写程序求当前机器的字节序

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快 &#xff01; 时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、缘起 2、字节序影响 3、示例代码 4、总结 1、缘起 在计算机中&#xff0c;字节序&#xff08;Byte Order&#xff09;指定了…

一文带你彻底掌握Java 中的Stream流(详细)

本文目录 学习目标中间操作Filter(过滤)Map(转换)Sorted(排序)Distinct(去重)Limit(限制)Skip(跳过)Peek(展示) 终止操作forEach(循环)Collect(收集)Count(计数)Reduce(聚合)AnyMatch(任意匹配)AllMatch(全部匹配)NoneMatch(无匹配) 使用Stream流的优缺点&#xff1a;优点&…

投票活动小程序开发搭建

由于小程序是基于微信开发者工具编写的&#xff0c;因此我先介绍一下需要使用的工具和技术&#xff1a; - 微信开发者工具&#xff1a;用于开发、调试和发布小程序。 - 小程序云开发&#xff1a;用于存储数据和进行后端逻辑处理。 - uni-app框架&#xff1a;uni-app 是一个使…

组件更新的底层逻辑

第一种更新&#xff1a;组件更新的逻辑&#xff0c;当修改了相关状态&#xff0c;组件会更新 1.触发shouldComponentUpdate 周期函数:是否允许更新 shouldComponentUpdate(nextProps, nextState) { // nextState: 存储要修改的最新状态 // this. state:存储的还是修改前的状态…

分布式系统常见的数据分区算法

文章目录 顺序分区轮询分区算法时间片轮转分区算法数据块分区算法业务主题分区算法 哈希分区节点取模分区算法一致性哈希分区算法&#xff08;重点&#xff09;1.Hash环2.容错性和可扩展性3.数据倾斜4.带有限负载的一致性哈希算法5.带虚拟节点的一致性哈希算法 虚拟槽分区算法&…

个人开发者或学生必备的100元云服务器大全

100元以内云服务器配置大全&#xff0c;预算100元可以买到什么配置的云服务器&#xff1f;100元可以选到腾讯云2核2G3M带宽轻量服务器、阿里云2核2G3M带宽轻量应用服务器、UCloud香港轻量应用云主机30M带宽、华为云HECS云服务器2核4G配置等&#xff0c;阿腾云分享预算100元可选…

华为OD机试真题 JavaScript 实现【数列描述】【2023 B卷 100分】,附详细解题思路

一、题目描述 有一个数列a[N] (N60)&#xff0c;从a[0]开始&#xff0c;每一项都是一个数字。数列中a[n1]都是a[n]的描述。其中a[0]1。 规则如下&#xff1a; a[0]:1 a[1]:11(含义&#xff1a;其前一项a[0]1是1个1&#xff0c;即“11”。表示a[0]从左到右&#xff0c;连续出…

GitOps的12个痛点

如今很多团队采用GitOps作为标准部署流程&#xff0c;这篇文章总结了GitOps的12个痛点&#xff0c;从而帮助我们在采用这一实践的过程中更好的理解GitOps的优势和缺陷&#xff0c;选择适合自己的解决方案。原文&#xff1a;The pains of GitOps 1.0[1] GitOps作为软件发布实践有…

Git与Gitee远程仓库的系列操作

⭐作者介绍&#xff1a;大二本科网络工程专业在读&#xff0c;持续学习Java&#xff0c;努力输出优质文章 ⭐作者主页&#xff1a;逐梦苍穹 ⭐所属专栏&#xff1a;Git ⭐如果觉得文章写的不错&#xff0c;欢迎点个关注一键三连&#x1f609;有写的不好的地方也欢迎指正&#x…

Prometheus插件安装(mysql_exporter)

简介 mysql_exporter是用来收集MysQL或者Mariadb数据库相关指标的&#xff0c;mysql_exporter需要连接到数据库并有相关权限。既可以用二进制安装部署&#xff0c;也可以通过容器形式部署&#xff0c;但为了数据收集的准确性&#xff0c;推荐二进制安装。 一&#xff0c;下载安…

ASO优化之如何维护品牌词

App Store的关键词优化一般可以分为品牌词&#xff0c;竞品词和行业词&#xff0c;长度要控制在100字符以内。所以我们可以通过投放竞品词&#xff0c;将竞争对手的部分的流量占为己有&#xff0c;维护品牌词的有效方式有&#xff1a;1&#xff0c;率先拿下自己家的品牌词。 2…