793 00010cfc <main>:
794 10cfc: e92d4800 push {fp, lr}
795 10d00: e28db004 add fp, sp, #4
796 10d04: e24dd008 sub sp, sp, #8
797 10d08: e3a03000 mov r3, #0
798 10d0c: e50b3008 str r3, [fp, #-8]
799 10d10: e51b3008 ldr r3, [fp, #-8]
800 10d14: e2833001 add r3, r3, #1
801 10d18: e50b3008 str r3, [fp, #-8]
802 10d1c: e59f3040 ldr r3, [pc, #64] ; 10d64
<main+0x68>
803 10d20: e5933000 ldr r3, [r3]
804 10d24: e51b2008 ldr r2, [fp, #-8]
805 10d28: e0823003 add r3, r2, r3
806 10d2c: e50b3008 str r3, [fp, #-8]
807 10d30: e59f3030 ldr r3, [pc, #48] ; 10d68
<main+0x6c>
808 10d34: e3a02014 mov r2, #20
809 10d38: e5832000 str r2, [r3]
810 10d3c: e59f3028 ldr r3, [pc, #40] ; 10d6c
<main+0x70>
811 10d40: e3a0201e mov r2, #30
812 10d44: e5832000 str r2, [r3]
813 10d48: e59f0020 ldr r0, [pc, #32] ; 10d70
<main+0x74>
814 10d4c: e51b1008 ldr r1, [fp, #-8]
815 10d50: eb001917 bl 171b4 <_IO_printf>
816 10d54: e3a03000 mov r3, #0
817 10d58: e1a00003 mov r0, r3
818 10d5c: e24bd004 sub sp, fp, #4
819 10d60: e8bd8800 pop {fp, pc}
820 10d64: 00097568 .word 0x00097568
821 10d68: 000991b0 .word 0x000991b0
822 10d6c: 000983f4 .word 0x000983f4
823 10d70: 00070944 .word 0x00070944
我想专注于802和820系列。
当我objdump -d ./program
时,有.word
。
它看起来像是指某些单词的地址,但在我的可执行对象文件中没有像0x00097568
这样的地址。
当我使用gdb
时,它会执行类似下面的操作
0x00010d64 <+104>: andeq r7, r9, r8, ror #10
所以,我猜0x00097568
来自那个操作,但0x00097568
是什么意思?
请注意,我在制作可执行对象文件时提供了-static
选项。
这是我的program.c代码
1 #include <stdio.h>
2 int val1=10;
3 int val2;
4 static val3;
5
6 int main() {
7 int a=0;
8 a=a+1;
9 a=a+val1;
10
11 val2=20;
12 val3=30;
13
14 printf("a : %d\n",a);
15 return 0;
16
17 }
答案 0 :(得分:0)
objdump
无法识别您将二进制内容的一部分作为指令进行反汇编,它只是将其显示为32位数据块:
00097568 .word 0x00097568
这就是.word
的含义。您可以看到右侧的值(显示为.word
的)与左侧的值(二进制编码)相同:0x00097568