2015-10-14 47 views
0

一個字符串表示爲一個char數組。例如,如果我在地址0x80000000處有一個字符串「abcdef」,是否正確?如何在IA32程序集中表示一個字符串?

0x80000008 
0x80000004: 00 00 46 45 
0x80000000: 44 43 42 41 

(在棧,它生長下來,我有地址減少)

+0

是的。但是,不要問這裏,通過詢問C編譯器的彙編程序輸出(如果使用[GCC](http://gcc.gnu),可以檢查gcc -Wall -fverbose-asm -O')。 org /)或通過查看調試器('gdb') –

+2

這不是彙編,這只是一個內存轉儲 –

+0

嗯,所以41的地址是0x8000000,而44的地址是0x80000003? –

回答

4
  1. 較低的地址總是先 - 即使是在堆棧中。所以你的例子應該是:

    80000000: 41 42 43 44 
    80000004: 45 46 00 00 
    
  2. 你的例子實際上是字符串:「ABCDEF」。字符串 「ABCDEF」 應該是:

    80000000: 61 62 63 64 
    80000004: 65 66 00 00 
    

另外,在存儲器轉儲,默認基數爲16(十六進制),所以 「0X」 是多餘的。請注意,字符代碼也是十六進制的。例如,字符串 「JKLMNOP」 將是:

80000000: 4A 4B 4C 4D 
    80000000: 4E 4F 50 00 
  • 無字符串通常放置在棧中。只在數據存儲器中。有時在堆棧中放置指向字符串的指針,即字符串的起始地址。

  • 你的(和我的)例子涉及所謂的ASCII編碼。但有很多可能的character encoding方案。例如EBCDIC也使用8位代碼,但不同於ASCII。

  • 但是,8位代碼不是強制性的。例如UTF-32使用32位代碼。此外,固定代碼大小並不是強制性的。 UTF-8使用1到6個字節的可變代碼大小,具體取決於編碼的字符。

    +0

    在棧協議,它向下增長(當推動地址被減去時),因此地址更高,在這種情況下應該如何考慮? –

    +0

    而且棧也是內存權利的一部分(虛擬內存)? –

    +0

    1.我總是喜歡假設內存有開始(地址0)和結束(地址fffff ...),開始位於屏幕/工作表的頂部,結束位於底部,堆棧實際上不增長(好吧,它會增長,但它是一個副作用,而不是重要的T)。棧頂,向後移動 - 朝向較低地址。堆棧開始位於內存的底部。 :) 2.堆棧當然是內存,但作爲一個堆棧它有一些特殊用途,並且字符串數據通常不會被放置在堆棧本身中。 (局部變量是另一次談話的特例)。 – johnfound

    0

    這實際上並不是組裝。你可以通過運行gcc-S來得到一個例子。傳統上在x86彙編中,你會聲明一個標籤後跟一個字符串,該字符串將被聲明爲db(數據字節)。如果它是C風格的字符串,則會跟着db 0。現代彙編器有一個asciiz類型,可以自動添加零字節。如果它是一個Pascsl樣式的字符串,它將在其前面是一個包含其大小的整數。這些將在內存中連續佈局,並且您將通過使用標籤來獲取字符串的地址,這與您如何從標籤中獲取分支目標的地址類似。

    您將使用哪個選項取決於您將要使用的選項。如果你傳遞給C標準庫函數,你可能需要一個C風格的字符串。如果您打算使用write()send()來編寫它,並將其複製到具有邊界檢查的緩衝區中,則可能需要顯式地存儲其長度,即使系統或庫調用不再使用該格式。好的,安全的代碼也不應該使用strcpy()。但是,您可以同時存儲長度和空字符串。

    MS-DOS使用的一些舊代碼字符串以$結尾,這是一種從CP/M複製的與Z80上的8位代碼兼容的約定。在操作系統中有一大堆這些遺留物直到Windows ME。

    相關問題