基础汇编语言编程

article/2025/10/11 17:32:35

目录

什么是汇编语言?

工程搭建

新建工程

环境设置

 测试是否成功

 正式学习汇编语言

数据处理指令

填充,加,减,乘

 思考:我们可以看到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
ENTERMOV R1,#1END

 正式学习汇编语言

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

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

	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+R0SUB R3,R1,R0	;R3=R1-R0MUL R4,R1,R0	;R4=R1*R0END

 

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

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

 思考:我们可以看到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<<R1LSL R3,R2,R1 ;R3=R2>>R1END

思考: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-R1END

 思考:为什么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-R1END

 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-R1END

 

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

 存储位数过多数据存储原理(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位放R1MOV R2,#0x00000001	;NUM1高32位放R2MOV R3,#0x00000002	;NUM2低32位放R3MOV R4,#0x00000005	;NUM2高32位放R4ADDS 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位放R1MOV R2,#0x00000001	;NUM1高32位放R2MOV R3,#0x00000002	;NUM2低32位放R3MOV R4,#0x00000005	;NUM2高32位放R4ADDS R5,R1,R3	;R5=R1+R3	存放低位ADC R6,R2,R4	;R6=R2+R4+'C'	存放高位END

 对内存的读写(STR,LDR)

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

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

	AREA RESET,CODE,READONLY 
ENTERLDR R1,=0x12345678END

 但是R5此时却变为了0x07800000

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

对内存读写基础操作

	AREA RESET,CODE,READONLY 
ENTERMOV R0,#0x40000000 ;设置R0值为0x40000000MOV R1,#0xFFSTR R1,[R0]		;将R1值存放到地址0x40000000LDR R2,[R0]		;将地址0x40000000的值取出放到R2END

前索引

	AREA RESET,CODE,READONLY 
ENTERMOV R0,#0x40000000 ;设置R0值为0x40000000MOV R1,#0xFF	   ;设置R1值为0xFFSTR R1,[R0,#4]	   ;将R1值存放到地址0x40000004END

 

后索引

	AREA RESET,CODE,READONLY 
ENTERMOV R0,#0x40000000 ;设置R0值为0x40000000MOV R1,#0xFF	   ;设置R1值为0xFFSTR R1,[R0],#4	   ;将R1值存放到地址0x40000000;RO地址变为Ox40000004END

自动索引(前后索引)

	AREA RESET,CODE,READONLY 
ENTERMOV R0,#0x40000000 ;设置R0值为0x40000000MOV R1,#0xFF	   ;设置R1值为0xFFSTR R1,[R0,#4]!	   ;将R1值存放到地址0x40000004;RO地址变为Ox40000004END

 批量寄存器操作

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

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

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

 


http://chatgpt.dhexx.cn/article/DPk2Ryww.shtml

相关文章

汇编入门学习

学自狂神&#xff1a;最通俗易懂的计算机底层教学&#xff0c;二进制到汇编学习&#xff01; 1、概述 学习路线&#xff1a; 语言 进制 进制如何运算 二进制 数据宽度 有符号数和无符号数 原码反码补码 位运算 位运算计算 汇编 寄存器 内存 汇编指令 内存复制 …

【学习笔记】汇编语言入门

汇编语言入门 概述 指令格式&#xff08;最多包含4个区段&#xff09;&#xff1a;各区段之间用规定的分隔符分开 [标号&#xff1a;] 操作码 [操作数] [;注释]标号区段&#xff08;当前指令行的符号地址&#xff09;操作码区段&#xff08;指令的操作行为&#xff0c;由操作…

关于汇编语言入门的几个案例

哈喽&#xff0c;大家好呀~这篇呢我们来看看汇编语言的几个入门小案例。 &#x1f947;个人主页&#xff1a;个人主页 &#x1f948;系列专栏&#xff1a;日常解决的问题 &#x1f949;与这篇汇编相关的文章&#xff1a; …

什么是汇编语言

汇编语言&#xff08;assembly language&#xff09;是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言&#xff0c;亦称为符号语言。在汇编语言中&#xff0c;用助记符&#xff08;Mnemonics&#xff09;代替机器指令的操作码&#xff0c;用地址符号&#…

汇编语言系列教程之基础入门 (一)

汇编语言系列教程之基础入门 &#xff08;一&#xff09; http://www.cnblogs.com/flyor/p/7208948.html 机器字长 机器字长是指CPU一次运算所能处理的数据的位数&#xff0c;一般来说这个数的和CPU的通用寄存器长度、数据总线的宽度等相等&#xff0c;在8086中为16bit。由于历…

快速入门汇编语言

这篇是我在先后学习了《汇编原理》、《CSAPP》第三章和《x86 data sheet》&#xff0c;以及经历了大量google后写出的总结性文档&#xff0c;用于自查和复习。若能有所助益&#xff0c;不胜荣幸。如有错漏&#xff0c;烦请不吝赐教。 1. 从C到汇编 在初学C语言时&#xff0c;…

汇编语言(一)

一、编程语言 1&#xff09;机器语言 机器语言是机器指令的集合。在计算机中是一串0、1二进制数&#xff0c;计算机转变为高低电平&#xff0c;器件受到震动&#xff0c;进行运算。由于硬件设计和内部结构的不同&#xff0c;需要不同的电平脉冲来控制使它工作&#xff0c;所以…

汇编语言程序设计入门

前言&#xff1a;公号 「编程有料」后台回复 “大礼包” 即可获取近1000本助力你编程之路的电子书 汇编语言程序设计 一&#xff0c;汇编语言程序设计概述1&#xff0c;程序设计语言2&#xff0c;汇编语言源程序3&#xff0c;汇编语言程序开发过程 二&#xff0c;汇编语言基本语…

手把手教你学习汇编语言——从入门到起飞

专接本交流群&#xff1a;1051749714 &#xff08;有什么问题欢迎进群讨论&#xff09; 关于这篇博客&#xff0c;笔者会尽量用最简单的方式教会大家汇编语言以便应付各种考试 有什么不足的忘大佬评论或私信指出。 汇编环境安装 汇编运行调试 汇编指令 希望大家看完这些找一些…

小白的入门之——汇编语言程序设计教程

目录 第一章 基础知识 1.1汇编语言的特点 1.2计算机中数据表示的特点 【BCD码表示法&#xff08;Binary Coded Decimal&#xff09;】 【定点数】 —原码表示法— —反码表示法— —补码表示法— 浮点数 1.3 ​​​​​​计算机的数据存储 寄存器 存储器 数据在主…

汇编入门基础

1.什么是汇编语言&#xff1f; 汇编语言就是低级语言&#xff0c;直接描述/控制 CPU 的运行&#xff0c;我们知道&#xff0c;CPU 只负责计算&#xff0c;本身不具备智能。你输入一条指令&#xff08;instruction&#xff09;&#xff0c;它就运行一次&#xff0c;然后停下来&…

汇编语言入门教程

一、汇编语言是什么 ​ 汇编语言是二进制指令&#xff08;操作码&#xff09;的文本形式&#xff0c;与指令是一一对应的关系。比如加法指令00000011写成汇编语言就是ADD 二、前置知识——寄存器 ​ 1、寄存器不依靠地址区分&#xff0c;而依靠名称&#xff0c;CPU通过名字去…

南邮《汇编语言程序设计》期末复习 CH3: 汇编语言指令集

本文转载自厉害的 孔姐姐 的 博客 。 由一只孔姐姐的小迷弟负责排版和整理~ 一、基本概念 1.指令&#xff1a;单个的 CPU 操作&#xff0c;通知 CPU 执行某种操作的 “命令” 指令集&#xff1a;所有指令的集合 机器指令&#xff1a;用二进制序列&#xff08;0、1&#xff09…

汇编语言程序格式

1 逻辑段 汇编语言源程序由一个或多个逻辑段组成。 ❖ 一个程序中可以有几个同一类型的逻辑段。 ❖ 必须至少有一个代码段。 &#xff3b;注&#xff3d;源程序分段的目的在于程序结构清晰、便 于内存分配&#xff0c;寻址方便&#xff0c;一个源程序需要设置 几个段应根据具体…

汇编常用指令

通用寄存器及使用 IA-32系列有8个32位通用寄存器&#xff0c;名称分别为&#xff1a;EAX,EBX,ECX,EDX,ESP,EBP,ESI,EDI&#xff0c;如图&#xff1a; 简单传送指令 指令中文名格式解释备注MOV传送指令MOV DEST,SRCDEST<SRCXCHG交换指令XCHG OPER1,OPER2把操作数oper1的内容…

第一章 汇编语言和汇编指令

【用最少的指令来实现功能】 自用 文章基于《计算机体系结构新讲》&#xff08;中国地质大学出版社&#xff09; 目录 一、汇编指令 &#xff08;1&#xff09;MIPS汇编指令示例解析 &#xff08;2&#xff09;MIPS指令集 二、汇编指令中的操作数 &#xff08;1&#xff0…

pic单片机汇编 c语言,PIC单片机汇编语言指令详解

PIC单片机汇编语言指令详解 pic单片机为最常用单片机之一&#xff0c;许多程序均基于pic单片机进行开发。因此&#xff0c;熟练pic单片机编程尤为重要。为保证大家能准确、熟练掌握pic单片机的使用&#xff0c;本文特带来pic单片机的各种汇编语言指令的讲解。 一、pic的指令系统…

汇编:汇编指令分类

文章目录 一、指令分类二、伪指令1、assume2、segment、ends3、end 三、汇编指令1、退出程序指令2、中断2.1、概念2.2、中断的分类2.3、本质2.4、中断指令 3、call、ret 四、指令处理的数据长度 使用汇编语言编写一个完整的程序&#xff0c;步骤大致如下&#xff1a; 1、编写源…

汇编语言指令及七种寻址方式指令实现

指令讲解 进入debug模式后&#xff1a;&#xff08;进入debug模式之前的讲解 可以参考我的另一篇博文&#xff1a;masm5.0运行 -u::显示机器指令和汇编指令 -d:显示的具体数据 内存单元内容查看 -r:查看寄存器内容 -r&#xff1a;修改寄存器的内容 如修改ax寄存器的值为12…

微机原理之汇编语言指令集

汇编语言指令集 1.1 概述1.1.1 指令集体系结构、机器指令和符号指令1.1.2 符号指令的书写格式 1.2 操作数1.2.1 通用寄存器中的操作数1.2.2 段寄存器和指令指针寄存器1.2.3 标志寄存器 1.3 寻址方式1.3.1 立即寻址1.3.2 寄存器寻址1.3.3存储器操作数寻址1.3.3.1 直接寻址1.3.3.…