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

目录

  • 一、汇编语言怎么写
  • 二、写一个试试
  • 三、分析
    • 1、启动
    • 2、配置GPIO
    • 3、设置GPIO的电平
    • 4、死循环
  • 四、编译
    • 1、安装linux虚拟机和arm-gcc-linux工具链。
    • 2、编写makefile
    • 3、make编译:
  • 五、成功

一、汇编语言怎么写

我们都知道,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。
    然后
    ARM汇编语言学习笔记(二)跑个灯程序以及.s文件分析_第1张图片
    不同的位对应不同的管脚
  • 我们要设置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的电平

同样,我们可以在手册中找到:
在这里插入图片描述
ARM汇编语言学习笔记(二)跑个灯程序以及.s文件分析_第2张图片

  • 所以我们只需要将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汇编)