当前位置:文档之家› 计算机组成原理与接口技术笔记 11 第十一周 第三章

计算机组成原理与接口技术笔记 11 第十一周 第三章

算术运算与逻辑运算指令
主要是对无符号数的运算
无符号数的相加
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中。

PUSHF
POP AX
运算符:
$:返回当前指令的地址
SEG:返回所在段的地址
OFFSET:返回在当前段中的偏移量
TYPE:返回它占用的字节
LENGTH:返回用DUP定义的变量的数量
SIZE:返回用DUP定义的变量的占用的字节数
HIGH:返回高8位
LOW:返回低8位
BIOS
计算机启动之前要做一个自检。

其中包括检测CPU和寄存器能否正常工作。

标志寄存器全部设置为1,检测;全设置为0,检测。

通用寄存器的每一位全设置为1,检测,全设置为0,检测。

任何一步有问题,都不会启动系统,直接进入相应的错误处理程序。

BCD码
用二进制数表示0-9这10个数字。

用得最多的是8421编码。

用4位二进制数来表示。

一个字节可以表示2个BCD码,称为组合型BCD码(或者压缩型BCD码)。

如果用一个字节来表示1个BCD码,则称为非组合型BCD码,高4位全为0,低4位才是有效位。

越过A-F六个状态,加6就可以了。

ASCII码
从键盘输入的时候,接收到的是对应键的ASCII码,一个ASCII码在内存中占用一个字节。

从键盘输入两个数,然后进行运算。

运算前要先转换为二进制数,再运算,最后再转换为ASCII码来输出。

没有必要进行转换,直接用ASCII进行运算,再调整让它回到ASCII码。

旋转指令
就是循环移位
ROR ROL RCR RCL
如果是C,则CF会参与循环移位。

如果是RO,CF也会随着移动改变,每次移位移出去的位不仅会移动到相应的位置,还会被复制到CF中。

相关主题