[英]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)如果您要調試它,則調試器應能夠向您顯示ah
, al
當前值。 盡管它可能顯示ax
六進制形式,並且您不了解六進制數,所以對於您來說,這可能又是另一件事。
2)您缺少“位”點。 al
是8位信息,這意味着它可以包含2 8條不同的信息。 由於每個位可以是0
或1
(兩個選項),並且您有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(數值256
在ax
被分割為1
: 0
在ah
: al
, 255
被分割為0
: 255
)。 如果將值h
: l
放入ah
: al
,則ax
值為256*h + l
。
在調試器中,您可能會讀到: ax 01B8
。 十六進制格式具有此整潔的功能,每個數字正好是4位長。 0
= 0000
, 1
= 0001
, B
(11十進制)= 1011
, 8
= 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
版本中, AH
為0
。 movzx ax,bh
或xor ah,ah
可以將bh
的8位值零擴展為16位ax
。 (上面解釋了DIV和編碼為ASCII的結果)
最后,您首先顯示digit1,但是digit1是什么? 保留除以原始值的10。 因此,對於440,你一不小心就會輸出0
, 4
, 4
, 0
(當然,不會像digit1-2-3-4的內容是不正確的),恰似440,但以相反的順序。 嘗試22 * 49 = 1078進行調試(如果您的代碼將產生正確的digit#值,則它將打印8701)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.