GNU环境下伪操作伪指令的测试

目录

1.伪操作ldr转为指令的验证

测试目标:

测试代码:

测试结果:

结果分析:

2、伪操作ALIGN使用的例子

测试目标:

测试代码:

测试结果:

(1)未使用align伪操作:

(2)使用了align伪操作:

结果分析:


1.伪操作ldr转为指令的验证

测试目标:

(1)理解并熟练运用ARM处理器的伪指令,理解ldr伪指令的功能。

(2)在GNU环境下练习ARM处理器伪指令和伪操作,并学会分析反汇编代码。

测试代码:

start.s

.globl _start

_start:

ldr r0,=0x70000000

orr r0,r0,#0x13

mcr p15,0,r0,c15,c2,4



ldr r0,=0x7e004000

mov r1,#0



str r1,[r0]



ldr r1,=0x7e000020

mov r0,#0x1000

str r0,[r1]



ldr r1,=0x7e000024

mov r0,#0

str r0,[r1]

halt:

b halt

测试结果:

结果分析:

start.txt是start.s反汇编后的文件。我们以当前正在执行的指令作为参考点,也就是以第一条指令为参考点,那么 R15(PC)中存放的就是第三条指令,换句话说就是 R15(PC)总是指向当前正在执行的指令地址再加上 2 条指令的地址。对于 32 位的 ARM 处理器,每条指令是 4 个字节,所以R15 (PC)值 = 当前执行的程序位置 + 8 个字节。

当执行到ldr伪指令时,会在代码末尾开辟一块内存,用来存放不是合法立即数的常数。

11行ldr r0,[pc,#32]中32 是指针指向从当前指令的下两条指令开始的第32个字节的位置,即第22行PC=30的位置。

14行ldr r1,[pc,#24]中24 是指针指向从当前指令的下两条指令开始的第24个字节的位置,即第23行PC=34的位置。

17行ldr r1,[pc,#16]中16 是指针指向从当前指令的下两条指令开始的第16个字节的位置,即第24行PC=38的位置。

2、伪操作ALIGN使用的例子

测试目标:

对齐方式设置ALIGN伪操作通过用0或NOP指令进行填充来使当前位置与指定的边界对齐。

测试代码:

align.s

.globl _start

_start:

 mov r1,r0

    mov r0,#12

    ldr r4,str1

    ldr r3, =str1



    ldr r5,str

    ldr r6,=str

    ldr r7,str



str1:

    .word 7777

str:

    .word 0x33f80000

    .byte 0x88

    .byte 0x77

    .align

reset:

mov r8,#0

测试结果:

利用arm-linux-gcc 生成可执行文件并对生成的可执行文件进行反汇编:

(1)未使用align伪操作:

(2)使用了align伪操作:

结果分析

通过反汇编我们可以看出,前面所有的指令都是4的倍数,而在未使用align伪操作reset这个地址处的指令却不是4的倍数,我们知道ARM是32位处理器,在当前ARM指令状态下,所有指令的执行都是按照4的倍数进行执行的,使用align伪操作的程序反汇编后PC所指地址为00000028,是4的倍数,实现了对齐。

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值