微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM汇编语言(4) 指令、伪操作、伪指令学习

ARM汇编语言(4) 指令、伪操作、伪指令学习

时间:11-10 来源:互联网 点击:

(1)为LDR伪指令生成的代码,似乎有问题,不是基于PC的值,还是有默认的规则?

使用GNU ARM Assembly将上面的代码重新实现一次:

.section .text
.global _start
_start:
LDR r0, =src
LDR r1, =dst
LDR r2, =1000
LDR r3, =5555

MOV r4, r2
MOV r5, r3

.section .data
src: .word 0, 0
dst: .word 0, 1

编译通过了,不确定代码有没有问题,后面再检查

将上面的代码使用arm-none-eabi-as编译不链接,然后使用arm-none-eabi-objdump反汇编:

Disassembly of section .text:

00000000 <_start>:
0: e59f0010 ldr r0, [pc, #16] ; 18 <_start+0x18>
4: e59f1010 ldr r1, [pc, #16] ; 1c <_start+0x1c>
8: e3a02ffa mov r2, #1000 ; 0x3e8
c: e59f300c ldr r3, [pc, #12] ; 20 <_start+0x20>
10: e1a04002 mov r4, r2
14: e1a05003 mov r5, r3
18: 00000000 andeq r0, r0, r0
1c: 00000008 andeq r0, r0, r8
20: 000015b3 strheq r1, [r0], -r3

诚如文档中对LDR的介绍:

LDR r0, =src
LDR r1, =dst
LDR r2, =1000
LDR r3, =5555

这四条命令都进行了处理,以LDR r0, =src为例:

0: e59f0010 ldr r0, [pc, #16] ; 18 <_start+0x18>

src的值被存储,ldr指令将[pc, #16]地址中的值加载到寄存器r0中,

ARM处理器中,pc的值为当前执行的指令的地址值加上8,因此,执行该条

指令时,pc的值为8,此时pc加上16,则为十进制的24,十六进制的

0x18,但是此时地址单元0x18中存储的却是一条指令:

andeq r0, r0, r0

为什么?

将之前编译生成的.o文件使用arm-none-eabi-ld进行连接,生成可执行文件,

然后反汇编,此时代码变为:

Disassembly of section .text:

00008000 <_start>:
8000: e59f0010 ldr r0, [pc, #16] ; 8018 <_start+0x18>
8004: e59f1010 ldr r1, [pc, #16] ; 801c <_start+0x1c>
8008: e3a02ffa mov r2, #1000 ; 0x3e8
800c: e59f300c ldr r3, [pc, #12] ; 8020 <_start+0x20>
8010: e1a04002 mov r4, r2
8014: e1a05003 mov r5, r3

8018: 00010024 andeq r0, r1, r4, lsr #32
801c: 0001002c andeq r0, r1, ip, lsr #32
8020: 000015b3 strheq r1, [r0], -r3

此时,src的值应该存放在0x8000 + 8 + 16,8和16都是十进制的,因此应该是0x8018,

但是0x8018地址单元中为:

andeq r0, r1, r4, lsr #32

lsr在上一篇寻址方式中有所介绍,此时r4中的值通过上面的指令可知为十进制的1000,十六进制的0x3E8,

0x3E8的二进制:

0000 0000 0000 0000 0000 0011 1110 1000,执行lsr #32操作,右移32位,则变为0,

r1中此时不管是什么值,AND指令执行按位取与操作,指令的执行结果自然是0,存放到r0寄存器中?

此处应该是个pool?为什么是指令?

(2)$a、$d分别表示什么意思?

摘录自:Using asThegnuAssembler的Mapping Symbols章节

The ARM ELF specification requires that special symbols be inserted into object files to
mark certain features:
$a At the start of a region of code containing ARM instructions.
$t At the start of a region of code containing THUMB instructions.
$d At the start of a region of data.

待补充...

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top