2010-11-10 50 views
5

我想明白了一點代碼:寄存器是否有任何默認值?

jg 0x00000047 
dec esp 
inc esi 
add [ecx],eax 

什麼是EAX的價值?這些是程序的四個第一句,我不知道是否有默認值,或者前面的句子是否給eax添加了一些東西。

我的操作系統是Linux和可執行由gcc4.3從C源代碼(GCC file.c EXEC)

+1

不是'是',而是'是'。 – leppie 2010-11-10 08:37:08

+0

如果您提供有關您的平臺(操作系統,可執行格式)的一些信息,我確定有人可以告訴您在程序入口點設置了什麼'eax'。 – Edmund 2010-11-10 08:49:10

+0

編輯,謝謝你的建議。 – 2010-11-10 08:55:03

回答

3

某些指令隱式更新寄存器,即使目標未在代碼中明確列出。一些例子:

  • cpuid在EAX,EBX,ECX和EDX
  • loop遞減ECX
  • rep字符串指令改變ECX,EDI和ESI返回值
  • rdmsr變化EAX和EDX
  • muldiv更改eax和edx

還有很多其他的例子。

你不能僅僅通過看到代碼中沒有列出eax而沒有改變它。

即使假設你知道哪些寄存器是由哪些指令,你有一個值的任何擔保的唯一時間影響的是:

  • 您知道的指令更新後
  • 硬件後立即復位

在任何其他時間,您無法對這些值進行假設。

+0

所以我們會說eax有一個隨機的(至少是隨機的)值? – 2010-11-10 08:47:58

+1

@Vaul:是的,我們會 – 2010-11-10 09:38:09

5

依賴於平臺,語言編制,和/或調用約定。但是,在此之前的代碼通常應該將EAX設置爲某個值。 EAX是那些經常修改的寄存器之一,通常不用於保存東西。

該指令看起來有點隨意。特別是,「dec esp」通常是一個巨大的no-no,因爲堆棧應該始終是雙字對齊的。你確定這是實際的代碼嗎?指令字節翻譯成「\ x7fELF」,如果我正確翻譯,這表明這只是Linux程序的頭字節,而不是實際的代碼字節。

+0

我在C中反編譯了一個由我編寫的程序代碼,試圖理解asm代碼,我想他們不是隨機指令。正如我所說的,沒有以前的句子,所以eax可能有一個隨機值。謝謝。 – 2010-11-10 08:52:46

+0

你如何分解代碼?請記住,可執行文件很少只是原始代碼。 (我知道的唯一格式是.com文件,而這些文件已經過時了10年以上。)在大多數32位操作系統中,可執行文件的格式完全有點複雜。 – cHao 2010-11-10 08:59:19

+0

使用x86dis,可以嗎?如果x86dis知道如何反彙編一個ELF程序,可能是 – 2010-11-10 09:06:45

2

它似乎不是有效的代碼。你確定這不是文字嗎?

解碼它作爲32位的x86給人串ELF

00: 7F 45 // 0x7F E 
02: 4C  // L 
03: 46  // F 
04: 01 01 // ?? ?? 

嘗試打開該文件爲ELF文件,而不是像剛纔二進制。

4

我想你真正在問的是calling convention,它描述了程序中的子程序如何相互傳遞信息,操作系統如何將信息傳遞給程序,一般來說不同的寄存器應該是什麼意思。

例如,大多數C編譯器使用的cdecl calling convention on the x86表示,當一個函數返回時,返回值會在eax寄存器上。所以如果你有一個函數int foo(),你知道在foo執行它的ret操作碼之後,eax將包含那個foo返回的int。相反,PowerPC處理器(通常)具有(至少)32個寄存器,簡稱爲r0,r1,...,r31。該芯片的The AIX calling convention表示堆棧指針在r1上傳遞,函數參數在r3到r11上傳遞,返回值在r3上返回,依此類推。

重要的是要記住,調用約定有點像程序中的函數或庫之間的協議。它不是硬件或法律的一部分,通常有許多不同的調用約定可用於平臺。這就是爲什麼有時候你會看到這樣

struct CFoo { void __stdcall method(); }; 

這是MSVC的指令,通常喜歡用fastcall約定,告訴它使用不同的約定對於一個功能代碼。這很重要,如果例如該函數是在由其他編譯器構建的庫中定義的,該編譯器使用stdcall代替。當我們談論操作系統如何將信息傳遞給程序(或硬件到操作系統)時,我們通常將其稱爲ABI而不是調用約定,但它是相同的想法。所以對於你的程序來說,它的編寫假設操作系統會在eax上傳遞一些特定的信息。這個假設對於操作系統,編譯器甚至個別程序都是特別的。

+0

非常感謝,這給我一個理解ASM的好點。 – 2010-11-10 09:13:09

相關問題