2012-09-12 93 views
4

我還是新的彙編,我還不知道彙編中的許多命令代碼。我想在一個16位寄存器中進行除法。我想打印它的內容。我知道我需要將寄存器的內容轉換爲ASCII碼才能進行打印,但我的問題是分割。請幫幫我。彙編:16位部門

例如,cx的內容是2012(整數)。我該怎麼辦?

mov ax, cx 
mov bx, 1000 
idiv bx 

上面的代碼是錯誤的,對不對?

回答

3

編輯:我注意到這是簽署分部idiv,回答相應編輯。

上面的代碼在一個方面是錯誤的:ax沒有符號擴展到dx:ax

只需在idiv bx之前添加cwd(將字轉換爲雙字),然後它是正確的。商數爲ax,其餘數字爲dx

+0

謝謝。順便說一句,在打印字符在這裏,有可能使用mov dx,而不是mov dl,,因爲我正在處理16位的權利? – shriekyphantom

+0

如果你將'dh'歸零,那麼是的。所以'mov dx,'a''和'mov dh,0; mov dl,'a''產生相同的寄存器值並且不改變標誌。 – nrz

+0

哦。好的。謝謝你的清理。 :) – shriekyphantom

4

退房this reference(搜索IDIV)

IDIV指令將所述64位整數 EDX的內容:EAX(通過查看EDX作爲最顯著四個字節0​​和EAX作爲至少構成重要的四個字節)由指定的操作數 的值。除法的商數結果存儲在EAX中,而其餘部分放在EDX中。語法IDIV IDIV

例子

IDIV EBX - 劃分EDX的內容:由EBX的內容EAX。 將商放在EAX中,其餘部分放在EDX中。 idiv DWORD PTR [var] - 將EDX:EAS的內容除以存儲在 內存位置var的32位值。將商放在EAX中,其餘部分放在EDX的 中。

當然,由於您使用的16位,切斷所有指定的比特值的一半,丟棄E寄存器關每個和它是完全一樣的

+0

因此,對於OP的要求,他/她只需要零EDX/DX? –

+0

@MartinJames是的,如果他們只是將16位數字除以16位數字。 – Earlz

+0

由於我們使用「idiv」而不是「div」,「cwd」(將ax擴展爲dx)可能會更好... –