Trongchương5chúngtađãnóiđên cácleơnhdịchmàchúngcótheơdùngđeơ nhađnvàchiavớiheơsô2.Trongchươngnàychúngtasẽnóiđêncácleơnhnhađnvà chiamoơtsô bâtkỳ.
khácnhau dođócó leơnhnhađncódâuvàleơnhnhađn khođngdâu.
Moơttrongnhữngứngdúngthườngdùngnhâtcụaleơnhnhađnvàchialà thực hieơncácthaotácnhaơpxuâtthaơpphađn.Trongchươngnàychúngtasẽviêtthụtúc chonhaơpxuâtthaơpphađnmàchúngđượcsửdúngnhieăutrongcáchốtđoơngxuât nhaơptừngốivi.
6.1 LeơnhMULvàIMUL
Nhađncódâuvànhađnkhođngdâu
Trongphépnhađn nhịphađn sôcódâuvàsôkhođngdâuphạiđượcphađnbieơt moơtcáchrõràng.Vídúchúngtamuônnhađnhaisô8bit 1000000và1111111. Trongdieêndịchkhođngdâu,chúnglà128và255.Tíchsôcụachúnglà32640= 0111111110000000b.Trongdieêndịchcódâu,chúnglà-128và-1.Dođótíchcụa chúnglà 128=0000000010000000b.
Vìnhađn có dâuvàkhođngdâu dănđêncáckêtqụakhácnhauneđncó 2leơnh nhađn:
MUL(multiply)nhađn khođngdâu IMUL(integermultiply)nhađncódâu
Cácleơnhnàynhađn2toánhángbytehoaịctừ.Nêu2toánhángbyteđượcnhađn vớinhauthìkêtqụalàmoơttừ16bit.Nêu2toánhángtừđượcnhađnvớinhauthìkêt qụalàmoơtdoubletừ32bit.Cúphápcụachúnglà:
MUL source ; IMUL source ;
Toánhángnguoănlàthanhghihoaịcvịtrínhớnhưngkhođngđượclàmoơthaỉng
Phépnhađnkieơubyte
Đôivớiphépnhađn màtoánhánglàkieơubytethì AX=AL*SOURCE ;
Phépnhađnkieơutừ
Đôivớiphépnhađn màtoánhánglàkieơutừ thì DX:AX=AX*SOURCE
Chương 6 : Leơnh nhađn và chia 69
Aûnhhưởngcụacácleơnhnhađnleđncáccờ.
SF,ZF,AF,PF:khođngxácđịnh
sauleơnhMUL CF/OF=0nêunửatređncụakêtqụa(DX)baỉng0 =1 trongcáctrườnghợpkhác
sauleơnhIMUL CF/OF=0nêu nửatređn cụakêtqụacóbitdâu giôngnhưbitdâucụanửathâp. =1trongcáctrườnghợpkhác
Sauđađychúngtasẽlâyvàivídú.
Vídú1:GiạsửraỉngAX=1và BX=FFFFh
INSTRUCTIONDecproduct HexProduct AH AL CF/OF
MUL BL 128 7F80 7F 80 1
IMULBL 128 0080 00 80 1
INSTRUCTIONDecproduct HexProduct DX AX CF/OF MUL CX 16776960 00FFFF00 00FF FF00 1 IMULCX -256 FFFFFF00 FFFF FF00 0 INSTRUCTIONDecproduct HexProduct DX AX CF/OF
MUL AX 16769025 00FFE001 00FF E001 1 IMULAX 16769025 00FFE001 00FF E001 1 INSTRUCTIONDecproduct HexProduct DX AX CF/OF
MUL BX 4294836225 FFFE0001 FFFE 0001 1
IMULBX 1 00000001 00000 0001 0
INSTRUCTION Decproduct HexProduct DX AX CF/OF MUL BX 65535 0000FFFF 0000 FFFF 0
Ví
dú 2 : GiạsửraỉngAX=FFFFhvàBX=FFFFh Ví
dú 3 : GiạsửraỉngAX=0FFFh Ví
dú 4 : GiạsửraỉngAX=0100hvàCX=FFFFh Ví
dú 5 : GiạsửraỉngAL=80hvàBL=FFh
Chương 6 : Leơnh nhađn và chia 70
6.2 Ưùng dúng đơn giạn cụa leơnh MUL và IMUL
Sauđađychúngtasẽ lâymoơtsôvídúminhhĩavieơcsửdúngleơnh MULvàIMULtrongchươngtrình.
Ví
dú 1:Chuyeơnđốnchươngtrìnhsautrongngođnngữ câpcao thành mã hợpngữ :A=5xA-12xB.GiạsửraỉngAvàBlà2biêntừvàkhođngxạyrasựtràn.
Code:
MOV AX,5 ;AX=5 IMUL A ;AX=5xA MOV A,AX ;A=5xA MOV AX,12 ;AX=12 IMULB ;AX=12xB SUB A,AX ;A=5xA-12xB
VíDú2:viêtthụtúcFACTORIALđeơtínhN!chomoơtsônguyeđndương.Thụ túcphạichứaNtređnCXvàtrạveăN!tređnAX.Giạsử khođngcótràn.
Giại: ĐịnhnghiãcụaN!là N!=1nêuN=1
=Nx(N-1)x(N-2)x...x1nêuN>1 ThuaơttoánđeơtínhN!nhưsau:
Product=1 Term =N FOR NtimesDO
Product=productxterm term=term-1 ENDFOR Code: FACTORIALPROC ;computesN! ;input:CX=N ;output:AX=N!
MOV AX,1 ;AX=1 MOV CX,N ;CX=N
TOP:
MUL CX ;Product=productxterm
LOOP TOP ; RET
FACTORIALENDP
Chương 6 : Leơnh nhađn và chia 71
6.3 Leơnh DIV và IDIV
Cũngnhư leơnhnhađn,có2leơnhchiaDIVvàIDIVchosôkhođngdâuvàchosô códâu.Cúphápcụachúnglà:
DIV divisor IDIV divisor
Toánhángbyte
Leơnhchiatoánhángbytesẽchiasôbịchia16bit(dividend)tređnAX chosôchia(divisor)là1byte.Divisorphạilà1thanhghi8bithoaịc1bytenhớ .
Thươngsô ởtređnALcònsôdưtređnAH.
Toánhángtừ
Leơnhchiatoánhángtừ sẽchiasôbịchia32bit(dividend)tređn DX:AXchosôchia(divisor)là1từ .Divisorphạilà1thanhghi16bithoaịc1từ nhớ . Thươngsô ởtređnAXcònsôdưtređnDX.
Aûnhhưởngcụacáccờ :cáccờcótrángtháikhođngxácđịnh.
DivideOverflow
Khithựchieơnphépchiakêtqụacótheơkhođngchứahêttređn ALhoaịcAX nêu sôchiabéhơnrâtnhieăuso vớisô bịchia.Trongtrườnghợpnàytređnmànhìnhsẽ xuât hieơnthođngbáo : “ Divide overflow”
Vídú1: Giạsử DX=0000h,AX=0005hvàBX=0002h Vídú1: Giạsử DX=0000h,AX=0005hvàBX=FFFEh Vídú3: Giạsử DX=FFFFh,AX=FFFBhvàBX=0002h
Chương 6 : Leơnh nhađn và chia 72
Instruction DecQuotient DecRemainder AX DX
IDIV BX -2 -1 FFFE FFFF