DIV BX OVERFLOW
6.4 Mở roơng dâu cụa sô bị chia
Phépchiavớitoánháng từ
Trongphépchiavớitoánháng từ,sô bịchiaphạiđaịt tređnDX:AX ngaycạ khisôbịchiacótheơđaịttređnAX.Trongtrườnghợpnày,caănphạisửasốnnhư sau
• ĐôivớileơnhDIV,DXphạibịxoá
• ĐôivớileơnhIDIV,DXphạiđượcmởroơngdâucụaAX.LeơnhCWD(Convert WordtoDoubleword)sẽthựchieơnvieơcnày.
Vídú:Chia-1250cho7
MOV AX,-1250 ;AX=-1250
CWD ;mởroơngdâucụaAXvào DX MOV BX,7 ;BX=7
IDIV BX ;chiaDX:AXchoBX ,kêtqụatređnAX,sôdư ;tređnDX
Phépchiavớitoánhángbyte
Trongphépchiavớitoánháng byte,sô bịchiaphạiđaịt tređn AX ngaycạ khisôbịchiacótheơđaịttređnAL.Trongtrườnghợpnày,caănphạisửasốnnhư sau
• ĐôivớileơnhDIV,AHphạibịxoá
• ĐôivớileơnhIDIV,AHphạiđượcmởroơngdâucụaAL.LeơnhCBW(Convert Byte toDoublebyte)sẽthựchieơnvieơcnày.
Vídú:Chiamoơtsôcódâutrongbiên byte XBYTE cho-7 MOV AL,XBYTE ;ALgiữ sôbịchia
CBW ;mởroơngdâucụaALvào AH MOV BL,-7 ;BX=-7
IDIV BL ;chiaAXchoBL ,kêtqụatređnAL,sôdư ;tređnAH
Khođng có cờ nào bị ạnh hưởng bởi leơnh CWD và CBW .
Chương 6 : Leơnh nhađn và chia 73
6.5 Thụtúc nhaơp xuâtsô thaơpphađn
MaịcdùtrongPCtâtcạsô lieơuđượcbieêu dieêndướidángbinary.Nhưng vieơcbieêudieêndướidángthaơpphađnsẽthuaơntieơnhơnchongườidùng .Trongphaăn nàychúngtasẽviêtcácthụtúcnhaơpxuâtsôthaơpphađn.
Khinhaơpsôlieơu,nêuchúngtagõ21543chẳnghánthìthựcchâtlàchúngta gõvàomoơtchuoêikýtự,beđntrongPC,chúngđượcbiênđoơithành cácgiátrịnhị phađntươngđương cụa21543.Ngượcláikhixuâtsôlieơu,noơidungnhịphađncụa thanhghihoaịc vịtrínhớ phạiđượcbiênđoơithànhmoơtchuoêikýtựbieêudieênmoơtsô thaơpphađntrướckhichúngđượcinra.
Xuâtsôthaơpphađn(DecimalOutput)
ChúngtasẽviêtmoơtthụtúcOUTDECđeơin noơidungcụathanhghiAXnhư làmoơtsônguyeđnthaơpphađncódâu.NêuAX>0,OUTDECsẽinnoơidungcụaAX dướidángthaơp phađn.NêuAX<0,OUTDECsẽ indâutrừ (-),thayAX=-AX (đoơi thànbsôdương)roăiinsôdươngnàysaudâutrừ (-).Nhưvaơylàtrongcạ2trường hợp,OUTDECsẽingiátrịthaơpphađntươngđươngcụamoơtsôdương.Sauđađylà thuaơt toán :
AlgorithmforDecimalOutput
1. IF AX<0 /AXholdoutputvalue/ 2.THEN
3.PRINTaminussign
4.ReplaceAXby itstwo’scomplement 5.END_IF
6.Get thedigits inAX’sdecimalrepresentation 7.Convertthesedigitstocharacters andprintthem.
Đeơhieơuchitiêtbước6 caănphạilàmvieơcgì,chúngtagiạsửraỉng noơidung cụaAXlàmoơtsô thaơpphađn,vídú24618thaơpphađn.Cótheơlâycácdigits thaơp phađncụa24618baỉngcáchchialaịpláicho10dtheothụtúcnhư sau:
Divide 24618by10.Qoutient=2461,remainder=8 Divide 2461by10.Qoutient=246,remainder=1 Divide 246by10.Qoutient=24,remainder=6 Divide 24 by10.Qoutient=2,remainder=4 Divide 2by10.Qoutient=0,remainder=2
Cácdigitsthuđượcbaỉngcáchlâycác sôdưtheotraơttựngượclái. Bước7cụathuaơttoáncótheơthực hieơnbaỉngvòngFORnhưsau:
Chương 6 : Leơnh nhađn và chia 74
FORcounttimesDO
popadigitfromthestack convertittoacharacter outputthecharacter END_FOR
Codechothụtúc OUTDECnhưsau: OUTDEC PROC
;Print AX as asigneddecimalinteger ;input:AX
;output:none
PUSH AX ;saveregisters PUSH BX
PUSH CX PUSH DX
;IF AX<0
OR AX,AX ;AX<0? JGE @END_IF1 ;NO,AX>0 ;THEN
PUSH AX ;saveAX MOV DL,’-’;GET‘-’ MOV AH,2
INT 21H ;print ‘-’ POP AX ;get AX back NEG AX ;AX=-AX @END_IF1:
;getdecimaldigits
XOR CX,CX ;clearCXforcountsdigit MOV BX,10d ;BXhasdivisor
@REPEAT1:
XOR DX,DX ;clearDX
DIV BX ;AX:BX;AX=qoutient ,DX= remainder
PUSH DX ;pushremainderontostack INC CX ;incrementcount
;until
OR AX,AX ;qoutient=0? JNE @REPEAT1 ;nokeepgoing ;convertdigitstocharactersandprint
MOV AH,2 ; printcharacterfunction
Chương 6 : Leơnh nhađn và chia 75
;forcounttimesdo @PRINT_LOOP:
POP DX ;digitsinDL
OR DL,30h ;convertdigittocharacter INT 21H ;printdigit
LOOP @PRINT_LOOP ;end_for
POP DX ;restoreregisters POP CX
POP BX POP AX RET
OUTDEC ENDP