编写第1个程序点亮LED汇编程序

来源:互联网 发布:农村淘宝接受哪些快递 编辑:程序博客网 时间:2024/06/04 20:06
汇编指令:
1) ldr(load):读内存命令 
例:ldr r0, [r1]
假设r1的值是X,读取地址X上的数据(4字节),保存到r0中
2) str(store):写内存命令 
例:str r0, [r1]
假设r1的值是X,把r0的值写到地址X中
3) mov(move): 
例:move r0, r1
把r1的值赋值给r0,r0=r1
例:move r0, #0x100
r0=0x100
4) mov r0, #0x12345678   

该条指令为错误指令,因为ARM指令32位,某些位表示mov指令,

某些位表示r0,剩下的位不足以表示任意值,比如0x12345678

所以要引入伪指令如下:

ldr r0, =0x12345678 即r0=0x12345678

该条指令为伪指令,它会被拆分为几条正真的ARM指令

5) b:跳转指令,跳到指定的地址处执行


点亮LED的汇编代码:

/* * 点亮LED1: gpf4 */.text.global _start_start:/* 配置GPF4为输出引脚 * 把0x100写到地址0x56000050 */ldr r1, =0x56000050ldr r0, =0x100/* mov r0, #0x100 */str r0, [r1]/* 设置GPF4输出高电平  * 把0写到地址0x56000054 */ldr r1, =0x56000054ldr r0, =0/* mov r0, #0 */str r0, [r1]/* 死循环 */halt:b halt

Makefile:

all:
arm-linux-gcc -c -o led_on.o led_on.S
arm-linux-ld -Ttext 0 led_on.o -o led_on.elf
arm-linux-objcopy -O binary -S led_on.elf led_on.bin
arm-linux-objdump -D led_on.elf > led_on.dis
clean:
rm *.bin *.o *.elf


得到的led_on.dis反汇编:

led_on.elf:     file format elf32-littlearmDisassembly of section .text:00000000 <_start>:   0:e59f1014 ldrr1, [pc, #20]; 1c <.text+0x1c>   4:e3a00c01 movr0, #256; 0x100   8:e5810000 strr0, [r1]   c:e59f100c ldrr1, [pc, #12]; 20 <.text+0x20>  10:e3a00000 movr0, #0; 0x0  14:e5810000 strr0, [r1]00000018 <halt>:  18:eafffffe b18 <halt>  1c:56000050 undefined  20:56000054 undefined


pc(program counter)=当前执行指令地址+8

ARM架构CPU是按流水线进行执行的:

当前执行地址A的地址
已经在对地址A+4的指令进行译码

已经在读取地址A+8的指令


得到的led_on.bin文件用UtraEdit打开:


bin文件中含有机器码

原创粉丝点击