2012-03-23 72 views
1

學習指南問題:我不知道將它寫入16位和32位之間有什麼區別。有人可以澄清這是如何改變的事情嗎?16bit/32bit x86

編寫一個80x86彙編程序,它將在內存中添加字符大小的帶符號整數,並在看到零時停止。總和將總是大於-32768並小於32767. 總和應寫入內存。如果整數字符串中只有一個零,則總共放置一個0 。使用JNZ命令。 (如果最後的操作導致零跳轉到標籤)

16bit 整合DW 2,-300,54,30,8, - 240,0 總DW?

32bit 整合WORD 2,-300,54,30,8, - 240,0 總WORD?

+1

我不明白爲什麼我有時會收到-1。這是一個完全合法的問題:在x86中編程時,如何解釋16位和32位之間的區別?有時候這裏的人會迷惑我。 – Aerovistae 2012-03-23 17:26:57

回答

3

有在32位代碼數的差異,而不是16位:

  • 首先,當然,你的寄存器和索引和數據讀取通常是32個位寬。 (你可以用地址大小和操作數大小的前綴來改變它,通常你不會使用地址大小前綴,但是對於讀取16位字的32位代碼,我可以看到使用的操作數大小前綴很漂亮)

  • 32位寄存器的名稱以E開頭,基本上是16位寄存器的擴展名。 (例如,AXEAX低位字。遺憾的是,訪問高位字沒有內置的方式。你必須轉動或移位寄存器獲得的高16位。)

  • 索引也不同。 16位代碼在如何組合寄存器方面的限制更爲有限。你會看到很多[BX+SI],但是IIRC [AX+BX]甚至不合法。它是32位代碼。另外,32位代碼可以縮放第一項(時間1,2,4 ...我忘記是否允許8)。例如,[EBX*4+ECX]

  • 在16位代碼中,寄存器的目的相當嚴格;例如CX是一個計數器,BX基本上是一個基址指針,SI和DI是索引 - 因此它們的名字。與之相反,這往往意味着跳過籃球。在32位代碼中,這顯然是放鬆的;雖然寄存器仍然主要保留其特殊用途,但更靈活的索引可以讓任何免費寄存器作爲索引。

  • 保護模式幾乎總是在。 (有些特殊情況,但它們不再常見,你必須編寫一個DOS遊戲或其他東西才能看到它;每個體面的操作系統都會盡快跳入保護模式。)有一些限制,比如隨之而來的。儘管如此,除非您嘗試執行內核級別的內容,否則大部分對您而言都是不可見的。大多數16位代碼旨在以「實模式」或「虛擬8086」模式運行,其中CPU基本上就像一個非常快速的8086,時髦的尋址和所有操作。

  • 哦,是的,尋址。 16位代碼使用「段」,其中段寄存器(CS,DS等)被簡單地左移4位並添加到「偏移量」以給出20位值(最大值:1MB)。 32位代碼遠不及那個常規,但也遠不止那個有限的;它將段寄存器重新設置爲「選擇器」,它可以指向CPU地址空間中的任何地方,但必須在描述符表(GDT或LDT)中設置。實際上,32位代碼幾乎總是將所有段設置爲指向同一個內存區域。這就是所謂的「平面模型」,是迄今爲止最常見的設置。根據代碼和數據的大小,16位代碼具有六個不同的內存模型。

原始數據的指令/指令通常是相同的; DW仍然通常意味着「這是一個字」,DD意味着「這是一個雙字」,等等。

順便說一下,「x86」和「80x86」通常意味着「32位」 - 主要是因爲術語在32位CPU出現之前並不常見。

-2

彙編代碼不同,生成的目標代碼不同。你的學習指南是史前的,忘記16位,並寫入32位(或64!)。當你的教授說,總和的限制強烈表明16位代碼被請求,說:「只有恐龍記得16位代碼」,(你可能要考慮備份課程:)。

看來我誤解了你的問題?如果學習指南中沒有給出您的選擇,那麼是的,您堅持使用16位指令和舊的16位寄存器 - AX,BX,CX,DX,PC,SP,SI,DI以及可能的段寄存器以及。

我不知道如何實際生成16位代碼,特別是在運行16位代碼時有問題的64位機器上。在32位盒子上,或者使用DosBox等實用工具,您可以運行舊的MASM彙編程序,然後運行可執行文件。

+0

哈哈是的,我也是這麼想的,但我在這裏關心的是*彙編代碼的不同點是什麼? – Aerovistae 2012-03-23 13:32:08

+1

順便說一句,您可以在32位彙編中使用16位指令 - 彙編器在指令中插入前綴以強制執行16位操作。 – 2012-03-23 13:32:39

+0

這確實沒有幫助。 – adelphus 2012-03-23 13:32:53