2011-09-22 31 views
0

計算代碼段的十六進制字節大小的正確方法是什麼?我給出:以十六進制字節計算大小

IP = 0848 CS = 1488 DS = 1808 SS = 1C80 ES = 1F88 

實踐的鍛鍊,我的工作就問什麼是代碼段的大小(以十六進制字節),並給出了以下選擇:

A. 3800 B. 1488 C. 0830 D. 0380 E. none of the above 

正確答案是A. 3800,但我不知道如何計算這個。

+0

什麼是十六進制字節? 1字節= 2個十六進制字節,因爲它們需要兩個字符以十六進制打印? – Thilo

+0

@Thilo我不確定。我一定在課堂上錯過了這一節,因爲我沒有在課堂筆記中看到它。 – raphnguyen

+0

代碼段不應該是數據段的大小嗎?即'0x1808-0x1488 = 0x0380'。 – erikH

回答

1

如何計算長度:

  • 注CS。找到距離它最近的段寄存器,但更大。
  • 取兩者之間的差異,乘以0x10(讀取:在0上的粘性)。

在你的例子中,DS最接近。 1808 - 1488 == 380.和380 x 10 = 3800.

順便說一句,這隻適用於8086和其他類似骨頭的CPU,並且在x86上處於實模式。在x86上的保護模式下(也就是說,除非你正在編寫引導扇區或簡單的DOS程序),段寄存器的值與段的大小無關,因此上面的內容只是簡單的不適用。

+0

謝謝!所有的練習都是在考慮架構8086的情況下完成的。 – raphnguyen

+0

我知道這個問題已經過了幾年了,但坦率地說,我認爲Code Segment的大小是65536字節(或64kb)。如果CS = DS = ES = SS = 2000h(這將是你在微型存儲器模型中看到的),那麼你認爲代碼段的大小是多少? 8086上的任何內容都不會阻止代碼在數據段中執行(如果它們碰巧重疊) –

+0

@MichaelPetch:如果段只是部分重疊,那麼您可能使用了更多語義內存佈局。雖然您可以在8086上執行數據字節,但部分重疊提示您並不真正想要 - 您打算將此時的字節作爲數據(或堆棧)而不是代碼。如果將這些字節視爲代碼段的一部分,即使它們是_technically_,它也會失敗。 – cHao