本文作者:qiaoqingyi

汇编程序编译(汇编程序编译的具体步骤有哪些)

qiaoqingyi 05-09 109

  对齐伪指令ALIGN

  对齐伪指令格式:

  ALIGN Num

  其中:Num必须是2的幂,如:2、4、8和16等。

  伪指令的作用是:告诉汇编程序,本伪指令下面的内存变量必须从下一个能被Num整除的地址开始分配。

  如果下一个地址正好能被Num整除,那么,该伪指令不起作用,否则,汇编程序将空出若干个字节,直到下一个地址能被Num整除为止。

  先看以下代码:

汇编程序编译(汇编程序编译的具体步骤有哪些)

  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

  reset:

  mov r8,#0

  这段代码在编译时不会出现任何问题,但是实际在执行中并不会按照预定的要求执行;

  编译链接后,通过反汇编如下:

  30008000: e1a01000 mov r1, r0

  30008004: e3a0000c mov r0, #12

  30008008: e59f400c ldr r4, [pc, #12] ; 3000801c str1

  3000800c: e59f3018 ldr r3, [pc, #24] ; 3000802c reset+0x6

  30008010: e59f5008 ldr r5, [pc, #8] ; 30008020 str

  30008014: e59f6014 ldr r6, [pc, #20] ; 30008030 reset+0xa

  30008018: e59f7000 ldr r7, [pc, #0] ; 30008020 str

  3000801c str1:

  3000801c: 00001e61 .word 0x00001e61

  30008020 str:

  30008020: 33f80000 .word 0x33f80000

  30008024: 7788 .short 0x7788

  30008026 reset:

  30008026: e3a08000 mov r8, #0

  3000802a: 0000 .short 0x0000

  3000802c: 3000801c .word 0x3000801c

  30008030: 30008020 .word 0x30008020

  通过反汇编我们可以看出,前面所有的指令都是4的倍数,而在reset这个地址处的指令却不是4的倍数,我们知道ARM是32位处理器,如果在ARM指令状态下,所有指令的执行都是按照4的倍数进行执行的,而到reset这个地址处时,发现地址为30008026不是4的倍数,于是就自动归到30008024处执行,当然会出错了。

  在指令出现非对齐情况下,可以在下面插入.align伪指令,如下:

  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

  通过编译后反汇编如下:

  30008000: e1a01000 mov r1, r0

  30008004: e3a0000c mov r0, #12

  30008008: e59f400c ldr r4, [pc, #12] ; 3000801c str1

  3000800c: e59f3018 ldr r3, [pc, #24] ; 3000802c reset+0x4

  30008010: e59f5008 ldr r5, [pc, #8] ; 30008020 str

  30008014: e59f6014 ldr r6, [pc, #20] ; 30008030 reset+0x8

  30008018: e59f7000 ldr r7, [pc, #0] ; 30008020 str

  3000801c str1:

  3000801c: 00001e61 .word 0x00001e61

  30008020 str:

  30008020: 33f80000 .word 0x33f80000

  30008024: 7788 .short 0x7788

  ...

  30008028 reset:

  30008028: e3a08000 mov r8, #0

  3000802c: 3000801c .word 0x3000801c

  30008030: 30008020 .word 0x30008020

  加上.align汇编语句后,指令就对齐!

  .align $

  原文链接:https://www.eeworld.com.cn/mcu/article_2016041525728.html

阅读
分享