ARM汇编语言学习笔记(二)跑个灯程序以及.s文件分析

发布者:平安宁静最新更新时间:2022-01-10 来源: eefocus关键字:ARM  汇编语言  s文件 手机看文章 扫描二维码
随时随地手机看文章

一、汇编语言怎么写

我们都知道,c语言可以写成c语言然后编译。那么汇编语言了?

汇编语言用汇编语言写,然后写出来为.s文件。所以我们只需要任意一款可以编写.s文件的编辑器就可以啦,例如:source insight、notepad等。


二、写一个试试

/*

 * 点亮LED1: gpf4

 */


.text

.global _start


_start:


/* 配置GPF4为输出引脚

 * 把0x100写到地址0x56000050

 */

ldr r1, =0x56000050

ldr r0, =0x100 /* mov r0, #0x100 */

str r0, [r1]



/* 设置GPF4输出高电平 

 * 把0写到地址0x56000054

 */

ldr r1, =0x56000054

ldr r0, =0 /* mov r0, #0 */

str r0, [r1]


/* 死循环 */

halt:

b halt


三、分析

说实话,我一开始看着这些代码,我也蒙。

后来看了别人的分析才知道是啥:


1、启动

大家其实也没有必要在开始太过于了解这两句话,就先当作#include "stdio.h"和main函数看待就好,就是一个c文件的必须部分


.text    //这个的意思是,下面的代码放到 .text这个代码分段中

.global _start   //声明一个全局变量 ,叫做_start

//这个的作用是因为,arm编译器需要这样一个全局变量作为程序的起点,类似于C语言的main函数


2、配置GPIO

这里就很有意思了,我们在c语言中点灯,如果是采用stm32这种单片机的库函数的话,往往是直接使用一个函数,就可以成功。但是如果是直接操作寄存器,那么这里就会很好懂啦。


首先,将GPIO寄存器设置为输出模式

我们在S3c2440芯片手册里面查到:

在这里插入图片描述

设置这一个寄存器可以配置GPIO。

然后

在这里插入图片描述

不同的位对应不同的管脚

我们要设置GPIO4就找到对应的第九位和第八位,就是x00000100,这样的话,第9-8位就是0b01,也就是对应输出模式。

/* 配置GPF4为输出引脚

 - 把0x100写到地址0x56000050

 */

ldr r1, =0x56000050 //将0x56000050写入r1

ldr r0, =0x100 /* mov r0, #0x100 */ //将0x100写入r1

str r0, [r1] //将r0的值写入r1中的地址上(可以理解为将r1指向的地址写值)


3、设置GPIO的电平

同样,我们可以在手册中找到:

在这里插入图片描述
在这里插入图片描述

所以我们只需要将GPF寄存器的第4位设置为1就可以啦:

/* 设置GPF4输出高电平 

 * 把0写到地址0x56000054

 */

ldr r1, =0x56000054 //同样将0x56000054写入r1

ldr r0, =0 /* mov r0, #0 */ //将0 写入r0,

str r0, [r1] //将r0的值写到r1存的地址中去


4、死循环

这里解释一下,第一个halt 意思是计算机进入暂停,那第二个指令意思是跳转到halt。那么arm就会不停的暂停,也就是死循环

halt: //暂停

b halt //跳转到暂停


四、编译

在很多单片机的使用中,我们都可以一键编译,方便是真的方便,但是,我们永远不会知道计算机是怎么真正的编译文件的。


我们这样看,.s文件虽然是非常接近机器运行的语言,但是机器还是不能直接使用,因为机器只能识别二进制文件,那么怎么把.s文件编译成为二进制文件了?


当然,我们自己也没有这个本事来直接编译.s文件,所以我们需要借助arm_gcc_linux这个工具来帮助我们编译。那么怎么使用这个工具链了?


1、安装linux虚拟机和arm-gcc-linux工具链。

这个网上教程太多了,我就不一一列举


2、编写makefile

我们有了工具,当然还需要一些操作。比如,我们怎么让这个工具编译我们想编译的文件,并且编译的过程中是不是要打印编译信息等等配置,我们为了写这些配置给工具使用就要按照他的规则写一个规则文件,这个文件就是大家耳熟能详的makefile。


all: #这里就是一个标志,我们以后如果用了make all命令,那么就会执行下面的操作

arm-linux-gcc -c -o led_on.o led_on.S #将led_on.S文件编译成为中间代码文件.o文件

arm-linux-ld -Ttext 0 led_on.o -o led_on.elf #将目标文件来凝结成为 led_on .elf文件

arm-linux-objcopy -O binary -S led_on.elf led_on.bin #将连接文件生成可执行文件,.bin也就是二进制文件

arm-linux-objdump -D led_on.elf > led_on.dis    #将链接文件反汇编为.dis文件,我们可以看这个文件来看机器的执行过程

clean: #这里就是一个标志,我们以后如果用了make clean命令,那么就会执行下面的操作

rm *.bin *.o *.elf #删除所有.bin,.o.elf文件


3、make编译:

首先跳转到对应的文件夹下面

保证自己的makefile文件和.s文件都在这个文件夹下面,然后:输入make命令


五、成功

关键字:ARM  汇编语言  s文件 引用地址:ARM汇编语言学习笔记(二)跑个灯程序以及.s文件分析

上一篇:ARM汇编语言学习笔记(三)看反汇编文件,学机器内部操作
下一篇:ARM汇编语言学习笔记(一)介绍

推荐阅读最新更新时间:2024-10-22 14:35

ARM汇编语言学习笔记(二)跑个程序以及.s文件分析
一、汇编语言怎么写 我们都知道,c语言可以写成c语言然后编译。那么汇编语言了? 汇编语言用汇编语言写,然后写出来为.s文件。所以我们只需要任意一款可以编写.s文件的编辑器就可以啦,例如:source insight、notepad等。 二、写一个试试 /* * 点亮LED1: gpf4 */ .text .global _start _start: /* 配置GPF4为输出引脚 * 把0x100写到地址0x56000050 */ ldr r1, =0x56000050 ldr r0, =0x100 /* mov r0, #0x100 */ str r0, /* 设置GPF4输出
[单片机]
<font color='red'>ARM</font><font color='red'>汇编语言</font>学习笔记(二)跑个<font color='red'>灯</font><font color='red'>程序</font>以及.<font color='red'>s</font><font color='red'>文件</font>分析
ARM汇编语言学习笔记(三)看反汇编文件,学机器内部操作
一、目的: 学习反汇编文件。 通过反汇编文件了解机器的运作过程。 二、反汇编文件: led_on.elf: file format elf32-littlearm Disassembly of section .text: 00000000 _start : 0: e59f1014 ldr r1, ; 1c .text+0x1c 4: e3a00c01 mov r0, #256 ; 0x100 8: e5810000 str r0, c: e59f100c ldr r1, ; 20 .text+0x20 10: e3a0000
[单片机]
ARM汇编语言学习笔记(四)汇编语言中,如何调用C文件
一、目的 有时候会想一下,为什么我们要应用这些高级语言了?因为,方便啊。 汇编语言对于机器来说固然是效率很高的,但是我们编写起来其实并没有那么方便,因为他的思路还是更近机器,所以在汇编语言的编写当中,C语言也可以被使用进来,帮助大家更快更好的完成工作。 栈在汇编语言中的设置。 C语言在汇编中的调用。 二、堆栈设置 1、为什么要设置栈 因为,c语言函数需要。(如果你要问为什么需要,因为c语言所有的变量都要有地方放啊) 2、怎么设置栈 解决下面的三个问题,我们就可以成功设置栈啦。 调用者怎么向被调用者传参。 被调用者怎么返回值。 怎么恢复调用函数前的寄存器状态。 寄存器规则 这一篇寄存器规则很清楚的讲解了,我们怎么进入
[单片机]
<font color='red'>ARM</font><font color='red'>汇编语言</font>学习笔记(四)<font color='red'>汇编语言</font>中,如何调用C<font color='red'>文件</font>
51 汇编语言编程:走道控制程序
LED EQU P3.3 KEY EQU P3.7 ORG 0000H LJMP START ORG 000BH LJMP T0_INT ORG 0030H ;-------------------------------- START: MOV TMOD, #01H MOV TH0, #HIGH(65536-62500) MOV TL0, #LOW(65536-62500) MOV IE, #82H ;-------------------------------- LP1: SETB LED ;关灯 JB KEY, LP1 ;等待第一次按键 C
[单片机]
汇编语言的交通程序
汇编语言的交通灯程序,单片机采用51单片机,基本完成控制两组交通指示灯交替亮,每个路口有左拐、直行及行人三种指示灯。直行灯设有红、黄、绿三种颜色。非机动车与汽车共用左拐和直行灯。首先东西向直行绿灯和行人灯亮1分钟,左转灯亮30秒,黄灯亮5秒(同时南北向红灯亮95秒),然后东西向红灯亮95秒钟(同时首先南北向直行绿灯和行人灯亮1分钟,左转灯亮30秒,黄灯亮5秒),然后东西向的绿灯亮,依次类推。 每次绿灯亮的时候,对应的行人灯亮。60S/30S/5S/60S/30S/5S 东西道:绿和行人/左转/黄/红/红/红 南北道:红/红/红/绿和行人/左转/黄 行人灯亮的时候有声音提示盲人能通过。突发交通事
[单片机]
单片机交通实验汇编语言程序
经过几天的整理,终于将网络上得到交通灯仿真文件,用汇编自己编写了一个程序,实验结果完全符合本人的思路,实验成功。 程序比较长,估计还会用更好的办法重新写。 编写心得是:单片机编程,不一定要背指令,用时可以查,也不必去默写子程序,用时还是可以查,但是,很关键的就是,你的程序,你自己要清楚整个的执行过程,也就是单片机的执行流程。而在实际的应用中,要注意驱动电路的设计,特别是单片机上电复位输出高电平可能造成的影响。 程序如下:如果网页显示格式错乱可从http://www.51hei.com/f/jtda.rar处下载. ORG 0000H START: MOV R2,#30 SU0: MOV P
[单片机]
单片机交通<font color='red'>灯</font>实验<font color='red'>汇编语言</font><font color='red'>程序</font>
ARM汇编语言程序结构示例
详细介绍ARM汇编语言之前,先给出一个汇编源程序示例,使读者对ARM汇编语言程序的结构有一个大概的了解。 CODE32 ;32位的ARM指令段 AREA codesec, CODE, READONLY ;代码段,名称为codesec,属性为只读 main PROC ;函数main STMFD sp!,{lr} ;保存必要的寄存器和返回地址到数据栈 ADR r0,strhello ;取标签strhello代表的地址值 BL _ printf ;调用C运行时库的_printf函数打印 ;“Hello world!”字符串 BL welcomefun ;调用子函数welcomfun LDMFD sp!,{pc} ;恢复寄存器值 st
[单片机]
ARM汇编语言程序中常用的符号
在汇编语言程序设计中,经常使用各种符号代替地址、变量和常量等,以增加程序的可读性。尽管符号的命名由编程者决定,但并不是任意的,必须遵循以下的约定: — 符号区分大小写,同名的大、小写符号会被编译器认为是两个不同的符号。 — 符号在其作用范围内必须唯一。 — 自定义的符号名不能与系统的保留字相同。 — 符号名不应与指令或伪指令同名。 1、 程序中的变量 程序中的变量是指其值在程序的运行过程中可以改变的量。 ARM ( Thumb )汇编程序所支持的变量有数字变量、逻辑变量和字符串变量。 数字变量用于在程序的运行中保存数字值,但注意数字值的大小不应超出数字变量所能表示的范围。 逻辑变量用于在程序的运行中保存
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved