一,寄存器及标志
补充:常用的AX,BX,CX,DX这四个寄存器,是被分成两部分用的
例如,AH和AL共同组成AX,AH称作AX的高位,AL称作AX的低位
- 单独看:AH和AL都可以当成一个独立的寄存器来使用,能存放00到FF之间的数
- 合作看:AX又算作一个独立的寄存器,能存放0000到FFFF之间的数
BX、CX、DX同理
- 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,否则为0(例如比较两字符串是否相等,如果相等,那么cmp的结果为0,此时ZF将为1;ZF的值与后续的跳转指令息息相关,是十分重要的一个标志!)CF 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指令只跟一个操作数)
x错误的指令:div 2 (div指令之后的操作数必须是寄存器)
✔正确的指令:div reg (reg中的值将作为本次除法的除数)
(注:reg指的是寄存器,div指令只跟一个操作数)
两个相除的数,要求除数为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位