计算机组成原理与接口技术笔记 11 第十一周 第三章
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算术运算与逻辑运算指令
主要是对无符号数的运算
无符号数的相加
ADD destination, source
ADC destination, source
ADC与ADD的区别,ADC把进位考虑进来了,ADC把CF标志寄存器的内容也加进来了,如果CF = 0,则两个指令运算完全一样,如果CF = 1,则ADC运算结果比ADD大1。
循环:
LOOP TO_LOOP
等价于:
DEC CX
JNZ TO_LOOP
无符号数的减法
通过补码加法来实现的
硬件实现:
1、求出减数的补码(源操作数)
2、把它加到被减数中(目标操作数)
3、进位取反(CF标志位取反)
借位AF要看相减是否产生借位,上面三个步骤只是中间步骤而已,不能用来判断AF 的值,要自己看相减是否产生借位。
SUB与SBB:
SBB考虑了借位,如果CF = 0,则SUB和SBB一样,如果CF = 1,则SBB运算结果比SUB 小1。
MOV AL, BYTE PTR DATA
读取DATA,按照一个字节(8位)来读取。
如果后面DATA变成DATA+1则是往后加一个字节
MOV AX, WORD PTR DATA
读取DATA,按照一个字长(16位)来读取。
如果后面DATA变成DATA+1则是往后加一个字节
注意内存单元是以字节为单位的,与指令定义字长无关,定义字长只是确定读出多少个内存单元的内容而已。
无符号数的乘法运算
MUL 操作数
只有一个操作数,其他操作数都是采用隐含寻址的方法。
这个操作数不能是立即数。
这个操作数是乘数,被乘数放在AL中,乘积放在AX中。
支持字节和字节相乘,字和字相乘,字和字节相乘。
字和字相乘:
被乘数放在AX中,乘积放在AX和DX中,DX是高16位,AX是低16位
字和字节相乘:
默认被乘数是8位的,放在AL中,乘数是16位的。
实际上还是用字和字相乘,做乘法之前要先把AH清零,这样就是做字和字节的乘法了SUB AH, AH
MUL DATA
乘积放在AX和DX中,DX是高16位,AX是低16位
无符号数的除法
DIV 除数
与MUL一样,只有一个操作数,是除数。
除法错误:
1、除0错误,会自动调用除法错误的中断
2、商大于存储商的范围
1、字节除以字节
字节存储在AL中,AH清零
商存储在AL中,余数存储在AH中
2、字除以字节
被除数存储在AX中
商存储在AL中,余数存储在AH中
3、字除以字
DX存储为0,AX存储被除数
商在AX中,余数在DX中
4、双字除以字
DX存储被除数高16位,AX存储被除数低16位
商在AX中,余数在DX中
逻辑运算指令
与运算:
AND destination, source
与ADD、SUB一样的寻址方式
位处理,对每个位都对应进行与运算
运算后,不会有进位和溢出,所以CF = OF = 0
用得最多的情况,设置位为零
与0与则为0,与1与则不变。
可以实现ASCII码与二进制数之间的转换
TEST
与AND一样,但是不会改变操作数的值,只改变了标志寄存器的值
NOT
按位取反
OR
OR destination, source
按位做或运算
较多用来设置某一位或者某些位为1。
XOR
XOR destination, source
按位做异或运算
对某一位的值进行取反
某一位和1异或之后则变成相反的值。
某一位和0异或之后不会改变它的值。
SHIFT
移位运算
逻辑移位:无符号数的移位
算术移位:有符号数的移位,移位后符号位不变
SHR destination, source
右移,高位补零
SHL destination, source
左移,低位补零
source代表移位的次数,destination代表移位的对象
最后一个移出去的位写入到了CF中。
CMP destination, source
做减法运算,不改变destination的值,只改变了标志寄存器的值。
JA(jump above):等价于JNC,destination >= source
JB(jump below):等价于JC,小于,destination < source
CMC:进位标志位取反
STC:CF = 1
CLC:CF = 0
STD:DF = 1
CLD:DF = 0
STI:IF = 1
CLI:IF = 0
标志寄存器的值的改变:
LAHF:把标志寄存器的低8位读出来放到AH中
SAHF:把AH中的值写到标志寄存器的低8位中
PUSHF:把标志寄存器的所有16位都压栈
POPF:把标志寄存器的值赋值为栈中的值
下面这三条指令可以把标志寄存器全设置为1。
MOV AX, 0FFFFH
PUSH AX
POPF
下面这2条指令可以把标志寄存器全读取到AX中。