ARM裸机开发-汇编基础

000_<ARM9从裸机到Linux操作系统>____ARM9裸机开发 ARM裸奔程序设计心得       注:这篇文章是我半年前贴上来的,随着不断学习,感觉这篇文章还有一些不妥之处。所以又进行了一些修改。文章中绿字处都是后来修改的,嘻嘻。     我是一名在读大三学生,计算机专业,接触嵌入式已有半年时间。从开始的一窍不通,到现在的刚刚入门,感觉自己有一定的收获。嵌入式对计算机专业或电子相关专业都适合。计算机专业的强项在于软件知识,如操作系统。电子相关专业在于硬件 阅读详情

目录

一.基本指令

1.mov指令

2.add指令

3.sub指令

4.ldr与str指令

5.bic与orr指令

6.CMP与b指令

7.stmfd与ldmfd指令

8.常用条件码

二.程序状态寄存器cpsr

三.内存布局

四.栈的分类

五.汇编和C语言混合编程

六.切换CPU工作模式为USER

七.立即数

八.异常处理与软中断

本系列学习ARM开发以imx6ull芯片为参考,本篇为在keil平台使用仿真模拟的学习过程,使用真机在VScode上,请移步下篇文章。

一.基本指令

1.mov指令

//加载12位立即数到寄存器或转移一个寄存器的值到另外一个寄存器;
MOV{S}<c> <Rd>, #<const>
mov r0, #1 ;加载立即数1到寄存器r0
MOV{S}<c> <Rd>, <Rm>
mov r1, r0 ;将r0寄存器的值加载到r1

2.add指令

ADD{S}<c> <Rd>, <Rn>, #<const>

ADD R0, R1, #1 ; R0 = R1 + 1,不更新标志
ADDS R0, R1, #0xFF ; R0 = R1 + 0xFF,更新N/Z/C/V

ADD{S}<c> <Rd>, <Rn>, <Rm>{, <shift>}    //shift 指的是“移位操作”

ADD R0, R1, R2 ; R0 = R1 + R2
ADD R0, R1, R2, LSL #2 ; R0 = R1 + (R2 << 2)

3.sub指令

SUB{S}<c> <Rd>, <Rn>, #<const>

SUB R0, R1, #5 ; R0 = R1 − 5,不更新标志
SUBS R0, R1, #0x10 ; R0 = R1 − 0x10,更新N/Z/C/V

SUB{S}<c> <Rd>, <Rn>, <Rm>{, <shift>}

SUB R0, R1, R2 ; R0 = R1 − R2
SUB R0, R1, R2, LSL #1 ; R0 = R1 − (R2 << 1)

4.ldr与str指令

ldr:

功能1:将非立即数加载到通用寄存器
LDR{<c>}{<q>} <Rt>, <label>

例:如ldr r0, =0x2FAB4

功能2:将RAM中的数据加载到通用寄存器
LDR<c> <Rt>, [<Rn>{, #+/-<imm12>}]

例:ldr r0,[r1,#4];将内存地址为R1+4的字数据读入寄存器R0

LDR<c> <Rt>, [<Rn>], #+/-<imm12>

例:ldr r0, [r1], #8 ;将内存地址R1的字数据读入r0,之后r1+8

LDR<c> <Rt>, [<Rn>, #+/-<imm12>]!

例:LDR R0,[R1,#8] ! ;将存储器地址为R1+8的字数据读入寄存器R0,并将新地址R1+8写入R1。

str:

与ldr作用相反,将通用寄存器中的值写入到RAM中
str r1, [r0]         ;*r0 = r1
str r1, [r0, #4]     ;*(r0 + 1) = r1
str r1, [r0], #4     ;*r0++ = r1
str r1, [r0, #4]!     ;*++r0 = r1

ldr与str结合使用

LDR R0, =0x40000000   ; R0 = 目标内存地址(伪指令)
LDR R1, [R0]          ; R1 = 从 R0 指向的地址读取一个字(32位)
ADD R1, R1, #1        ; R1 = R1 + 1
STR R1, [R0]          ; 把 R1 写回 R0 指向的地址

5.bic与orr指令

bic:

将某个通用寄存器清零(操作数中为bit1的位清0),清0结果写回到通用寄存器。
BIC{S}<c> <Rd>, <Rn>, #<const>;
将rn中的字数据const为1的比特清零,把结果放入rd。

例:
MOV r0, 0x11
BIC r1, r0, #1   ; 把 r0 的第 0 位清零,结果为0x10,存到 r1,r0 不变

orr:

将某个通用寄存器置1(操作数中为bit1的位置1),置1结果写回到通用寄存器

例:
ORR r1, r0, #(1 << 3) ; r1 = r0 | 0x08,r0 原值不变

bic与orr结合使用:

BIC r0, r0, #(0x7 << 4)  ; 先把第4~6位清零(避免脏数据)
ORR r0, r0, #(0x3 << 4)  ; 再把新值 0b011 写入第4~6位

6.CMP与b指令:

cmp:

比较两个寄存器的值或者比较一个寄存器和立即数的值,其原理是对待比较的两个数求差,看结果是否为0,这个指令会无条件修改N,V,C,Z位。

例:
mov r0, #100
cmp r0, #100
会导致Z置位,从条件码表可知,只要Z置位就是两数相等。

b:

实现无条件跳转;
b指令条件分支
b指令循环
b函数调用
bl指令:函数跳转前,会将函数返回地址保存到lr寄存器;
bx指令:bx lr 等价于mov pc, lr

7.stmfd与ldmfd指令

stmfd:

stmfd:入栈保护
STMFD<c> <Rn>(!}, <registers>

例:stmfd sp!, <r0,r1,lr>    //通过入栈保存r0,r1,lr寄存器的值

ldmfd:

ldmfd:出栈恢复
LDMFD<c> <Rn>{!), <registers>

例:ldmfd sp!, <r0, r1, lr>

 8.常用条件码

 对{S}与<c>解释如下

{S} —— 可选后缀,决定是否更新状态标志

  • 有 S:指令执行后,会更新 CPSR(当前程序状态寄存器)中的条件标志位(N、Z、C、V)。

  • 没有 S:不更新任何标志位,只完成数据传送。

<c> —— 条件码(Condition Code),决定指令在什么条件下执行

  • ARM 指令可以条件执行:只有当前 CPSR 中的标志位满足指定条件时,指令才会真正执行,否则被当作 NOP(空操作)。

  • <c> 是条件码的占位符,可以是 EQ、NE、CS、CC、MI、PL、VS、VC、HI、LS、GE、LT、GT、LE、AL 等。

  • 如果省略 <c>,默认是 AL(Always,无条件执行)。

其中常用条件码如下:

二.程序状态寄存器cpsr

注意,图中有误,这里user模式为1 0000

三.内存布局

 左侧:Read/Only Memory Areas(只读存储区 / 代码区)

这个区域用来存放编译后的程序指令(代码)和常量。

  • 勾选 ROM1:表示启用并指定外部只读存储器。

  • off-chip(片外):勾选了此选项,表示这颗 ROM 是单片机/微处理器外部独立接的芯片,不是芯片内部的存储。

  • Start(起始地址):0x0。S3C2440 支持多种启动方式。如果开发板设置为 Nor Flash 启动,那么 Nor Flash 会被硬件映射到 CPU 的 0x00000000 地址。所以代码的链接起始地址必须是 0x0。

  • Size(大小):0x200000(十六进制,换算成十进制是 2MB)。这代表你开发板上的 Nor Flash 芯片容量是 2MB。

  • 红字“nor flash 指令”解释:红色批注就是在说明这一块。Keil 编译链接时,会将所有的机器指令代码按顺序放在以 0x0 开头的这一段 2MB 空间内。CPU 上电后,直接从这个 Nor Flash 中取指令并执行。

右侧:Read/Write Memory Areas(读写存储区 / 数据区)

这个区域用来存放程序运行时的全局变量、静态变量和堆栈(Stack)。

  • 勾选 IRAM1:表示启用并指定内部 RAM(Internal RAM)。注意这里的 off-chip 没有勾选,说明这是 S3C2440 芯片内部集成的 RAM。

  • Start(起始地址):0x40000000。这是 S3C2440 芯片设计时规定的内部 SRAM(通常叫 Steppingstone,也就是“垫脚石”)的物理地址。

  • Size(大小):0x1000(换算成十进制是 4KB)。S3C2440 内部 SRAM 刚好就是 4KB。

总结:这张图的配置表示,代码跑在 0x0 开始的 2MB Nor Flash 上,运行时的数据变量跑在 CPU 内部那 4KB 的 SRAM 上。如果程序很小(比如只点亮个 LED),这套参数完全没问题;如果程序很大,就需要加上外部的 SDRAM 配置了。

四.栈的分类

满栈/空栈(是一种结构,不是传统字面意思的满空):根据栈顶所在位置是否存有元素确定。

栈顶所在位置一直存有元素称为满栈,先移动栈顶再存入数据;
栈顶所在位置一直没有元素称为空栈,先存入数据再移动栈顶。

增栈/减栈:根据栈的生长方向确定。

入栈数据时,栈顶向内存高地址移动,称为增栈;
入栈数据时,栈顶向内存低地址移动,称为减栈,

注意:ARM中的栈结构为:满减栈。

五.汇编和C语言混合编程

1.汇编调用C函数
汇编和C语言混合编程(汇编调用C函数C调用汇编函数)
汇编如何向c语言传参:
C语言将函数运行结果返回给R0寄存器
当参数小于等于4个时,通过通用寄存器进行传参(R0-R3)


当参数超过4个时,必须通过栈进行传参(入栈保护出栈恢复)

2.C调用汇编函数
C语言向汇编函数传参,参数会被保存到通用寄存器汇编函数的结果,通过R0寄存器返回给C语言

六.切换处理器工作模式为USER模式

1.将cpsr寄存器中的值读到R0寄存器
2.将R0寄存器中的值修改为10000
3.将R0寄存器中的值写回到cpsr寄存器
mrs指令:读取某个特殊寄存器(cpsr)的值到通用寄存器
msr指令:将通用寄存器中的值写入到特殊寄存器(cpsr)

例:
MRS , <spec_reg>
mrs r0, cpsr
MSR<spec_reg>,
msr cpsr, r0

七.立即数

立即数的判断:

  1. 如果某个数的数值范围是 0~0xFF 之间,那么这个数一定是立即数;
  2. 把某个数展开成 2 进制,这个数的最高位 1 至最低位 1 之间的二进制数序列的位
    数不能超过 8 位;
  3. 这个数的二进制序列凑够 8 位之后的的右边必须为偶数个连续的 0(2条不够8位时右对齐,在末尾补0)

例:

0x234 = 0000 0000 0000 0000 0000 0010 0011 0100
最高位1至最低位1之间的二进制数序列:1000 1101没有超过8位
末尾1的右边有2个0,所以0x234是立即数

0x3f4 = 0000 0000 0000 0000 0000 0011 1111 0100
最高位1至最低位1之间的二进制数序列:1111 1101 从第一个1开始到最后一个1之间没有超过8位
末尾1的右边有2个0,所以0x3f4是立即数

0x132 = 0000 0000 0000 0000 0000 0001 0011 0010
最高位1至最低位1之间的二进制数序列:1001 1001 从第一个1开始到最后一个1之间没有超过8位
末尾1的右边有1个0,不满足第二条,所以0x132不是立即数

0x7f8 = 0000 0000 0000 0000 0000 0111 1111 1000
最高位1至最低位1之间的二进制数序列:1111 1111从第一个1开始到最后一个1之间没有超过8位
末尾1的右边有3个0,不满足第二条,所以0x7f8不是立即数

0xfab4 = 0000 0000 0000 0000 1111 1010 1011 0100
最高位1至最低位1之间的二进制数序列:0011 1110 1010 1101 从第一个1开始到最后一个1之间超过8位,不满足条件1,所以这个数不是立即数

ARM 指令机器码只有12bit 用来存立即数,放不下完整 32 位数字,拆成两部分:

高 4 位:rotate(旋转位)
低 8 位:imm8(8 位基础立即数)

4位旋转位若直接表示位移0-15位,则立即数最大只能位移15位,无法覆盖32位寄存器的所有角落,故×2,最终 32 位立即数 = imm8 循环右移 2×rotate 位(移位步数永远是偶数:0、2、4 … 30 位,硬件无法实现移位奇数位,易知,能表示的最大立即数为0xFF00 0000,即0xFF循环右移8位,rotate=4,12位则为0x4FF)

八.异常处理与软中断

  当使用keil仿真芯片工作时,可以使用软中断代替硬件中断。

启动过程的核心代码:

	ldr pc, =_reset_handler
	ldr pc, =_undefine_handler
	ldr pc, =_software_handler
	ldr pc, =_prefetch_abort_handler
	ldr pc, =_data_abort_handler
	ldr pc, =_reserved_handler
	ldr pc, =_irq_handler
	ldr pc, =_fiq_handler
//程序开始依照异常函数的处理顺序给pc赋值不同的跳转地址

_asm_svc
	 export _asm_svc
	 svc #7    // 触发软中断,执行ldr pc, =_software_handler行代码,再运行如下处理函数
	 bx lr  

_software_handler
	 import c_software_handler
	 stmfd sp!, {r0-r12, lr}
	 bl c_software_handler
	 ldmfd sp!, {r0-r12, pc}^  //^:恢复现场的同时把工作模式也恢复
//软中断处理函数

_reset_handler
	 ; 设置SVC模式下的栈
	 ldr sp, =0x40001000    //自行分配,参考第三节内存布局

	 ; 切换工作模式:USER模式
	 mrs r0, cpsr
	 bic r0, r0, #0x1F
	 orr r0, r0, #0x10    //1 0000为user工作模式
	 msr cpsr_c, r0       //cpsr_c为keil的特殊语法要求,vscode无需在意

	 ; 设置USER模式下的栈
	 ldr sp, =0x40001000
	 sub sp, sp, #1024    //减去1KB为user模式的栈
ARM裸机开发-bootloader-汇编语言 一,汇编语言概述 1、为什么要使用汇编 一般情况下我们不会用到汇编,但有两种情况下,我们要用到汇编。 1、启动代码。编写bootloader和内核时使用,主要是对cpu和内存进行初始化时使用,因为这个时候还没有c语言的环境(堆栈还没有建立),所以不能用c语言。 2、高效率的特殊需求。因为汇编语言的执行效率要高于c语言,所以对某些对效率要求高的程序要用到汇编,可以是汇编与c语言的混合编程 阅读详情

相关推荐

ARM(5)-IMX6ULL 裸机开发入门:从启动到点亮第一盏 LED 灯

ARM 异常处理:异常向量表是入口,复位异常是程序启动点,其他异常需后续扩展实际处理逻辑(如 IRQ 中断服务函数)。工作模式与栈:不同模式独立栈空间,SYS 模式适合主程序,IRQ 模式用于中断处理。GPIO 控制流程:复用配置→电气特性→方向设置→数据操作,需结合芯片手册和硬件原理图。交叉编译流程:汇编→编译(.o)→链接(.elf)→格式转换(.bin)→烧录,Makefile 自动化管理流程。

m0_74911141的博客 1167

ARM裸机开发:ARM汇编基础

ARM裸机开发:ARM汇编基础知识点整理

嵌入式学习记录站点 2223

ARM汇编编程基础(四) -- ADS开发环境的使用

本系列文章节选自本人所著《深入浅出嵌入式底层软件开发》。 本系列文章,所需代码请从以下地址下载: http://download.youkuaiyun.com/download/scyangzhu/4602585 掌握了基本的汇编指令和伪操作后,就具备了编写简单ARM汇编程序的基本理论能力,不过要实战得到真实可执行的程序,还需要可以对程序进行编辑和编译的开发环境(命令

风之子的专栏 3301

汇编语言的基础使用及ARM 裸机开发环境搭建

问题 1:被调函数修改主调函数的寄存器,导致数据丢失问题 2:函数嵌套时,LR被覆盖,无法正确返回栈保护现场(入栈保存寄存器,出栈恢复)

m0_74317917的博客 1120

ARM基础实验:从汇编启动代码到GPIO点灯的完整裸机开发指南

嵌入式开发中,ARM裸机实验是理解硬件底层运行机制的关键路径。与依赖操作系统的应用开发不同,裸机程序需要开发者亲自处理芯片上电后的启动流程,包括交叉编译工具链搭建、汇编启动代码编写、中断向量表布局以及链接脚本设计。通过Makefile将汇编与C代码有机链接,再配合GDB对向量表和寄存器进行验证,能够清晰掌握CPU从复位到进入main函数的完整脉络。GPIO点灯作为经典入门实验,展示了时钟使能、模式配置和寄存器位操作等硬件控制核心方法。这类技术广泛应用于物联网终端、驱动开发和底层固件设计,是深入理解ARM架构

weixin_42549037的博客 239

ARM处理器裸机开发:底层编程技巧与实践

简介:ARM处理器裸机开发是嵌入式系统学习的核心内容,强调不依赖于操作系统的底层编程。本课程将深入探讨ARM基础架构、寄存器操作、中断处理、内存管理和I/O设备控制等关键知识点。通过学习汇编语言编程、链接脚本编写以及调试技巧,学生将能够在没有操作系统支持的情况下,直接与硬件进行交互,从而构建起扎实的底层编程基础。实践环节将通过实例分析,加强理论知识的理解和应用。

weixin_42509507的博客 1211

ARM裸机开发(基础汇编指令)Day02

判断0x1fe是否是立即数数a:0x1fe = 0b 0000 0000 0000 0000 0000 0001 1111 1110数b:0xff = 0b 0000 0000 0000 0000 0000 0000 1111 1111循环右移31位0x1fe不是一个立即数。

liujing10232929的博客 194

DeepBSA实战指南:从安装到基因组分析的全流程解析

本文详细解析了DeepBSA工具从安装到基因组分析的全流程,特别介绍了其简化生物信息学分析的'一键式'操作和独家深度学习算法。通过实战案例展示了DeepBSA在信噪比处理和QTL定位上的优势,并提供了Linux和Windows系统的安装避坑指南、数据预处理技巧以及算法选择建议,帮助用户高效完成基因组分析。

weixin_28732953的博客 441

51.Linux裸机开发--ARM基础概念及汇编环境搭建

之前学习了Linux的应用层开发,下面要开始linux的底层开发,当然最开始我们不是学习bootloader,也不是内核移植,而是开始ARM的裸机开发,那么我们老说ARM,那ARM是什么?目前比较火的,美国封锁我们的华为,ARM公司又和华为有什么关系? 一.ARM基础概念 详细的内容可以看一下我之前整理的博客: https://blog.youkuaiyun.com/lzs940320/article/details/90021068 下面只对一些关键的知识进行一个复习总结。 二.环境搭建及启动文件编写及

lzs940320的博客 1034

用户视角下的vfsglobal预约困境:从注册到登录的全流程避坑指南

本文详细解析了vfsglobal签证预约系统从注册到登录的全流程操作,帮助用户避开常见技术陷阱。针对IP限制、DNS解析、浏览器缓存等登录障碍提供实用解决方案,并揭示账号管理的隐藏规则与支付环节的延时处理技巧,助力用户高效完成签证预约。

ol78901234的博客 871

【BAAS】基于supabase的知识库详细设计

为满足快速开发需要和减少开发及维护成本,使用BAAS(Backend-as-a-Service)模式可以很好的降低我们的后端维护成本,并提高前端对接效率。一般来说,BAAS是一种云服务模式,BaaS供应商会为提供一些通用的能力,例如用户身份验证、数据库管理、远程更新和推送通知(针对移动应用程序),以及云存储和自托管。BaaS最主流的是Google的firebase,具有相当完善的功能和集成方案,但他是收费的,而且在我们实际项目中,可能需要私有化部署,这时就需要一些开源的替代方案,例如主流的。

Ric的博客 1781

嵌入式Linux裸机开发笔记(IMX6ULL)—ARM汇编基础

Cortex-A 芯片一上电 SP 指针还没初始化,C 环境还没准备好,C 语言中的函数调用涉及到出栈入栈,出栈入栈就要对堆栈进行操作,所谓的堆栈其实就是一段内存,由 SP 指针访问,SP 指针指向栈顶。本次笔记讲述了学习汇编的必要性,以及简单介绍了GNU大致语法和几种常见的汇编指令,还有很多不常用的指令没有记录到,但已经可以满足嵌入式裸机开发的基本需求了,本笔记单纯是个人在学习过程的知识复习回顾和总结,部分内容提炼于某些教程,本次笔记只记录一些个人使用到的常见汇编指令,希望可以帮助到有需要的小伙伴

qq_55730568的博客 1117

VMvare 桥接模式无法联网、没有未桥接的主机网络适配器,无法将网络更改为桥接状态。

很多程序员,整天沉浸在业务代码的 CRUD 中,业务中没有大量数据做并发,缺少实战经验,对并发仅仅停留在了解,做不到精通,所以总是与大厂擦肩而过。我把私藏的这套并发体系的笔记和思维脑图分享出来,理论知识与项目实战的结合,我觉得只要你肯花时间用心学完这些,一定可以快速掌握并发编程。《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!战项目源码讲义》点击传送门即可获取!**

q16974058的博客 4330

ARM与裸机开发教程

一、汇编语言是什么? 我们知道,CPU 只负责计算,本身不具备智能。你输入一条指令(instruction),它就运行一次,然后停下来,等待下一条指令。 这些指令都是二进制的,称为操作码(opcode),比如加法指令就是00000011。编译器的作用,就是将高级语言写好的程序,翻译成一条条操作码。 对于人类来说,二进制程序是不可读的,根本看不出来机器干了什么。为了解决可读性的问题,以及偶尔的编辑需求,就诞生了汇编语言。 ...............

生活需要深度 2826

基于matlab的主成分分析的人脸二维码识别系统

人脸识别因其在系统安全验证、信用验证、刑侦跟踪、身份管理、视频会议、人机交互、智能家居等方面的巨大应用前景,成为当前模式识别和人工智能领域越来越热门的一个研究方向。随着安全入口控制和二维码智能扫描应用需求的快速增长,基于二维码识别的生物人脸统计识别技术也引起了人们的重视。本案例将详细讲解基于主成分分析的人脸特征提取的原理与方法,并将其与 QR 二维码的编解码进行结合,将 MATLAB 作为工具平台,调用 QR 二维码编解码应用程序,进而实现一个人脸二维码自动识别的系统原型。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 977

【后量子密码】SPHINCS+ 算法(二):签名与验签(附源码分析)

本节介绍SPHINCS+ 算法的密钥生成、签名与验签。nnn:安全参数;www:Winternitz参数,WOTS+签名分解的基底;hhh:超树的高度;ddd:超树中子树的层数;kkk:FORS 树的数量;ttt:FORS 树的叶子节点数。

听雨草堂 4680

ARM裸机篇(三)——i.MX6ULL第一个裸机程序

一、汇编基础 处理器内部数据传输指令 存储器访问指令 压栈和出栈指令 跳转指令 算术运算指令 逻辑运算指令 二、汇编点亮LED灯

sinat_31039061的博客 3427

【YOLOv11】006、YOLOv11数据增强策略:Mosaic、MixUp等增强技术原理解析

摘要:YOLOv11在产线缺陷检测中遇到小尺寸瑕疵漏检问题,暴露了训练数据过于"干净"的缺陷。数据增强的核心是提升模型泛化能力,而非简单扩充数据。Mosaic增强通过多图拼接迫使模型处理多尺度目标,需注意边界框裁剪细节;MixUp通过线性插值使决策边界更平滑,但需避免类别冲突。自适应增强策略应随训练进度动态调整强度。实际应用中,需针对小目标、类别不平衡等场景调整增强参数,并确保验证与推理流程一致。数据增强应针对性解决具体问题,而非盲目尝试组合。

企鹅码农的专属播客,分享10多年的实战案例和经验解读,包含YOLO、RT-DETR、AI等各个工作领域。 366

ARM裸机开发(汇编指令)

【代码】ARM裸机开发(基础汇编指令)

weixin_65849806的博客 431

Oracle EBS 寄销/VMI(2)-->采购篇

上篇有一部分设置需要建BPA后,将BPA编号与批准的供应商相关联.     本篇主要是讲的内容:一揽子采购协议-->准标采购订单-->收接入库-->子库转移-->创建冲减通知-->'按接收开票' 自动开票程序 1. PO-->采购订单à采购订单 创建一揽子采购协议,确定物料

陈显平的专栏-Oracle EBS 1万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

ARM 裸机开发 知识点

本文主要介绍了ARM架构的基础知识、发展历史和汇编指令集。内容包括:1)机器码、汇编指令和指令集等基础概念;2)ARM公司发展历程及主要产品发布;3)复杂指令集与精简指令集的区别;4)ARM内核的工作模式和寄存器组织;5)特殊功能寄存器(SP、LR、PC、CPSR、SPSR)的作用;6)汇编指令分类和格式,包括数据操作、移位运算、位运算、算术运算、比较、跳转、内存读写、栈操作、CPSR读写以及软中断指令等。通过详细的代码示例,展示了ARM汇编语言的基本语法和编程方法。

2301_81501694的博客 1275

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

I.MX6U ALPHA裸机开发

I.MX6U逻辑开发笔记

Junluoyu的博客 1191

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

视频教程-ARM体系结构与汇编指令-1.2.ARM裸机第二部分视频课程-驱动/内核开发

ARM体系结构与汇编指令-1.2.ARM裸机第二部分视频课程 互联网课程品牌...

weixin_28977519的博客 191

【笔记】ARM裸机程序开发_part1

ARM裸机开发的一些基础知识,基于x210开发板

一枚菜菜子的充电站 2627

ARM裸机开发入门:从环境搭建到外设驱动

【代码】ARM裸机开发入门:从环境搭建到外设驱动。

m0_62928331的博客 871

Pico裸机2(汇编基础)

本文回顾了汇编语言的基本概念,重点介绍了ARM架构下的寄存器、基础指令分类和使用场景。通过实际案例演示了在WSL环境下编写x86汇编程序的过程,分析了ELF文件结构和符号表信息。同时展示了ARM最小启动代码的实现,包括向量表设置和链接脚本配置。文章还对比了操作系统环境下与裸机编程的差异,提供了三种实用的在线汇编工具推荐。最后通过readelf和nm工具解析了生成的可执行文件结构,帮助读者理解底层程序的存储布局和执行机制。

fanged的专栏 292
上一篇: 嵌入式硬件-51单片机
下一篇: ARM裸机开发-点亮LED灯
剑指offer.
博客等级 码龄3年 15粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值