簡體   English   中英

如何將2的數字相乘並形成4的數字然后顯示呢?

[英]How can i multiply 2 number together and form 4 digit and then display it?

所以程序開始如下:

.data
num db 22
multiplier db 20
divide db 10
digit1 db ?
digit2 db ?
digit3 db ?
digit4 db ?
.code
MOV AL,num
MUL multiplier
;----22 x 20 = 440
MOV BH,AH
;----AH stores 04?? AL stores 40?
;----40
DIV divide
MOV digit1,AH
MOV digit2,AL
;----04
MOV AL,BH
DIV divide
MOV digit3,AH
MOV digit4,AL

;---display
MOV AH,02H
MOV DL,digit1
INT 21H
;---same for digit2,3,4

程序輸出的是一堆十六進制數字。 有人可以告訴我如何存儲3位數字或4位數字。 它存儲在AX還是AL中?

為什么你覺得ah可能是04 al 40?

我問有兩個原因。

1)如果您要調試它,則調試器應能夠向您顯示ahal當前值。 盡管它可能顯示ax六進制形式,並且您不了解六進制數,所以對於您來說,這可能又是另一件事。

2)您缺少“位”點。 al是8位信息,這意味着它可以包含2 8條不同的信息。 由於每個位可以是01 (兩個選項),並且您有8位,所以位置很重要。 如果您要檢查組合理論,則所有可能組合的“二乘冪提高到八分之一”,即256。現在,這些組合最常用作二進制數,當被視為0到255之間的數字時(請檢查二進制形式以查看如何將位模式分配給特定數字,這是合乎邏輯的,每個位代表2的冪之一,就像在我們的十進制格式中,每個數字代表10的特定冪一樣。

您可能會想到的所有胡言亂語,請告訴我該錯誤。 根據您的邏輯,數字100將在ah:al之間分配為01:00。 因此, al最大數量將為99。這浪費了3/5的可能組合(最多255)。

440以二進制(位)編碼為: 0000 0001 1011 1000 ,前8位在ah ,等於1 ,其他8位在al ,那些等於(440-ah * 256)=(440-1 * 256)= 184(數值256ax被分割為10ahal255被分割為0255 )。 如果將值hl放入ahal ,則ax值為256*h + l

在調試器中,您可能會讀到: ax 01B8 十六進制格式具有此整潔的功能,每個數字正好是4位長。 0 = 00001 = 0001B (11十進制)= 10118 = 1000 因此,前兩位數字是ah內容,其他兩位數字是al內容。

閱讀有關位,字節的更多信息,並進行一些數學練習,以完全掌握二進制<->十進制<->八進制<->十六進制之間的轉換是如何工作的,只需手動計算幾次即可。 特別是在ASM中進行編程時,特別是從頭開始進行一些基本的dec <-> bin / hex數學運算非常方便,例如,當您將寄存器的內容視為位掩碼而不是數字時,通常更容易記下該值的十六進制形式,而不是將所有設置的位重新計算為小數並求和。


現在回到您的代碼(每段都是錯誤描述,或者至少是非常強烈的代碼風格建議,如果您希望我再次查看您的源代碼,則應該遵循)。

我想這是MASM或TASM。 我不喜歡mov al,num ,它掩蓋了您實際上正在獲取內存而不是地址的事實。 mov al,[num]是CPU中發生的情況的更精確定義。 即使在TASM中,您也可以這樣寫(當需要時,數據大小由byte ptr [...]指定。

div byte ptr [mem8]划分ax在[mem8]值,你的情況,你把440 10.這將產生0余成ah ,和商44到al “錯誤”不是在指令本身中,而是在您的期望中。 您將ah存儲為digit1 ,但它不是字體數字,而是從0到9的值數字。要將其轉換為字體字形,需要ASCII編碼的數字。 您必須將其轉換為ASCII編碼(檢查ASCII表以查看哪個字形具有什么代碼)。 因此, add ah,30h將修復digit1。

如您所見,Digit2完全關閉,0到9范圍內的數值甚至都不是44,因此無法將其轉換為一位數字,您必須重復整個過程,但是這次從低10的一個順序開始(因此將ax設為44,而不是440)。 然后將其重寫為循環。

MOV AL,BH DIV divide -現在您將ax除以字節10 ,而未設置AH 在digit1冒險之后,它可以包含任何內容,幸運的是,在您的AH版本中, AH0 movzx ax,bhxor ah,ah可以將bh的8位值零擴展為16位ax (上面解釋了DIV和編碼為ASCII的結果)

最后,您首先顯示digit1,但是digit1是什么? 保留除以原始值的10。 因此,對於440,你一不小心就會輸出0440 (當然,不會像digit1-2-3-4的內容是不正確的),恰似440,但以相反的順序。 嘗試22 * 49 = 1078進行調試(如果您的代碼將產生正確的digit#值,則它將打印8701)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM