本文是基于韦东山视频的学习笔记
勘误
在前一篇的博文中,代码有一个地方敲错了。
.text
.golbal _start
_start:
LDR R1, =0x56000050
LDR R0, =0x0100
STR R0, [R1]
LDR R1, =0x56000054
LDR R0, =0x0010 ;此处应为LDR R0, =0
STR R0, [R1]
halt:
b halt
汇编分解
LDR R1, =0x56000050
这种都是伪指令,意思是实际上,这句话包含了两种指令。想仔细研究汇编,我们先把bin文件反编译一下,得到机器码看一看。
首先在Makefile文件添加上这句脚本
arm-linux-objdump -D nLED1.elf > nLED1.dis
执行后得到nLED1.dis
nLED1.dis
nLED1.elf: file format elf32-littlearm
Disassembly of section .text:
00000000 <_start>:
0: e59f1014 ldr r1, [pc, #20] ; 1c <halt+0x4>
4: e3a00c01 mov r0, #256 ; 0x100
8: e5810000 str r0, [r1]
c: e59f100c ldr r1, [pc, #12] ; 20 <halt+0x8>
10: e3a00000 mov r0, #0
14: e5810000 str r0, [r1]
00000018 <halt>:
18: eafffffe b 18 <halt>
1c: 56000050 undefined instruction 0x56000050
20: 56000054 undefined instruction 0x56000054
Disassembly of section .ARM.attributes:
00000000 <.ARM.attributes>:
0: 00001941 andeq r1, r0, r1, asr #18
4: 61656100 cmnvs r5, r0, lsl #2
8: 01006962 tsteq r0, r2, ror #18
c: 0000000f andeq r0, r0, pc
10: 00543405 subseq r3, r4, r5, lsl #8
14: 01080206 tsteq r8, r6, lsl #4
18: Address 0x00000018 is out of bounds.
可以看到 LDR R1, =0x56000050 这一句指令分成了 ldr r1, [pc, #20]
其中,pc是程序寄存器。
具体详细的汇编不打算详写,具体可以看韦东山视频新一期的第八课第四节。