2017-08-06 72 views
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 } 

回答

0

objdump不承認你是拆卸作爲指令的二進制內容的一部分,它只是顯示它,就好像它是一個32位的數據塊:

00097568  .word 0x00097568 

這就是.word的含義。你可以看到右邊的值(.word顯示的值)與左邊的值(二進制編碼)相同:0x00097568

+0

謝謝你的回答!我查看了'objdump -Dslx''address 00097568'包含的內容。現在我知道00097568是.data節中的地址。但我仍然不知道他們爲什麼要做'andeq r7,r9,r8,ror#10'來獲取00097568. gcc編譯器是否通過andeq選擇全局變量地址?這是一種機制嗎? –

+1

@ doosol-Lee否,計算機中的值以位(0和1)編碼。一個「字」是32位,它是ARM CPU中的基本工作值。這些指令也以32位值的形式存儲在內存中(單指令= 1字,因爲ARM具有固定指令大小架構的RISC)。所以你可以在內存中定義任何隨機的32位值,如果你強制反彙編器反彙編它,它會產生一個非常可能的有效指令,就像在這種情況下'gcc'確實需要值'00097568'指向'。數據「段,將其計算爲地址,不知道產生了」andeq「。 – Ped7g

+0

@ doosol-Lee你也可以在這裏查看即將被刪除的文檔[機器代碼](https://stackoverflow.com/documentation/assembly/1358/getting-started-with-assembly-language/8901/machine-code #t = 201708060832436519976),也許它會更有意義。順便說一句,你可能會問,爲什麼海灣合作委員會確實需要記憶中的這個價值作爲單詞,並且令人驚訝地與上面的評論有關。由於指令編碼只有32位,所以不能在單個字中對寄存器x = 32位值進行編碼(該值將佔用所有位,沒有剩餘位用於指令操作碼)。在ARM上,編譯器通常會從內存中加載值。 – Ped7g

相關問題