2012-03-05 66 views
0

我試圖學習x86程序集調試,並試圖調試我的簡單C程序。然而,我很困惑,有多大的值(如字符串)存儲在內存中。例如,假設我將字符串VEQ9SZ9T8I62ZCIWE6RKZDE6AZSI2存儲在寄存器EBX中的地址0012E965處,然後查看該地址處的十六進制轉儲,我如何知道它結束的位置?假設我沒有在該位置存儲好的ASCII字符串,我怎麼知道十六進制轉儲在哪個地址結束?正如你所看到的,我在組裝時是個初學者,所以我感謝大家的耐心和幫助。裝配十六進制轉儲

+1

你是什麼意思的「結束」? – harold 2012-03-05 18:28:46

+0

我的意思是一個值的開始從地址X開始,但是我知道它在十六進制轉儲中的結束位置嗎? – 2012-03-05 19:06:26

回答

5

這主要是一個解釋問題。字符串(或內存中的任何數據)是如何解釋的(不奇怪)是由解釋它的一些代碼定義的。從查看數據的十六進制轉儲,你不能說哪種方法被用來創建字符串,但有可能是,使用了一種常用的方法。零終止的字符串很容易被拖尾零識別,有些字符串可能以字節或字符長度爲前綴。尺寸也可能不在數據存儲器中編碼,而是作爲程序內部的立即值輸入。

+0

因此,我無法確定某個值(例如字符串或數字)在十六進制轉儲中的結束位置? – 2012-03-05 19:20:28

+2

正確的是,沒有_definite_方法,而不需要查看解釋它的代碼。在很多情況下,你可以做出相當不錯的猜測,字符串是最簡單的。 – 2012-03-05 19:31:37

+0

啊謝謝你的幫助。 – 2012-03-05 19:34:59

2

取決於存儲或生成字符串的人。如果它是由彙編程序或C程序/庫生成的,則很可能是C字符串。

爲了存儲串有在一些可能性:

  • 使用終止0字符,又名C字符串。要確定字符串的長度,您必須調用一個函數,如strlen。在這種情況下,字符串在第一個0字符處結束。

  • 在開始時將字符串的長度存儲在單獨的變量中。長度變量可以是字節,16位,32位或64位寬度。

  • 存儲字符串的長度和指向全局內存池中地址的指針。

此外,還有變種用於存儲寬字符,UTF-8等,以及所有內容之間的混合。作爲彙編程序員,它取決於你在內部使用什麼。使用操作系統可以使用的格式(如文件名中的格式)或者您希望使用的程序或庫通用的格式是有意義的。所以C字符串在彙編程序中可能是最常見的。

+0

因此,我可以通過在十六進制轉儲中查找00來查找任何存儲值的末尾(無論是字符串還是其他任何值)? – 2012-03-05 19:05:32