Linux嵌入式学习之Ubuntu入门(五)汇编语法学习

news2024/11/16 23:41:41

系列文章目录

一、Linux嵌入式学习之Ubuntu入门(一)基本命令、软件安装及文件结构

二、Linux嵌入式学习之Ubuntu入门(二)磁盘文件介绍及分区、格式化等

三、Linux嵌入式学习之Ubuntu入门(三)用户、用户组及文件权限

四、Linux嵌入式学习之Ubuntu入门(四)Makefile


文章目录

  • 系列文章目录
  • 前言
  • GNU汇编语法
    • 基本格式
    • 段定义
    • 伪操作
    • 函数
    • 常用的汇编指令
      • 内部数据传输
      • 存储器访问
        • LDR
        • STR
        • 压栈和出栈指令
        • 跳转指令
            • B指令
            • BL指令
        • 算术运算指令
        • 逻辑运算指令


前言

嵌入式的汇编涉及到堆栈,SP指针,以及DDR初始化。

GNU汇编语法

学stm32的时候有一个startup_stm32f10x_hd.s的启动文件,在keil MDK和IAR两个软件下,语法有不同。

ARM汇编编译使用的是GCC编译器,要符合GNU语法。

基本格式

格式:

label: instruction @ comment
  • label 即标号,表示地址位置,可以通过这个标号得到指令的地址。任何以“:”结尾的标识符都会被识别为一个标号。
  • instruction 即指令,也就是汇编指令或伪指令。
  • @符号,表示后面的是注释,也可以使用“/ * ”和 “ * / ”来注释。
  • comment 是注释内容。

指令、伪指令、伪操作、寄存器名可以大写或小写,但不能混用

段定义

系统预定义了一些段名:

  • .text 表示代码段。
  • .data 初始化的数据段。
  • .bss 未初始化的数据段。
  • .rodata 只读数据段。

自己使用.section伪操作定义:

.section .testsection @定义一个 testsetcion 段

伪操作

  • .byte 定义单字节数据,比如.byte 0x12。
  • .short 定义双字节数据,比如.short 0x1234。
  • .long 定义一个 4 字节数据,比如.long 0x12345678。
  • .equ 赋值语句,比如.equ num, 0x12,表示 num=0x12。
  • .align 数据字节对齐,比如: align 4 表示 4 字节对齐。
  • .end 表示源文件结束。
  • .global 定义一个全局符号,比如: .global _start。

例如:

.global _start

_start:
	ldr r0, =0x12 @r0=0x12

.global 是伪操作,表示_start 是一个全局标号,类似 C 语言里面的全局变量

函数

GNU 汇编同样也支持函数,其中返回语句不是必须的。

函数名:
	函数体
	返回语句

例如:

/* 未定义中断 */
Undefined_Handler:
	ldr r0, =Undefined_Handler
	bx r0   @返回指令
/* SVC 中断 */
SVC_Handler:
	ldr r0, =SVC_Handler
	bx r0
/* 预取终止中断 */
PrefAbort_Handler:
	ldr r0, =PrefAbort_Handler
	bx r0

常用的汇编指令

内部数据传输

指令含义
MOV R0, R1将寄存器 R1 中的数据传递给 R0
MOV R0, #0X12将立即数 0X12 传递给 R0 寄存器
MRS R0, CPSR将特殊寄存器 CPSR 里面的数据传递给 R0(MRS 指令用于将特殊寄存器(如 CPSR 和 SPSR)中的数据传递)(读特殊寄存器)
MSR CPSR, R0MSR 指令用来将普通寄存器的数据传递给特殊寄存器(写特殊寄存器)

存储器访问

I.MX6UL 中的寄存器就是 RAM 类型的,用汇编来配置 I.MX6UL 寄存器的时需先将要配置的值写入到 Rx(x=0~12)寄存器中,然后将 Rx 中的数据写入到 I.MX6UL 寄存器中。读取寄存器过程相反。

LDR

从存储加载数据到寄存器 Rx ,或者将一个立即数加载,加载立即数时用“=”

如 I.MX6UL 有个寄存器 GPIO1_GDIR,其地址为 0X0209C004,

1 LDR R0, =0X0209C004 @ R0=0X0209C004
2 LDR R1, [R0] @ 读取地址 0X0209C004 中的数据到 R1 寄存器中

STR

STR 就是将数据写入到存储器中

例如:
配置寄存器 GPIO1_GDIR 的值为 0X20000002

1 LDR R0, =0X0209C004 @ R0=0X0209C004
2 LDR R1, =0X20000002 @ R1=0X20000002
3 STR R1, [R0] @将 R1 的值写入到 R0 所保存的地址中

LDR 和 STR 都是按照字进行读取和写入的,在指令“LDR”后面加上 B 或 H,比如按字节操作的指令就是 LDRB 和STRB,按半字操作的指令就是 LDRH 和 STRH。

指令含义
LDR Rd, [Rn , #offset]从存储器 Rn+offset 的位置读取数据存放到 Rd 中
STR Rd, [Rn, #offset]将 Rd 写入到存储器中的 Rn+offset 位置

压栈和出栈指令

中断和跳转时要保存当前状态:现场保护。与之对应还有恢复现场。(就是保存 R0~R15 这些寄存器值)
压栈的指令为 PUSH,出栈的指令为 POP, 可一次操作多个寄存器数据,利用当前的栈指针 SP 来生成地址。

如:压栈前SP地址指向 0X80000000

PUSH {R0~R3, R12} @将 R0~R3 和 R12 压栈
PUSH {LR} @将 LR 进行压栈

在这里插入图片描述
(0x80000000指向R12,0x7FFFFFFC指向R0)

出栈:

POP {LR} @先恢复 LR
POP {R0~R3,R12} @在恢复 R0~R3,R12

PUSH 和 POP 的另外一种写法是“STMFD SP!”和“LDMFD SP!”

STMFD SP!,{R0~R3, R12} @R0~R3,R12 入栈
STMFD SP!,{LR} @LR 入栈

LDMFD SP!, {LR} @先恢复 LR
LDMFD SP!, {R0~R3, R12} @再恢复 R0~R3, R12

STM和LDM是多存储和多加载,前面 LDR 和 STR每次只能读写存储器中的一个数据。
FD 是 Full Descending 的缩写,即满递减的意思:SP 指向最后一个入栈的数值,堆栈是由高地址向下增长的,编号小的对应低地址,编号高的对应高地址。

跳转指令

可以用指令或者直接向PC寄存器中写入数据。

指令描述
B < label>跳转到 label,如果超过了+/-2KB,可以指定 B.W< label>使用 32 位的跳转指令
BX < Rm>间接跳转,跳转到存放于 Rm 中的地址处,并且切换指令集
BL < label>跳转到标号地址,并将返回地址保存在 LR 中。
BLX < Rm>结合 BX 和 BL 的特点,跳转到 Rm 指定的地址,并将返回地址保存在 LR 中,切换指令集。
B指令

调用的函数不会再返回到原来的执行处

_start:

ldr sp,=0X80200000 @设置栈指针
b main @跳转到 main 函数
BL指令

跳转之前会在寄存器 LR(R14)中保存当前 PC 寄存器值,所以可以通过将 LR 寄存器中的值重新加载到 PC 中来继续从跳转之前的代码处运行。

push {r0, r1} @保存 r0,r1
cps #0x13 @进入 SVC 模式,允许其他中断再次进去

bl system_irqhandler @加载 C 语言中断处理函数到 r2 寄存器中

cps #0x12 @进入 IRQ 模式
pop {r0, r1}
str r0, [r1, #0X10] @中断执行完成,写 EOIR

第 5 行就是执行 C 语言版的中断处理函数,当处理完成以后返回来继续执行下面的程序,所以使用了 BL 指令。

算术运算指令

在这里插入图片描述
(详细见正点原子的驱动开发指南)

逻辑运算指令

在这里插入图片描述

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

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

相关文章

synchronized原理、偏向锁、轻量级锁、重量级锁、锁升级

文章目录Synchronized概念自增自减字节码指令临界区竞态条件基本使用原理查看synchronized的字节码指令序列Monitor对象的内存布局Mark Word是如何记录锁状态的偏向锁什么是偏向锁偏向锁延迟偏向偏向锁状态跟踪偏向锁撤销之调用对象HashCode偏向锁撤销之调用wait/notify轻量级锁…

Qt Quick - Drawer

Qt Quick - Drawer使用总结一、概述二、使用1、基础使用2、特点空间运行3、与内容转换相互挤占一、概述 Drawer提供了一个基于滑动的侧边面板&#xff0c;类似于经常在触控界面中使用的侧边面板&#xff0c;为导航提供了一个位置。 二、使用 1、基础使用 抽屉可以放置在内…

springcloud深度探索

中文官方文档&#xff1a;project - Spring Cloud Config - 《Spring Cloud中文文档》 - 书栈网 BookStackSpring Cloud ConfigFeaturesQuick StartSample Projects Spring Cloud为开发人员提供了工具&#xff0c;用以快速的在分布式系统中建立一些通用方案&#xff08;例如配…

CDP思科发现协议解析及C/C++代码实现

通常&#xff0c;大多数网络都有几个路由器或交换机&#xff0c;为了便于网络管理&#xff0c;使用网络图或网络图来告诉网络中存在什么类型的设备&#xff0c;以及所有设备如何相互连接&#xff0c;使用的IP地址以及它们属于哪个VLAN的信息。 CDP是一种专有的第二层思科网络协…

Table Transformer做表格检测和识别实践

计算机视觉方面的三大顶级会议&#xff1a;ICCV,CVPR,ECCV.统称ICE CVPR 2022文档图像分析与识别相关论文26篇汇集简介 论文&#xff1a; PubTables-1M: Towards comprehensive table extraction from unstructured documents是发表于CVPR上的一篇论文 作者发布了两个模型&…

22级ACM 4.16 周赛 题解

这场能题解写的感觉没多少其实&#xff08;真的不是因为懒&#xff09;&#xff0c;既然有人想要题解&#xff0c;那么就随便写一下吧&#xff0c;其实大部分的题都有人写出来&#xff0c;感觉这场真的不需要。 A 题 题解 Count Interval AtCoder - abc233_d_霾まる的博客-CS…

AI绘画王炸功能Control Net安装教程

原文&#xff1a;AI绘画王炸功能Control Net安装教程 - 知乎 AI绘画&#xff0c;最近两大王炸功能出圈了。 一个就是超真实超细节的美女图片&#xff0c;已经快和照片无异了&#xff0c;甚至有人用AI绘画的“女仆照片”开始招募游艇会了&#xff0c;具体教程可以查看Lora这篇…

一键生成元宇宙 AI又杀疯了

人类十几年的进步水平&#xff0c;AI用几个月就能轻易实现。在展示了超强的文本对话能力和一键生图功能后&#xff0c;AI大模型不打算停下&#xff0c;开始挑战搭建3D空间这一更高难度的动作。 这次&#xff0c;Facebook母公司Meta想当一把主导者。几天前&#xff0c;它的首席…

185-二35

Java185-二35单列集合顶层接口collection迭代器增强forlambda表达式list特有方法遍历数据结构数组Linkedlist集合泛型类&#xff0c;泛型方法&#xff0c;泛型结构泛型方法泛型的通配符泛型总结数据结构数据结构&#xff08;二叉树&#xff09;前序遍历数据结构&#xff08;二叉…

crm系统有哪些?具体的功能有哪些?

市面上的CRM系统有很多&#xff0c;例如简道云、销售易、salesforce、纷享销客、SugarCRM等等&#xff0c;这些都是比较知名的&#xff0c;前面也有写过很多关于CRM选型的内容&#xff0c;大家可以点进我的主页翻阅一下。 那么&#xff0c;CRM具体的功能有哪些&#xff1f;下面…

计算机网络 - UDP协议 与 TCP协议可靠性(传输层)

前言 本篇介绍UDP报文格式&#xff0c;认识UDP报文&#xff0c;介绍TCP报文格式&#xff0c;了解TCP可靠性的核心机制&#xff0c;TCP通信中三次握手与四次挥手&#xff1b;如有错误&#xff0c;请在评论区指正&#xff0c;让我们一起交流&#xff0c;共同进步&#xff01; 文…

EDA基础概念

EDA基础概念EDA和CADCAD工具EDA工具EDA技术实现目标可编程逻辑器件简称PLD发展历程FPGA简介CPLD简介FPGA和CPLD区别是否需要同时学习FPGA和CPLDXilinx&#xff08;赛灵思&#xff09;公司介绍&#xff08;AMD收购&#xff09;开发工具Xilinx产品Altera&#xff08;阿尔特拉&…

Qt关于QPainter绘制1px宽度图形带来的问题思考

前言 前段时间遇到这样一个问题&#xff0c;使用QPainter绘制直线的时候&#xff0c;设置了笔宽为1像素&#xff0c;但是绘制出来的线条却是2px宽度&#xff0c;而且设置的画笔颜色很明显是降低了透明度&#xff0c;不是最“纯正”的颜色。 当时就感觉非常奇怪&#xff0c;明明…

【FPGA实验1】FPGA点灯工程师养成记

对于FPGA几个与LED相关的实验&#xff08;包括按键点灯、流水灯、呼吸灯等&#xff09;的记录&#xff0c;方便日后查看。这世界上就又多了一个FPGA点灯工程师了&#x1f60f; 成为一个FPGA点灯工程师分三步&#xff1a;一、按键点灯1、按键点灯程序2、硬件实现二、流水灯1、流…

Vue2-黑马(二)

目录&#xff1a; &#xff08;1&#xff09;vue2-基础-属性绑定 &#xff08;2&#xff09;vue2-事件绑定 &#xff08;3&#xff09;vue2-双向绑定 &#xff08;4&#xff09;vue2-计算属性 &#xff08;1&#xff09;vue2-基础-属性绑定 属性与js数据绑定&#xff1a; …

react-router原理

前端路由的原理 自己来监听URL的改变&#xff0c;改变url&#xff0c;渲染不同的组件(页面)&#xff0c;但是页面不要进行强制刷新&#xff08;a元素不行&#xff09;。 hash模式&#xff0c;localhost:3000/#/abc 优势就是兼容性更好&#xff0c;在老版IE中都可以运行缺点是…

DNS配置

TCP/IP提供了通过IP地址来连接到设备的功能&#xff0c;但对用户来讲&#xff0c;记住某台设备的IP地址是相当困难的&#xff0c;因此专门设计了一种字符串形式的主机命名机制&#xff0c;这些主机名与IP地址相对应。 在IP地址与主机名之间需要有一种转换和查询机制&#xff0c…

CANopen | 对象字典OD 06 - 创建对象字典变量,通过TPDO定时发送

文章目录一、前言二、实验目的三、对象字典OD四、TPDO1定时发送tx_Value变量一、前言 该笔记的程序: github 二、实验目的 CANopen从站有一个变量tx_Value&#xff0c;映射到TPDO1上。接着&#xff0c;CANopen从站每1S发送一次TPDO1&#xff0c;将tx_Value发送出去。 三、…

PasteSpider之文件同步软件的介绍

作为PasteSpider系统中的一大特色&#xff0c;那就是文件的差量同步和配置同步。能够实现对不同需求的良好实现。 在网站https://www.pastecode.cn/下载文件同步软件后&#xff0c;完全解压到自己的文件夹内&#xff0c;然后双击“SpiderSyncFile”,如下图&#xff1a; 打开登陆…

Nginx模板自动化

背景 在日常工作中&#xff0c;我们经常需要创建Nginx配置文件的模板&#xff0c;以便在不同的环境中快速部署和配置Nginx服务器。然而&#xff0c;这样的任务通常需要重复性高、耗时长&#xff0c;且容易出错。为了加快这些任务的完成&#xff0c;并提高工作效率&#xff0c;…