![]() | 第6章 文字输出与键盘输入 | -149- | |||||||||||||||||||
一个32位的数据,其高16位由DX寄存器保存,低16位由AX寄存器保存。因此使用MUL指令之前应注意保存AH与DX寄存器中的有用数据; 与乘法指令相对的是除法指令: |
|||||||||||||||||||||
![]() |
助记符:DIV(Divide) 用 途:将两个数相除 格 式:DIV 寄存器 DIV 存储单元 执 行:两个数相除,得出商与余数。 |
||||||||||||||||||||
除法指令与乘法指令一样有一些特殊的规定: ① 被除数只能是16位或32位数据,除数只能是8位或16位数据,且16位的被除数只能由8位的数除,而32位的被除数只能由16位的数除。这好象有些不讲理,但是Intel就是这样规定的。 ② 32位的被除数要预先放入DX:AX寄存器中,DX寄存器保存高16位;16位的被除数要预先放入AX寄存器中。32位数除以16数据所得的商由AX寄存器保存,余数由DX寄存器保存;16位数据除以8位数据所得的商由AL寄存器保存,余数由AH寄存器保存。 ③ 与MUL指令一样,DIV指令同样认为相除的两个数都是无符号数,它也不能处理负数。 ④ 除数不能是0。 这第四项似乎是一句废话,其实不然。这一项将引出一个很重要的知识点,这个知识点将在后面的章节中加以介绍。 下面给出了两个试验程序,用于研究乘除法指令的执行过程: |
|||||||||||||||||||||
试验<1> C:\ASM\>DEBUG[Enter] -a100[Enter] 13C6:0100 mov al,3 13C6:0102 mov ah,4 13C6:0104 mul ah 13C6:0106 mov bx,-1 13C6:0109 mul bx 13C6:010B [Enter] |
|||||||||||||||||||||
-g=100 104[Enter] 注意被乘数、乘数均在AX寄存器中 | |||||||||||||||||||||
AX=0403 | BX=0000 | CX=0000 | DX=0000 | SP=FFEE | BP=0000 | SI=0000 | DI=0000 | ||||||||||||||
DS=13C6 | ES=13C6 | SS=13C6 | CS=13C6 | IP=0104 | NV UP EI PL NZ NA PO NC | ||||||||||||||||
13C6:0104 | F6E4 | MUL AH | |||||||||||||||||||
为了计算3x4的值,我们需首先将3放人AL寄存器中,将4放入另一8Bit寄存器中,然后用指令"MUL 寄存器"计算出结果。这个程序特意用AH寄存器保存乘数,主要是想说明运算结果将是一个出现在AX寄存器里的16位的数据。注意我们没给出"MUL 立即数"的用法,这样使用是错误的。 | |||||||||||||||||||||
Copyright © 2004-2015 Reanimator | www.cookmoon.org |