1
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
,它確實像下面在我的可執行文件的objdump中.word的地址是什麼意思?
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 }
謝謝你的回答!我查看了'objdump -Dslx''address 00097568'包含的內容。現在我知道00097568是.data節中的地址。但我仍然不知道他們爲什麼要做'andeq r7,r9,r8,ror#10'來獲取00097568. gcc編譯器是否通過andeq選擇全局變量地址?這是一種機制嗎? –
@ doosol-Lee否,計算機中的值以位(0和1)編碼。一個「字」是32位,它是ARM CPU中的基本工作值。這些指令也以32位值的形式存儲在內存中(單指令= 1字,因爲ARM具有固定指令大小架構的RISC)。所以你可以在內存中定義任何隨機的32位值,如果你強制反彙編器反彙編它,它會產生一個非常可能的有效指令,就像在這種情況下'gcc'確實需要值'00097568'指向'。數據「段,將其計算爲地址,不知道產生了」andeq「。 – Ped7g
@ doosol-Lee你也可以在這裏查看即將被刪除的文檔[機器代碼](https://stackoverflow.com/documentation/assembly/1358/getting-started-with-assembly-language/8901/machine-code #t = 201708060832436519976),也許它會更有意義。順便說一句,你可能會問,爲什麼海灣合作委員會確實需要記憶中的這個價值作爲單詞,並且令人驚訝地與上面的評論有關。由於指令編碼只有32位,所以不能在單個字中對寄存器x = 32位值進行編碼(該值將佔用所有位,沒有剩餘位用於指令操作碼)。在ARM上,編譯器通常會從內存中加載值。 – Ped7g