我還是新的彙編,我還不知道彙編中的許多命令代碼。我想在一個16位寄存器中進行除法。我想打印它的內容。我知道我需要將寄存器的內容轉換爲ASCII碼才能進行打印,但我的問題是分割。請幫幫我。彙編:16位部門
例如,cx的內容是2012(整數)。我該怎麼辦?
mov ax, cx
mov bx, 1000
idiv bx
上面的代碼是錯誤的,對不對?
我還是新的彙編,我還不知道彙編中的許多命令代碼。我想在一個16位寄存器中進行除法。我想打印它的內容。我知道我需要將寄存器的內容轉換爲ASCII碼才能進行打印,但我的問題是分割。請幫幫我。彙編:16位部門
例如,cx的內容是2012(整數)。我該怎麼辦?
mov ax, cx
mov bx, 1000
idiv bx
上面的代碼是錯誤的,對不對?
編輯:我注意到這是簽署分部idiv
,回答相應編輯。
上面的代碼在一個方面是錯誤的:ax
沒有符號擴展到dx:ax
。
只需在idiv bx
之前添加cwd
(將字轉換爲雙字),然後它是正確的。商數爲ax
,其餘數字爲dx
。
退房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寄存器關每個和它是完全一樣的
因此,對於OP的要求,他/她只需要零EDX/DX? –
@MartinJames是的,如果他們只是將16位數字除以16位數字。 – Earlz
由於我們使用「idiv」而不是「div」,「cwd」(將ax擴展爲dx)可能會更好... –
謝謝。順便說一句,在打印字符在這裏,有可能使用mov dx,而不是mov dl,,因爲我正在處理16位的權利? –
shriekyphantom
如果你將'dh'歸零,那麼是的。所以'mov dx,'a''和'mov dh,0; mov dl,'a''產生相同的寄存器值並且不改變標誌。 – nrz
哦。好的。謝謝你的清理。 :) – shriekyphantom