2011-09-22 412 views
0

我很困惑在以彙編語言聲明變量時如何存儲內存。我的示例代碼塊:彙編語言:內存字節和偏移量

val1 db 1,2 
val2 dw 1,2 
val3 db '12' 

從我的學習指南,它說,在內存中存儲這三個數據定義聲明的數據所需的字節總數爲8個字節(十進制)。我怎麼去計算這個?

它也說val3的數據段的偏移量是6個字節,偏移量5的十六進制字節是00.我失去了如何計算這些字節和偏移量。

另外,讀取VAL1到內存中會產生0102但閱讀VAL3到存儲器中產生3132由3或其中它來自表示撇號?如何將val2讀入內存?

回答

5

您有兩個字節0x010x02。到目前爲止,這是兩個字節。

然後你有兩個單詞,0x00010x0002。這是另外四個字節,迄今爲止有六個字節。

的有兩個多個字節構成「12」的字符,這是0x310x32在ASCII 的(a)。這是另外兩個字節,總計達到八個。

在小尾數格式(這是你在找什麼,在這裏基於內存重視您的問題狀態),它們存儲爲:

offset value 
------ ----- 
    0 0x01 
    1 0x02 
    2 0x01 
    3 0x00 
    4 0x02 
    5 0x00 
    6 0x31 
    7 0x32 

(一)在這種情況下使用的字符集是ASCII(您可以在該鏈接中查看描述該集合中所有字符的表格)。

字節0x300x39是數字09,正如字節0x410x5A代表大寫字母字符。該僞操作:

db '12' 

是說插入字節字符'1''2'

同理:

db 'Pax is a really cool guy',0 

會給你的十六進制轉儲表示:

addr +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +FABCDEF 
0000 50 61 78 20 69 73 20 61 20 72 65 61 6C 6C 79 20 Pax is a really 
0010 63 6F 6F 6C 20 67 75 79 00      cool guy. 
+0

+1表格。但偏移量1的字節應該是2我相信。 – cyco130

+0

@paxdiablo感謝您的幫助表!所以單詞總是被反向讀入內存?你能幫助解釋爲什麼'12'表示爲0x31和0x32? – raphnguyen

+0

@raphnguyen有兩種表示單詞的方法。這個倒退的順序叫做big endian,另一個叫做little endian。 '12'是一個字符串。 0x31和0x32是'1'和'2'的ASCII碼。 – cyco130

3

val1是連續的兩個字節,12db的意思是「直接字節」。 val2是兩個連續的字,即4個字節,也是1和2。在內存中,他們將是1, 0, 2, 0,假設你在一臺大型機器上。 val3是一個兩字節的字符串。 3132以十六進制符號表示49和50,它們是字符「1」和「2」的ASCII碼。

+1

。 – paxdiablo

+0

我聽說過這兩種方式:) – cyco130

+0

@ cyco130感謝您的輸入!這裏有很多有幫助的人。 – raphnguyen