int a[4] = {0x00000001, 0x55226677, 0x68491247, 0x00000048} ;
int *p = a;
如果指令寻址方式确定的地址不是字对齐的,则从内存中读出的数值要进行循环右移操作,移位的位数为寻址方式确定的地址的 bits[1:0] 的 8 倍。这样对于 little-endian (小端模式),指令要读取的字节数句放在目标寄存器的低 8 位。
#include <stdio.h>
main()
{
int a[4] = {0x00000001, 0x55226677, 0x68491247, 0x00000048} ;
int *p = a;
int i;
p = p + 1;
i = 0xaa; /*方便观察所设语句*/
(char *)p = (char *)p + 1;
i = *p;
return (0);
}
Breakpoint 1, main () at test.c:11
11 i = *p;
(gdb) disas
Dump of assembler code for function main:
0x8380 <main>: mov r12, sp
0x8384 <main+4>: stmdb sp!, {r11, r12, lr, pc}
0x8388 <main+8>: sub r11, r12, #4 ; 0x4
0x838c <main+12>: sub sp, sp, #24 ; 0x18
0x8390 <main+16>: ldr r3, [pc, #72] ; 0x83e0 <main+96>
0x8394 <main+20>: sub r12, r11, #28 ; 0x1c
0x8398 <main+24>: ldmia r3, {r0, r1, r2, r3}
0x839c <main+28>: stmia r12, {r0, r1, r2, r3}
0x83a0 <main+32>: sub r3, r11, #28 ; 0x1c
0x83a4 <main+36>: str r3, [r11, -#32]
0x83a8 <main+40>: ldr r3, [r11, -#32]
0x83ac <main+44>: add r3, r3, #4 ; 0x4
0x83b0 <main+48>: str r3, [r11, -#32]
0x83b4 <main+52>: mov r3, #170 ; 0xaa /*方便观察所设语句*/
0x83b8 <main+56>: str r3, [r11, -#36]
0x83bc <main+60>: ldr r3, [r11, -#32]
0x83c0 <main+64>: add r3, r3, #1 ; 0x1
0x83c4 <main+68>: str r3, [r11, -#32]
0x83c8 <main+72>: ldr r3, [r11, -#32]
0x83cc <main+76>: ldr r3, [r3]
0x83d0 <main+80>: str r3, [r11, -#36]
0x83d4 <main+84>: mov r3, #0 ; 0x0
---Type <return> to continue, or q <return> to quit---
0x83d8 <main+88>: mov r0, r3
0x83dc <main+92>: ldmdb r11, {r11, sp, pc}
0x83e0 <main+96>: andeq r8, r0, r4, lsr r4
End of assembler dump.
(gdb) x/3wx 0xbffffe98
0xbffffe98: 0x55226677 0x68491247 0x00000048
(gdb) x/3wx 0xbffffe99
0xbffffe99: 0x47552266 0x48684912 0xc8000000
0x83c8 <main+72>: ldr r3, [r11, -#32]
0x83cc <main+76>: ldr r3, [r3]
0x83d0 <main+80>: str r3, [r11, -#36]
(gdb) info registers r3
r3 0x77552266 2002068070
欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) | Powered by Discuz! X3.2 |