一,寄存器及标志
- AH&AL=AX(accumulator):累加寄存器
- BH&BL=BX(base):基址寄存器
- CH&CL=CX(count):计数寄存器
- DH&DL=DX(data):数据寄存器
- SP(Stack Pointer):堆栈指针寄存器
- BP(Base Pointer):基址指针寄存器
- SI(Source Index):源变址寄存器
- DI(Destination Index):目的变址寄存器
- IP(Instruction Pointer):指令指针寄存器
- CS(Code Segment):代码段寄存器
- DS(Data Segment):数据段寄存器
- SS (Stack Segment):堆栈段寄存器
- ES (Extra Segment):附加段寄存器
OF overflow flag 溢出标志 操作数超出机器能表示的范围表示溢出,溢出时为1
SF sign flag 符号标志 记录运算结果的符号,结果负时为1
ZF zero flag 零标志 运算结果等于0时为1,否则为0CF carry flag 进位标志 最高有效位产生进位时为1,否则为0
AF auxiliary carry flag 辅助进位标志 运算时,第3位向第4位产生进位时为1,否则为0PF parity flag 奇偶标志 运算结果操作数位为1的个数为偶数个时为1,否则为0
DF direction flag 方向标志 用于串处理,DF=1时,每次操作后使SI和DI减小,DF=0时则增大
IF interrupt flag 中断标志 IF=1时,允许CPU响应可屏敝中断,否则关闭中断
TF trap flag 陷阱标志 用于调试单步操作
二,mul指令
mul是multiply(乘法)的缩写,即汇编中用于操作乘的指令,但要注意,汇编中的乘法是有一点复杂的,不是简单的把两个数相乘后存起来,mul指令之后只跟一个操作数,但我们知道乘法肯定得要两个操作数,而另一个操作数默认取AL(AX的低位)或者AX
×错误的指令:mul reg1,reg2
✔正确的指令:mul reg
(注:reg指的是寄存器)
两个相乘的数,要求要么都是8位,要么都是16位——
(一)8位乘法
如果是8位,一个乘数默认取AL(即AX的低位)中的值,另一个乘数放在8位寄存器或者内存字节单元中,最终结果存入AX中,下图进行演示
(二)16位乘法
如果是16位,一个乘数默认取AX中的值,另一个乘数放在16位寄存器或者内存字节单元中,最终结果高位存入DX中(乘法结果不足16位的话相当于高位为0),低位存入AX中,下图进行演示
(三)什么情况下用8|16位乘法?
答:由两个乘数来决定,如果两数都小于255(十六进制为FF),使用8位乘法,反之16位
三,div指令
div是divide(除法)的缩写,即汇编中用于操作除的指令,汇编中除法的机制和乘法的机制很类似,也不是简单的把两个数相除后存起来,div指令之后只跟一个操作数,但我们知道除法肯定得要两个操作数,而另一个操作数默认取AX或者DX和AX
×错误的指令:div reg1,reg2
✔正确的指令:div reg
(注:reg指的是寄存器)
两个相除的数,要求除数为8位时,被除数必须为16位;除数为16位时,被除数必须为32位——
(一)16位 除以 8位的除法
当div指令之后的参数为8位除数时,被除数默认取AX中的值
相除得到的商存入AL(AX的低位)中,得到的余数存入AH(AX)的高位中(能整除、没有余数时相当于存放0),下图进行演示
(二)32位 除以 16位的除法
当div指令之后的参数为16位除数时,被除数默认取DX和AX中的值,将DX作为被除数的高16位,AX作为被除数的低16位
相除得到的商存入AX中,得到的余数存入DX(能整除、没有余数时相当于存放0),下图进行演示
(三)什么情况下用16|32位除法?
答:被除数不大于65535(十六进制为FFFF),即ax能完整存放被除数时,使用16位除法,反之32位