基础汇编语言编程

这篇具有很好参考价值的文章主要介绍了基础汇编语言编程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

什么是汇编语言?

工程搭建

新建工程

环境设置

 测试是否成功

 正式学习汇编语言

数据处理指令

填充,加,减,乘

 思考:我们可以看到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

基础汇编语言编程

 文章来源地址https://www.toymoban.com/news/detail-478342.html

	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

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

基础汇编语言编程

 

到了这里,关于基础汇编语言编程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 汇编语言程序设计——基础知识(完整)

    CPU是计算机的核心部件,一个基础的CPU由运算器、控制器、寄存器等器件相连,这些器件靠内部总线相连, CPU通过内部总线与内部各个器件进行联系,例如读取内存中的程序;CPU通过外部总线实现与主板上的其他器件的联系,例如我们使用的蓝桥杯单片机开发板上就存在着矩

    2024年02月19日
    浏览(43)
  • 《零基础7天入门Arduino物联网-06》程序基础-编程语言是什么

    配套视频课程:《零基础学Arduino物联网,入门到进阶》 配套课件资料获取:微联实验室 配套学习套件购买:淘宝搜索店铺【微联实验室】 程序是什么 程序设计可以理解为是用计算机语言创造出一系列指令的过程,这些指令可以让计算机按照我们预先设定的规则和流程,完

    2024年02月12日
    浏览(35)
  • 嵌入式:ARM汇编语言程序设计基础教程

    ① 合理地分配存储器资源,将前述的目标系统‘数据结构模型’表示到各存储器单元。 ② CPU寄存器数量有限,在程序中,大多数操作都要使用寄存器;并且有的操作使用特定的寄存器(如堆栈操作使用SP/R13等),程序中要合理分配各寄存器的用途。 用计算机语言,对数据结

    2023年04月23日
    浏览(84)
  • 汇编语言(第3版)- 学习笔记 - 第1章-基础知识

    机器只认识 01 ,不同的机器对同一串 01 的理解还不一样。 (比如喇叭和显示器,具体怎么理解本质上是生产它的人为它定义的一套规则) 01 适合机器识别,但不适合人类阅读。 01 这种机器语言人类用着不方便,但又要与机器沟通。 所以人类发明了一套与 01 对应的 汇编语言

    2024年02月01日
    浏览(63)
  • 想学计算机编程从什么学起?零基础如何自学计算机编程?中文编程开发语言工具箱之渐变标签组构件

    想学计算机编程从什么学起?零基础如何自学计算机编程? 给大家分享一款中文编程工具,零基础轻松学编程,不需英语基础,编程工具可下载。 这款工具不但可以连接部分硬件,而且可以开发大型的软件,向如图这个实例就是用这个工具开发的。 它的编程工具箱非常的丰

    2024年02月05日
    浏览(68)
  • 汇编语言—常见汇编指令汇总

    mov    寄存器 ,数据                如:mov ax ,8 mov   寄存器,寄存器              如:mov ax,bx mov   寄存器,内存单元          如:mov ax,[0] mov   内存单元,寄存器          如:mov [0],ax mov   段寄存器,寄存器          如:mov ds,ax add   寄存器,数据

    2024年02月10日
    浏览(40)
  • 5.8 汇编语言:汇编高效除法运算

    通常情况下计算除法会使用 div/idiv 这两条指令,该指令分别用于计算无符号和有符号除法运算,但除法运算所需要耗费的时间非常多,大概需要比乘法运算多消耗10倍的CPU时钟,在Debug模式下,除法运算不会被优化,但Release模式下,除法运算指令会被特定的算法经过优化后转

    2024年02月11日
    浏览(41)
  • 5.6 汇编语言:汇编高效数组寻址

    数组和指针都是用来处理内存地址的操作,二者在C语言中可以互换使用。数组是相同数据类型的一组集合,这些数据在内存中是连续存储的,在C语言中可以定义一维、二维、甚至多维数组。多维数组在内存中也是连续存储的,只是数据的组织方式不同。在汇编语言中,实现

    2024年02月11日
    浏览(43)
  • 5.7 汇编语言:汇编高效乘法运算

    乘法指令是一种在CPU中实现的基本算术操作,用于计算两个数的乘积。在汇编语言中,乘法指令通常是通过 mul(无符号乘法) 和 imul(有符号乘法) 这两个指令实现的。由于乘法指令在执行时所消耗的时钟周期较多,所以编译器在优化代码时通常会尝试将乘法操作转换为更

    2024年02月11日
    浏览(36)
  • 什么是硬件编程,C 语言如何进行硬件编程?C 语言常用的操作系统有哪些?

    硬件编程是指使用编程语言与硬件交互,控制硬件设备的行为和功能。其中,C语言是一种广泛用于硬件编程的高级编程语言。 C语言通过直接操作内存来进行硬件编程。它提供了一些特殊的和库函数,使得开发者可以直接访问和操作硬件设备的寄存器、端口和外设等。

    2024年02月15日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包