在 ARM920T 处理器中,经过分析上面 strdeq 的指令码格式,这条指令并不能用,可以说是条虚指令,详细了解见下图最后的”注释“说明:
--------------------------------------------------------------------------------
.balignl 是个伪指令,完整的格式为:
.balign[wl] abs-expr, abs-expr, abs-expr
第一个参数是一个整数的绝对值,表示后面的指令对齐在它的倍数地址上。
第二个参数也是个绝对值让你指定要填充的指,随便指定,比如 0x55aa 之类的都可以。此参数可选,如果省略,那么默认就用 0 来填充了。
第三个参数也是可选的,表示为了对齐,最大只能跳过多少个字节;但是如果需要跳过更多的字节,那么这里添加的对齐就无效了。
.balignw 和 .balignl 是 .balign 的变体;它们分别表示填充 2 个字节 (word) 及填充 4 个字节 (long word) 。
那么现在我们修改上面的程序,完完整整的将 .balignl 16 0xdeadbeef 放进去:
复制代码
_start:
b reset
nop
.balignl 16, 0xdeadbeef
reset:
ldr r0, =0x40000000
查看反汇编:
[root@CentOS ARM]# arm-linux-objdump -d aslign2.o
aslign2.o: file format elf32-littlearm
Disassembly of section .text:
00000000 <_start>:
0: ea000002 b 10
4: e1a00000 nop ; (mov r0, r0)
8: deadbeef cdple 14, 10, cr11, cr13, cr15, {7}
c: deadbeef cdple 14, 10, cr11, cr13, cr15, {7}
00000010 <reset>:
10: e3a00101 mov r0, #1073741824 ; 0x40000000
14: e1a00000 nop ; (mov r0, r0)
18: e1a00000 nop ; (mov r0, r0)
1c: e1a00000 nop ; (mov r0, r0)
由上可见,填充了 8 个字节数据,也就是 2 个 0xdeadbeef 。这样, ld r0, =0x40000000 就对齐到 0x10 地址处,0x10 就是 16。