【微机原理实战笔记】浅入理解汇编源文件

记录在学习微机原理时候的知识点,以便温故而知新。
Rd:目的操作数的寄存器
Rn、Rm:代指源操作数的寄存器
#num:代指立即数
label:代指标号

浅入理解汇编源文件

  • 汇编源文件代码结构
    • 文件类型
      • 堆栈对齐与指示编译器
    • 输出、输入
      • EXPORT
      • IMPORT
      • 弱引用
    • 宏定义
      • MASM (Microsoft Macro Assembler) 宏定义
      • NASM (Netwide Assembler) 宏定义
    • 常量段、变量段与代码段
    • 文件结束
    • 小记

汇编源文件代码结构

文件类型

汇编语言中的文件类型通常与所使用的汇编器和目标平台有关。但一般来说,可以识别以下几种常见的文件类型:

源文件(.asm 或 .s):
这是包含汇编指令的文本文件,在嵌入式开发中用到的启动文件也是属于源文件一类,例如:startup_gd32f30x_hd.s。汇编程序员直接编辑这个文件,并使用汇编器将其转换为机器代码或目标代码。
列表文件(.lst):
当汇编器处理源文件时,它可能会生成一个列表文件,其中包含源代码的副本以及与之相关的注释和信息。这通常用于调试和文档目的。
目标文件(.obj 或 .o):
这是汇编器从源文件生成的二进制文件。它包含机器代码,但可能还包含一些元数据,如符号表,这些元数据在链接阶段会被用到。
可执行文件(.exe, .com, .bin 等):
这是链接器从目标文件和其他必要的库生成的最终文件。它是一个可以直接在特定平台上运行的二进制文件。
库文件(.lib 或 .a):
库文件包含一组预编译的代码(通常是函数或例程),这些代码可以在多个程序中重用。汇编器或链接器可以使用库文件来减少最终生成的可执行文件的大小。
.map文件(.map):
链接器可能会生成一个地图文件,它描述了可执行文件中的内存布局,包括各个段(如代码段、数据段等)的位置和大小,以及符号的地址。
错误和警告文件:
在编译和链接过程中,可能会生成包含错误和警告信息的文件。这些文件帮助程序员识别和修复源代码中的问题。

堆栈对齐与指示编译器

在汇编语言中,不同的堆栈对齐通常是通过使用特定的伪指令或编译器选项来控制的。我的代码使用的是通过伪指令来设置堆栈对齐。具体的写法会依赖于你使用的汇编器和目标平台。以下是一些常见的方法来控制堆栈对齐:

使用伪指令:
某些汇编器提供了伪指令来设置堆栈对齐。像 PRESERVE8 这样的伪指令,它告诉汇编器保持堆栈八字节对齐。不同的汇编器可能提供不同的伪指令来实现不同的对齐要求。
编译器选项:
如果你在使用高级语言(如C或C++)并通过编译器生成汇编代码,你可以通过编译器选项来控制堆栈对齐。例如,在GCC中,你可以使用 -mstackrealign 选项来启用堆栈重新对齐。
直接设置堆栈指针:
在汇编代码中,你可以直接操作堆栈指针(如 SP 或 RSP,取决于架构)来实现特定的对齐。这通常涉及到计算对齐所需的额外空间,并相应地调整堆栈指针。这种方法比较底层且复杂,需要深入理解目标平台的堆栈机制。
使用内存对齐属性:
对于局部变量或全局变量,你可以使用特定的属性或修饰符来指定其对齐方式。这不会直接影响堆栈指针本身,但会确保变量在内存中以特定方式对齐。
链接器脚本:
在某些情况下,你可以通过编写链接器脚本来控制堆栈的对齐。链接器脚本定义了如何组织和布局程序的内存段,包括堆栈段。

PRESERVE8  ;8字节对齐
THUMB      ;使用THUMB指令集

PRESERVE8 是一个汇编伪指令,用于指定当前文件保持堆栈8字节对齐,并设置相应的编译属性以通知链接器。在特定的汇编环境或工具中,PRESERVE8伪指令可能具有特定的语法和用法,用于控制堆栈对齐的属性。这种对齐要求对于某些硬件架构和编译器来说可能是必要的,以确保程序的正确运行和性能优化。
THUMB THUMB在代码中用于指示编译器,指的是该文件使用Thumb指令集。

输出、输入

EXPORT
IMPORT

在汇编语言编程中,EXPORT 和 IMPORT 通常与链接器(linker)和符号(symbol)管理相关。这两个指令用于声明函数或变量的可见性,以便在多个源文件或模块之间共享它们。

EXPORT

EXPORT 通常用于声明一个函数或变量,使其可以从当前模块(例如一个对象文件或库)被其他模块引用。换句话说,EXPORT 使一个符号在链接过程中对其他模块可见。

例如,在 ARM 的汇编语言中,你可能会看到这样的代码:

;这告诉链接器 Reset_Handler 是一个可以从其他模块引用的函数。
EXPORT Reset_HandlerReset_Handler	PROC; 函数体ENDP	

IMPORT

IMPORT 用于声明一个函数或变量,表明在当前模块中将会使用到在其他模块中定义的这个符号。这告诉链接器在链接过程中需要查找并解析这个符号。

例如,在 ARM 的汇编语言中,你可能会看到这样的代码:

; Data_Function 是在另一个模块中定义的函数,当前模块通过 IMPORT 声明它,并在代码中调用它。
IMPORT Data_Function  start:  BL Data_Function   ; 调用在另一个模块中定义的函数

弱引用

弱引用通常意味着对某个实体(如函数或变量)的引用,它允许其他更强的引用(即非弱引用)覆盖或替换它。当同时存在其他同名标号时,优先使用其他标号。

EXPORT Reset_Handler        	[WEAK]	 

宏定义

在汇编语言中,宏定义(macro definition)通常用于简化重复的代码片段或创建可重用的代码块。宏允许你定义一段代码,然后在多个地方以相同或不同的参数调用它。不同的汇编器和汇编语言可能有不同的宏定义语法和特性。以下是一些常见的汇编语言中宏定义的基本写法和概念:

通用概念
参数: 宏可以接受一个或多个参数,这些参数在宏定义时通过占位符或特定语法来指定,并在宏调用时替换为实际的值或变量。
局部标签: 有些汇编器允许在宏定义中使用局部标签,这些标签在宏展开时会被重命名以防止冲突。
条件汇编: 一些宏定义可能包含条件语句,这些语句在宏展开时根据某些条件决定是否包含特定的代码片段。
嵌套宏: 一些汇编器支持宏的嵌套定义,即在一个宏内部定义另一个宏。

MASM (Microsoft Macro Assembler) 宏定义

在 MASM 中,你可以使用 .MACRO 和 .ENDM 指令来定义宏。例如:

;/*********************************************************************************************************
;*                                              宏定义
;*********************************************************************************************************/
.MACRO MyMacro param1, param2  MOV param1, param2  
.ENDM

然后你可以在代码中使用 MyMacro 并传递参数:

MyMacro var1, var2			;这将会展开为:MOV var1, var2

NASM (Netwide Assembler) 宏定义

在 NASM 中,你可以使用 %macro 和 %endmacro 来定义宏,并使用 %1, %2, 等来引用参数。例如:

;/*********************************************************************************************************
;*                                              宏定义
;*********************************************************************************************************/
%macro MyMacro 2  mov %1, %2  
%endmacro

然后你可以这样使用它:

MyMacro var1, var2			;这将会展开为:MOV var1, var2

在Keil中,我们一般通过MACRO定义宏。

MACRO _LED_ 

常量段、变量段与代码段

“常量段”区、“变量段”区和“代码段”区通过 AREA 进行分段,并根据各段的特点设置相应的属性。“常量段”区用于定义常量“变量段”区用于定义变量,“代码段”区用于定义函数。MainConstData、MainStaticData和.text是段的名称,无特殊作用,段名若以非字母开头则必须包含在符号“|”中DATA、CODE、READONLY和READWRITE为段的属性,DATA和CODE用于指示编译器,该段用于存储数据或代码,READONLY和READWRITE用于设置该段的读/写属性为“只读”或“可读可写”。

;/*********************************************************************************************************
;*                                              常量段
;*********************************************************************************************************/AREA  MainConstData,  DATA,  READONLY
;/*********************************************************************************************************
;*                                              变量段
;*********************************************************************************************************/AREA  MainStaticData,  DATA,  READWRITE
;/*********************************************************************************************************
;*                                              代码段
;*********************************************************************************************************/AREA |.text|, CODE, READONLY

文件结束

ALLGN 4				;检查当前位置,文件结束位置是否按4字节对齐。若未对其则填充 NOP空指令使其对齐,便于CPU快速访问。
END					;END用于指示编译器该文件已结束。

小记

THUMB
它是ARM指令集的一个子集,针对代码密度问题而提出,具有16位的代码宽度。Thumb指令集在保留32位代码优势的同时,大大节省了系统的存储空间。Thumb指令集并不是完整的体系结构,它并不能独立执行,而是与ARM指令集共同存在,处理器可以在ARM工作状态和Thumb工作状态之间切换。Thumb指令集分为Thumb-1指令集和Thumb-2指令集,其中Thumb-1指令集是16位指令集,而Thumb-2指令集在Thumb-1的基础上增加了一些32位指令,其性能与ARM指令集类似。

特殊寄存器

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

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

相关文章

嵌入式网络硬件方案

一. 简介 本文来了解一下嵌入式有些网络中,涉及的网络硬件方案。 注意:本文说明的是有些网络。 提起网络,我们一般想到的硬件就是“网卡”,“网卡”这个概念最早从电脑领域传出来,顾名思义就是能上网的卡。在电脑领…

Android12 简单的共享内存驱动实现 参考Ashmem

Android12 共享内存驱动实现 SOC:RK3568 system:Android12 概述: 1. 概述 Ashmem(Anonymous Shared Memory,Android 匿名共享内存),它基于 mmap 系统调用,可以让不同进程将同一段…

Android invalidate、postInvalidate、requestLayout的区别

一、方法介绍 1、invalidate(): invalidate方法用于在UI线程中请求重绘视图。当我们希望在主线程中更新UI时,可以在UI线程中直接调用invalidate()方法。 内部实现:调用了invalidate方法后,为该View添加一个标记位,同时不断向父…

Go-知识协程

Go-知识协程 1. 基本概念1.1 进程1.2 线程1.3 协程 2. 协程的优势3. 调度模型3.1 线程模型3.2 Go调度器模型 4. 调度策略4.1 队列轮转4.2 系统调用4.3 工作量窃取4.4 抢占式调度 5. GOMAXPROCS对性能的影响 一个小活动: https://developer.aliyun.com//topic/lingma…

virtualbox 日常运维

前言 虽然平常以macOS和Linux作为主打工作环境,但还是有很多需要用到windows的时候,如camtasia和券商QMT软件。 在二手ThinkPad P53上安装了几个windows虚机,作为测试环境。Mac笔记本远程桌面连接嫌麻烦,还是命令行舒服。MacOS自…

C++经典面试题目(十七)

1、请解释拷贝构造函数的作用,并说明其调用时机。 拷贝构造函数是一种特殊的构造函数,用于创建一个新对象,其内容与另一个对象相同。它将一个已存在的对象作为参数,并使用该对象的值来初始化新创建的对象。拷贝构造函数的调用时机…

【CANoe】CAPL_E2E测试-验证报文中的CRC值是否正确

文章目录 一、背景二、CRC校验算法实现_dll制作三、CAPL脚本编写四、测试结果4.1、Write输出窗口4.2、测试报告截图一、背景 在嵌入式软件开发过程中,对于一些报文,需要实现安全发送与安全接收,这就涉及到CRC和RollingCounter。整车和MCU通讯的报文需要对方进行校验才能正确…

计算机网络—TCP协议详解:特性、应用(1)

🎬慕斯主页:修仙—别有洞天 ♈️今日夜电波:マリンブルーの庭園—ずっと真夜中でいいのに。 0:34━━━━━━️💟──────── 3:34 🔄 ◀️…

Linux文件与进程交互的窥探者lsof

lsof 是一个 Linux 和 UNIX 系统中的实用工具,用于列出系统中打开文件的所有信息。这个名字代表 “List Open Files”,但它也可以显示进程相关的其他信息,如: 打开的文件描述符列表 打开网络连接的列表 被进程使用的信号和内核对象等 在Linux系统中,有一个经典的概念: …

【御控物联】JavaScript JSON结构转换(6):对象To对象——综合应用

文章目录 一、JSON结构转换是什么?二、术语解释三、案例之《JSON对象 To JSON对象》四、代码实现五、在线转换工具六、技术资料 一、JSON结构转换是什么? JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换&#xff0…

七月论文审稿GPT第4版:通过paper-review数据集微调Mixtral-8x7b,对GPT4胜率超过80%

前言 在此之前,我司论文审稿项目组已经通过我司处理的paper-review数据集,分别微调了RWKV、llama2、gpt3.5 16K、llama2 13b、Mistral 7b instruct、gemma 7b 七月论文审稿GPT第1版:通过3万多篇paper和10多万的review数据微调RWKV七月论文审…

C++: 命名空间/C++输入输出/缺省参数/函数重载/引用/内联函数

进入C以后,就翻开了新的篇章。C支持C语言的使用。事实上,C是创建者在发现C语言中有很多不好用的地方(在后续学习中会明显看到)后,在C语言基础上又加入了许多语法,于是就成了C。 1.命名空间 来源&#xff…

java(4)之运算符

1、算术运算符 运算符含义表达式加11-减1-1*乘1*2/除2/1%取余5%2 2、赋值运算符 即 表示将右边的值赋给左边的变量 即 int i ; i 1; 运算符含义 表达式 x xyxy-x x-yx - y*x x*yx*y/x x/yx /y%x x%yx %y 代码示例 public class Main {pub…

DXP学习3-单片机时钟显示系统的层次原理图设计

目录 一,自上而下的子母图设计 1,绘制层次式电路母图 1)工程及原理图创建和保存 2)开始绘制层次式母图main.SchDoc 2,绘制图纸符号 1)properties选项卡 2)designator标号 3)filename文件名 4&…

Kafka、ActiveMQ、RabbitMQ和RocketMQ都有哪些区别?

一、问题解析 Kafka、ActiveMQ、RabbitMQ和RocketMQ都是常见的消息中间件,它们都提供了高性能、高可用、可扩展的消息传递机制,但它们之间也有以下一些区别: 1、消息传递模型:Kafka主要支持发布-订阅模型,ActiveMQ、R…

什么是人工智能物联网(AIoT)?

过去十年,从医疗设备、家庭和楼宇自动化到工业自动化等各个领域,物联网 (IoT) 设备的数量呈爆炸式增长。设备包括可穿戴设备、传感器、电器和医疗监视器——所有这些设备都相互连接,收集和共享大量数据。国际数据公司 (IDC) 预测,…

蓝桥杯c++递归与递推

数字三角形 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm>using namespace std; const int N 110; int map[N][N]; int n;int main() {cin >> n;for(int i0;i<n;i){for(int j0;j<i;j){cin >> map[i]…

做好自动化测试必备的5大技能,懂一个就超过了99%的人

或许还有一些人认为软件测试的门槛很低&#xff0c;低到任何人都可以做&#xff0c;随便点点就可以了。这里需要澄清一下&#xff0c;不管哪一类测试岗位&#xff0c;如果做深做精都需要下功夫&#xff0c;只是精通的方向不同。试问一下如果让一个什么都不懂、一点业务基础都没…

Linux之ssh服务

目录 一、ssh简介 ssh组件 二、配置文件 三、相关的命令 ssh scp 四、密钥认证 一、ssh简介 远程登陆linux用的就是ssh服务 ssh服务特点就是数据会机密传输 ssh组件 组件&#xff1a;openssh 服务器&#xff1a;sshd 默认端口&#xff1a;22 二、配置文件 /etc/ssh/ss…

【题目】【网络系统管理】2021年全国职业院校技能大赛模块B--样题(三)

2021年全国职业院校技能大赛 网络系统管理&#xff08;样题3&#xff09;模块B&#xff1a;Windows环境 全国职业院校技能大赛执委会.技术专家组 2021年03月 目录 一、赛题说明 3 &#xff08;一&#xff09;竞赛介绍 3 &#xff08;二&#xff09;密码 3 &#xff08;三…