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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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中。

相关文档
最新文档