微机第四章教材_第1页
微机第四章教材_第2页
微机第四章教材_第3页
微机第四章教材_第4页
微机第四章教材_第5页
已阅读5页,还剩137页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第四章8086指令系统4.1汇编语言指令的格式与寻址方式4.2数据传输类指令4.3算术加法类指令4.4逻辑操作类指令4.5程序转移类指令4.6字符串操作指令(了解)4.7处理器控制类指令(了解)指令系统根据设计使某型计算机所具有的指令的集合便是计算机的指令系统。指令的表达形式:机器码指令和汇编语言指令。①用二进制代码表示的指令称为机器码指令或目标代码指令。②因为机器码指令难以记忆和编程,就将指令操作功能的英文缩写作为指令的符号,称为助记符。用助记符表示的指令便于记忆和编程,但不能被计算机直接识别和执行,必须经过汇编转换为机器码后才能执行,汇编语言指令由此而得名。

4.1汇编语言指令的格式和寻址方式一、8086汇编语言指令的格式

[标号]:(助记符)[操作数][,操作数][;注释]1.标号是给该指令所在地址取的名字,必须后跟“:”,它可以缺省,是可供选择的标识符。2.指令助记符是指令功能的代表符号,它是指令语句中的关键字段,不可缺省,它表示本指令的操作功能。3.操作数是参加指令操作的数据,可缺省源操作数——指令中参与操作的数据,源地址目的操作数——指令操作结果,目的地址4.注释可缺省,必须用“;”指明。e.g.MOVBX,1000H;将1000H送BXINCCX ;将CX内容加1NOP ;空操作二、8086的寻址方式寻址方式——寻找操作数所在地址的方式。(七种)立即数寻址—操作数就放在指令中。e.g.MOVAL,05H;将05H送入ALMOVAX,3064H;3064H→AX,64H→AL,30H→AH存储单元或某个寄存器2.寄存器寻址----操作数在CPU内部寄存器中,指令指定寄存器名称。

对于16位操作数,寄存器可以是:

AX,BX,CX,DX,SP,BP,SI,DI,DS,CS,ES,SS

对于8位操作数,寄存器可以是:

AL,AH,BL,BH,CL,CH,DL,DH

这种寻址方式因为操作数在寄存器中,不需要访问存储器,因此运算速度较高。可以对源操作数采用寄存器寻址,也可以对目的操作数采用寄存器寻址,还可以两者都采用寄存器寻址方式。e.g.MOVSS,AX指令执行前:(AX)=3064H (SS)=1234H

指令执行后:(SS)=3064H

(AX)保持不变。

指令执行前:指令执行后:寄存器寻址方式3.直接寻址----操作数地址的16位偏移量,直接包含在指令中注意:(1)直接寻址方式适用于处理单个变量。(2)直接寻址方式默认的段寄存器是数据段寄存器DS,即隐含的段寄存器是DS,8086允许段跨越,即允许使用CSSSES作为段寄存器,这时,必须在指令中特别标明.(3)有效地址即偏移量(偏移地址)e.g.MOVAX,[3100H](DS)=6000H,(63100H)=3050H则:(AX)=3050H又:用符号地址代替数值地址。MOVAX,[VALUE]VALUE——有效操作数单元的符号地址。如:VALUE在附加段中,则应指定段跨越。

MOVAX,ES:[VALUE]直接寻址方式注意:比较下列两条指令寻址方式的区别

MOVAX,3100HMOVAX,[3100H]前一指令中3100H是操作数,属于立即寻址方式;后一指令中3100H是偏移地址,默认段基址在DS寄存其中,属于直接寻址方式!4.寄存器间接寻址方式----操作数的有效地址放在寄存器中

e.g.MOVBX,[DI]操作数地址的16位偏移量可存放在下列寄存器中:

BP、BX、SI、DI中。注意:此方式下操作数在存储器(内存)中,

(1)

若选择SI、DI、BX作为偏移地址存放寄存器操作数默认用(DS)作为段地址寄存器。即操作数物理地址为:

物理地址PA=16d×(DS)+(BX) 物理地址PA=16d×(DS)+(SI) 物理地址PA=16d×(DS)+(DI)(2)

若选择BP作为偏移地址存放寄存器操作数默认用(SS)作为段地址寄存器。即操作数物理地址为:物理地址PA=16d×(SS)+(BP)e.g.MOVBX,[DI]

(DS)=6000H

(DI)=2000HPA=62000H

(62000H)=50A0H

(BX)=50A0H直接寻址方式:MOVBX,[2000H]寄存器间接寻址方式(2)若选择寄存器BP作为间接寻址操作数在堆栈段区域中,用SS寄存器的内容作为段地址。操作数物理地址:PA=16d×(SS)+(BP)例:MOV[BP],AX执行前:(SS)=1000H, (BP)=3000H, (AX)=1234H执行后:PA=13000H (13000H)=1234H寄存器间接寻址方式(3)用SI、DI、BX、BP作为间接寻址允许段跨越

指令中可以指定段跨越前缀来取得其他段中的数据。例:MOVES:[DI],AXMOVDX,DS:[BP]这种寻址方法可以用于表格处理。5.基址寻址方式(BX,BP)

操作数的有效地址是一个基址寄存器的内容和指令中指定的8位或16位位移量(displacement)之和。EA=BXBP+8位位移量16位位移量用BX寄存器进行基址寻址时,默认的段寄存器为数据段DS。用BP寄存器进行基址寻址时,默认的段寄存器为堆栈段SS。

e.g.MOVAX,COUNT[BP]或MOVAX,[COUNT+BP]或MOVAX,COUNT+[BP]

COUNT为16位位移量,COUNT从形式上看是一个数。指令执行前:(SS)=5000H,(BP)=3000H,COUNT=2040H,(AX)=1234HMOVAX,[BP+2040H]指令执行后:

EA=5040HPA=55040H(55040H)=5548H(AX)=5548H

基址寻址方式

MOVAX,COUNT[BP]6.变址寻址方式(SI,DI)

操作数的有效地址是一个变址寄存器的内容和指令中指定的8位或16位位移量之和,变址寄存器名均由指令指定。所用寄存器为SI和DI,它们分别称为源变址寄存器和目的变址寄存器。默认为段寄存器为DS。EA=SIDI+8位位移量16位位移量e.g.MOVAX,[DI+COUNT]或MOVAX,COUNT[DI]执行指令前:

(DS)=3200H,COUNT=0456H,(DI)=1094H(334EAH)=67H(334EBH)=45H执行指令后:

EA=14EAH PA=334EAH (AX)=4567H变址寻址方式

7.基址加变址寻址方式

操作数有效地址是一个基址寄存器和一个变址寄存器的内容和8位或16位位移量之和。EA=SIDI+8位位移量16位位移量BXBP+e.g.MOVAX,MASK[BX][DI]MOVAX,MASK[BX+DI]MOVAX,[MASX+BX+DI]执行指令前:(DS)=3000H(BX)=1346H(DI)=0500HMASK=1234H(32A7AH)=4050H执行指令后:EA=2A7AHPA=32A7AH(AX)=4050H

基址加变址MOVAX,[MASK+BX+DI]用途:这种寻址方式为堆栈处理提供方便:

(BP)

栈顶(一般BP可指向栈顶)从栈顶到数组的首地址可以用位移量表示(MASK).

变址寄存器(SI)或(DI)——指向数组中某个元素。……低地址高地址[BP]栈顶DI位移量A(0)A(1)A(2)A(n)小结1.操作数可以有3种形式存放:指令中,寄存器中,存储器中。2.指令中----立即寻址方式;寄存器中----寄存器寻址方式;存储器中----其余5种寻址方式,需要有逻辑地址(段基址和偏移地址)生成物理地址才能取得。

8086的指令系统

8086的指令系统中共有92种基本指令,可以分成6个功能组:1. 数据传输2. 算术运算3. 逻辑运算和移位指令4. 程序转移5. 字符串操作(了解)6. 处理器控制(了解)4.2数据传送指令功能:负责把数据、地址或立即数传送到寄存器或存储单元。特点:它是计算机最基本、最重要的一种操作,使用比例最高。种类(分四种):(一)通用传送指令(二)目标地址传送指令(三)标志位传送指令(四)输入输出指令(一)通用传送指令

8086提供方便灵活的通用的传送操作,适用于大多数操作数。

通用传送指令(除了XCHG以外)是唯一允许以段寄存器为操作数的指令。通用传送指令包括: 1、传输指令MOV 2、堆栈操作指令PUSHPOP 3、交换指令XCHG

4、换码指令XLAT1. MOV dest, src;(dest)

(src)

目的

源 目的

源功能:(1)把一个字节(B)或一个字(W)操作数由源传送至目的。(2)实现: 寄存器

寄存器/存储器之间; 立即数

寄存器/存储器 寄存器/存储器

段寄存器之间的数据传送。

具体说,通用数据传送指令能实现:①CPU内部寄存器之间的数据的任意传送(除了代码段寄存器CS和指令指针IP以外)。

段寄存器之间不能传送。例:MOVDL,CH ;8位寄存器

8位寄存器

MOVAX,DX;16位寄存器

16位寄存器

MOVSI,BPMOVDS,BX ;通用寄存器段寄存器

MOVAX,CS

;段寄存器

通用寄存器立即数传送至CPU内部通用(专用)寄存器组用于给寄存器(AX、BX、CX、DX、BP、SP、SI、DI)赋初值。

不能直接给段寄存器赋值例:

MOVCL,04H ;立即数

8位寄存器

MOVAX,03FFH ;立即数

16位寄存器

MOVWORDPTR[SI],057BH;立即数存储器

MOVBYTEPTRMEM,5;立即数存储器CPU内部寄存器(除CS和IP外)与存储器(所有寻址方式)之间数据传送。可以实现一字节或一个字的传送。

存储单元(内存)之间不能直接传送

例:

MOVMEM,AX ;累加器

存储器,直接寻址

MOVMEM,DS;段寄存器

存储器,直接寻址

MOV[BX],CX;寄存器

存储器,基址寻址

MOVAX,[SI];存储器

累加器,变址寻址

MOVDS,MEM;存储器

段寄存器,直接寻址

MOVCX,[BX][SI];存储器

累加器,基址加变址

注意:(1)不能用一条MOV指令实现以下传送。

①存储单元之间的传送

MOVMEM2,MEM1错

MOVAX,MEM1对

MOVMEM2,AX对

②立即数送段寄存器例:MOVDS,2000H错。MOVAX,2000HMOVDS,AX对

段寄存器之间的传送

MOVES,DS;错

MOVAX,DS MOVES,AX;对。④注意CS和IP的使用:CS和IP不能作为目的操作数,可以作为源操作数。例: MOVCS,AX;错

MOVAX,CS;对。

MOVIP,AX;错

MOVAX,IP;对。(2)段地址的默认

BX、SI、DI寻址默认段地址寄存器为DS,

BP寻址默认段地址寄存器SS。(3)【了解】凡是遇到给SS赋值指令,系统自动禁止外部中断,执行本条指令和下条指令后,恢复对SS寄存器赋值前的中断开放情况。这样做为了允许程序员连续用两条指令分别对SS和SP寄存器赋值,同时又防止堆栈空间变动过程出现中断。在修改SS和SP的指令之间不要插入其他指令。(4) 所有通用传送指令不影响标志位。(除SAHF、POPF指令以外)。2.

PUSHPOP

这是两条堆栈操作指令。(1)先介绍一下什么是堆栈,为什么需要堆栈堆栈——按照先进后出原则组织的一段内存区域,特点:

①下推式的(规定堆栈设置在堆栈段内)改变SP的内容②随着推入堆栈内容增加,SP的值减少。

③先进后出工作原则(LastInFirstOut简称LIFO)堆栈在内存中的情况:可以用一条立即数传送指令给SP赋值,确定SP在SS段中的初始位置。例:设:(SS)=9000H,堆栈段为64KBMOVSP,0E200H;(SP)=0E200H则:整个堆栈段的物理地址范围为:90000H~9FFFFH

栈顶的物理地址为:9E200H堆栈在内存中的情况如右图所示:堆栈在内存中的情况(2)堆栈操作指令

(堆栈操作指令有两条):入栈指令格式:PUSHsrc ;(SP)

(SP)-2

;((SP)+1,(SP))

(src)修改堆栈指针,把一个字的源操作数

压入堆栈顶部e.g.PUSHAX

出栈指令

格式:POPdest ; (dest)

((SP)+1,(SP))

;(SP)

(SP)+2把现行SP所指向堆栈顶部的一个字

指定的目的操作数,同时进行修改堆栈指针的操作。

e.g.POPBX使用数据时将其弹出:

POPBX应用时注意:①堆栈操作都按字操作。②

PUSH,POP指令的操作数可能有三种:寄存器(通用寄存器,地址指针,变址寄存器),段寄存器(CS除外,PUSHCS合法,POPCS非法),存储器。③

执行PUSH指令,(SP)-2

(SP),低字节放在低地址,高字节放在高地址。随着推入堆栈内容增加,堆栈就扩展,SP的值减少,但SP总是指向栈顶。④堆栈工作原则后进先出。

PUSH,POP指令应该成对使用,保持堆栈原有状态。⑤堆栈最大容量即为SP的初值与SS之间的差。堆栈应用举例:

例:用BP的基址指令代替POP指令

…MOVBP,SPPUSHAXPUSHBXPUSHCX …MOVCX,[BP-6]

MOVBX,[BP-4]MOVAX,[BP-2] …ADDSP,6例:压入堆栈的内容与弹出内容顺序相反…PUSH AXPUSHBXPUSHCX…POPCXPOPBXPOPAX 3.交换指令格式:XCHGdest,src ;(dest)

(src)执行操作:把一个字节或一个字的源操作数与目的操作数相交换。可以实现:寄存器之间、寄存器和存储器之间注意:

存储器之间不能交换,两个操作数中必须有一个在寄存器中;

段寄存器不能作为一个操作数;允许字或字节操作,不影响标志位。应用举例:

XCHGBL,DL XCHGAX,SI XCHGCOUNT[DI],AX

XCHG[BX],[DI] (错)

XCHGDS,AX(错)XLAT换码指令(了解)该指令不影响标志位。格式:XLAT;(AL)←((BX)+(AL))起始地址预存在BX中,AL中存放的是偏移地址。XLAT指令使用方法:

先建立一个字节表格;

表格首偏移地址存入BX;

需要转换代码的序号(相对与表格首地址位移量)存入AL;(表中第一个元素的序号为0)

执行XLAT指令后,表中指定序号的元素存于AL中。(AL)为转换的代码。XLAT指令应用:

若把字符的扫描码转换成ASCII码;或数字0~9转换成7段数码所需要的相应代码(字形码)等就要用XLAT指令。例:内存的数据段中有一张十六进制数字的ASCII码表。

首地址为:Hex_table,欲查出表中第10个元素(‘A’)执行指令序列:MOVBX,OFFSETHex_tableMOVAL,0AHXLAT假设: (DS)=F000H,

Hex_table=0040H

(AL)=0AH执行XLAT以后:(AL)=41H=(F004AH),

即“A”的ASCII码。30H31H32H...39H41H42H...46H...Hex_tableHex_table+1Hex_table+2Hex_table+0AHHex_table+0BHHex_table+0FH'F''B''A''9''1''2''0'16进制数的ASCII码表(二)输入输出指令输入输出指令共两条:

1.IN

2.OUT

输入指令用于CPU从外设端口接收数据(读),

输出指令用于CPU向外设端口发送数据(写)。

无论接受还是发送数据,必须通过累加器AX(字)或AL(字节),又称累加器专用传送指令。

输入、输出指令不影响标志位。1、IN输入指令(外设→CPU)格式:INacc,port;(acc)

(port)具体形式有四种:

INAL,data8;端口地址8位,输入一个字节

INAX,data8;端口地址8位,输入一个字

INAL,DX ;端口地址16位,输入一个字节

INAX,DX ;端口地址16位,输入一个字必须通过累加器AX(字)或AL(节)输入数据。2、OUT输出指令格式:OUTport,acc ;(port)

(acc)具体形式有四种:

OUTdata8,AL;端口地址8位,输出一个字节

OUTdata8,AX;端口地址8位,输出一个字

OUTDX,AL;端口地址16位,输出一个字节

OUTDX,AX;端口地址16位,输出一个字必须通过累加器AX(字)或AL(字节)输出数据。直接寻址方式:外设端口地址(端口号)直接用8位立即数给出,寻址范围00H~FFH(0~255)间接寻址方式:当端口地址(端口号)>255(FFH)时,只能使用间接寻址方式。必须先把端口号放到DX寄存器中,通过DX寻址。例1:实现端口(28H)→(DATA_WORD)

INAX,28H MOVDATA_WORD,AX例2:从端口3FCH送一个字到AX寄存器

MOVDX,3FCH INAX,DX;(AL)←(3FCH), (AH)←(3FDH)

例3:实现将(AL)→端口(05H) OUT5,AL;(05H)←(AL)(三)目的地址传送指令

8086/8088提供三条:

地址指针写入指定寄存器或寄存器对指令。

1、LEA(LoadEffectiveAddress) 2、LDS(LoadpointerusingDS) 3、LES(LoadpointerusingES)1、LEA格式:LEAreg16,mem16;EA(reg16)功能:取有效地址(偏移地址),用于写进地址指针。把指令中指定的存储器操作数有效地址装入指定的寄存器。例:设(BX)=0400H,(SI)=003CH LEABX,[BX+SI+0F62H]执行指令后:

EA=(BX)+(SI)+0F62H=0400H+003CH+0F62H=139EH(BX)=139EH注意:设

(DS)=3000H BUFFER=1000H (31000H)=0040H(1)LEA指令与MOV的区别

LEABX,BUFFER

;(BX)=1000H MOVBX,BUFFER

;(BX)=0040HLEA指令与MOV等价

LEABX,BUFFER;(BX)=1000HMOVBX,OFFSETBUFFER;(BX)=1000H(2)LEA

指令中的目标寄存器必须是16位的通用寄存器,源操作数必须是一个存储器(内存)。(3)请思考下列指令的正、误

LEADX,[BX][SI] LEADX,AX2、LDS

格式:LDSreg16,mem32;(reg16)←(EA) (DS)←((EA)+2))功能:将指令指定32位(4B)地址指针送指令指定寄存器和DS(取段地址和偏移地址)。

例:假设:

(DS)=C000H指令: LDSSI,[0010H]执行指令后:(SI)=0180H(DS)=2000H

3、LES

格式:LESreg16,mem32;(reg16)←(EA)

;(ES)←((EA)+2))例:假设:

(DS)=B000H (BX)=080AH指令: LESDI,[BX]执行指令后: (DI)=05A2H (ES)=4000H综合举例:设:

(DS)=5000HTABLE=1000H分析下列指令执行结果:

(1)MOVBX,TABLE(2)MOVBX,OFFSETTABLE(3)LEABX,TABLE(4)LESBX,TABLE(5)LDSBX,TABLE(四)标志传送指令采用了隐含寄存器(AH、Flags)操作数方式。

8086有四条标志传送操作指令:1. LAHF2. SAHF3. PUSHF4. POPF

1.LAHF格式:LAHF;(AH)←(PSW的低字节)功能:标志寄存器低八位

(AH)。LAHF指令操作图示意2. SAHF

格式:SAHF;(PSW的低字节)←(AH) 功能:(AH)送标志寄存器低八位。3. PUSHF

格式:PUSHF ;(SP)←(SP)-2

((SP)+1,(SP))←(PSW) 功能:标志进栈。4. POPF

格式:POPF;(PSW)←((SP)+1,(SP)) (SP)←(SP)+2

功能:标志出栈。4.3算术运算指令(Arithmetic)内容:

8086/8088提供加、减、乘、除、转换五种基本算术操作;

利用十进制调整指令和ASCII调整指令对BCD码表示的十进制数进行算术运算;

对带符号数与无符号数进行乘、除运算。(一)加法指令(Arithmetic)(二)减法指令(Subtraction)(三)乘法指令(Multiplication)(四)除法指令(Division)(五)转换指令(一)加法指令(Arithmetic)

8086具有3种加法操作指令:1、ADD(Addition)加法指令

2、ADC(Addwithcarry)带进位加法指令

3、INC(Incrementby1)加1指令

例 MOVAL,7EH ;(AL)=7EH MOVBL,5BH ;(BL)=5BH ADDAL,BL ;(AL)=7EH+5BH=D9H影响标志位的情况:

SF=1 ,结果最高位=1

ZF=0 ,结果不等于0AF=1 ,D3位向D4有进位PF=0 ,”1”的个数为奇数CF=0 ,无进位OF=1 ,和超过+127(两个正数相加,结果为负;反之亦是)2、ADC(Addwithcarry)带进位加法指令格式:ADCdest,src

;(dest)←(dest)+(src)+CF

CF:

进位标志CF的现行值(上条指令CF值)特点:与ADD同。用途:主要用于多字节运算中。类型举例:

ADCCX,300 ;寄存器+立即数+CF ADCAL,BL ;寄存器+寄存器+CF ADCDX,COUNT[SI] ;寄存器+存储器+CF ADCBLOCK[DI],BX ;存储器+寄存器+CFADCBYTEPTRMEM,6 ;存储器+立即数+CF【例】设DX=4652H,执行指令ADDDX,7A08H后,DX=?,CF=?,SF=?,ZF=?,OF=?根据计算:DX=C05AH,结果不为0,ZF=0;运算结果没有进位,CF=0;运算结果的最高位为1,SF=1;加数、被加数均为正数,而结果为负数,产生溢出,OF=1。3、INC(Incrementby1)加1指令格式:INCdest

;(B/W),(dest)←(dest)+1

dest:寄存器、存储器。不能是段寄存器。功能:对指定的目标操作数+1

操作数单元。用途:用于在循环程序中修改地址指针和循环次数。标志位影响情况:影响SF,ZF,AF,PF,OF。

不影响CF。例:

INCDL ;8位寄存器+1INCSI ;16位寄存器+1INCBYTEPTR[BX][SI];存储器+1(字节操作)

INCWORDPTR[DI] ;存储器+1(字操作)

INCDS ;错操作数类型:可以是寄存器,存储器。不能是段寄存器。(二)减法指令(Subtraction)

8086有5条减法指令:1、SUB(Subtraction)减法指令2、SBB(Subtractionwithborrow)带进位减法指令3、DEC(Decrementby1)减1指令4、NEG(Negate)求补指令5、CMP(Compare)比较指令格式::SUBdest,src;(dest)←(dest)-(src)

Src:立即数,寄存器,存储器。

Dest:寄存器,存储器。1、SUB(Subtraction)减法指令例: SUBAL,37H ;寄存器-立即数

SUBBX,DX ;寄存器-寄存器

SUBCX,VAR1 ;寄存器-存储器

SUBARRAY[SI],AX ;存储器-寄存器SUBWORDPTRALPHA[BX][DI],512H;存储器减立即数例: SBBBX,100H ;寄存器-立即数-CF SBBCX,DX ;寄存器-寄存器-CF SBBAL,DATA1[SI] ;寄存器-存储器-CF SBBDISP[BP],BL ;存储器-寄存器-CFSBBBYTEPTRALPHA[SI+6],96H;存储器-立即数-CF2、SBB(Subtractionwithborrow)带进位减法指令

格式::SBBdest,src;(dest)←(dest)-(src)-CF CF:进位标志CF的现行值(上条指令CF值)

Src:立即数,寄存器,存储器。

dest:寄存器,存储器。指令影响标志位、B/W数运算情况同SBB用途:用于多字节数相减3、DEC(Decrementby1)减1指令格式:DECdest;(B/W) (dest)←(dest)-1

dest:寄存器、存储器。不能是段寄存器。功能:对指定的目标操作数-1

操作数单元。用途:用于在循环程序中修改地址指针和循环次数。标志位影响情况:影响SF,ZF,AF,PF,OF。

不影响CF。4、NEG(Negate)求补指令格式:NEGdest;B/W,(dest)←0-(dest)

dest:寄存器 、存储器。操作:把操作数按位求反后末位+1。(dest)←0FFFFH-(dest)+1影响标志:AF、CF、OF、PF、SF、ZF。CF: 操作数为0时求补,CF=0;一般使CF=1.OF:对-128或-32768求补,OF=1;否则OF=0.MOVAX,0FF64H;(AH=0FFH,AL=64H)NEGAL;AX=0FF9CH(0-64H=9CH)SUBAL,9DH;AX=0FFFFH(9CH-9DH=0FFH)NEGAX;AX=0001H(0-0FFFFH=1H)DECAL;AX=0NEGAX;AX=0例1:格式:CMPdest,src

;B/W(dest)-(src)

结果不送,影响标志位。5、CMP(Compare)比较指令src: 立即数,寄存器,存储器。dest:寄存器,存储器。影响标志:AF、CF、OF、PF、SF、ZF。

例: CMPAL,0AH ;寄存器与立即数比较

CMPCX,DI ;寄存器与寄存器比较

CMPAX,AREA1 ;寄存器与存储器比较

CMP[BX+5],SI ;存储器与寄存器比较CMPWORDPTRALPHAGAMMA,100H;存储器与立即数比较用比较指令来比较两个数之间的关系:

两者是否相等,两个数中哪个大。(1)根据ZF标志,判断两者是否相等;(2) 根据CF标志,判断两个无符号数的大小;(3) 用SF、OF标志,判断两个带符号数的大小。

例如:比较两个数的大小

MOVAL,56HMOVDL,0B5HCMPAL,DL(1)均为无符号数,结果如何?(2)均为带符号数,结果如何?

ZF=0,不相等;

CF=1,AL<DL;SF=1,OF=1,AL>DL。

附:分支程序设计选择分支

简单分支多分支

比较两个一字节无符号数X1和X2的大小,把大数存入MAX单元。分析:比较两个无符号数,可将两数相减,然后根据CF标志位来判断大小。

DATASEGMENTSOURCEDBX1,X2MAXDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAMOVAX,DATAMOVDS,AXMOVAL,SOURSE;AL←X1CMPAL,SOURSE+1;X1-X2JNCBRANCH;若X1>X2,转BRANCHMOVAL,SOURSE+1;否则,AL←X2BRANCH:MOVMAX,AL;大数送MAX单元CODEENDSENDCMP指令应用举例:带符号数找最大值思路:

第一个数取出

(AX),

取出第二个数(第二个字单元内容)与(AX)比较: (AX)>第二个数,不做交换,否则,(第二个字单元内容)

(AX)。再取第三个数,

经过99次比较,在(AX)中得到最大数。

…循环程序!若自BLOCK开始的内存缓冲区中,有100个带符号数。找出最大值。并存放到MAX单元中。三、乘、除指令指令助记符格式操作无符号数乘MULMUL

srcsrc为字节:AX←AL×srcsrc为字:DXAX←AX×src符号数乘IMULIMUL

src无符号数除DIVDIV

srcsrc为字节:AL←AX÷(src)的商,AH←AX÷(src)的余数src为字:AX←DXAX÷(src)的商,DX←DXAX÷(src)的余数符号数除IDIVIDIV

srcsrc可以为:reg,mem,不允许为立即数。(1)无符号数乘法指令MUL格式:MULsrc注意:

源操作数不能是立即数。目的操作数隐含规定!

规定:字节乘时,被乘数隐含为寄存器AL,乘积的高8位存于寄存器AH中,低8位存于寄存器AL中。字乘时,被乘数隐含为寄存器AX,乘积的高16位存于寄存器DX中,低16位存于寄存器AX中。(2)带符号数乘法指令IMUL格式:IMULsrc【例】64H×0A5H(1)无符号数乘,即100×165=16500DMOVAL,64H;AL=64H=100DMOVBL,0A5H;BL=0A5H=165DMULBL;AX=4074H=16500D,

(2)带符号数乘,即100×(-91)=-9100DMOVAL,64H;AL=64H=100DMOVBL,0A5H;BL=0A5H=-91DIMULBL;AX=0DC74H=-9100D,(3)无符号数除法指令DIV格式:DIVsrc注意:

源操作数(除数)不能是立即数。目的操作数(被除数)隐含规定!

除数为字节时,被除数必须为16位,隐含为寄存器AX,商存于寄存器AL中,余数存于寄存器AH中。除数为字时,被除数必须为32位,隐含为寄存器DX、AX,商存于寄存器AX中,余数存于寄存器DX中。(4)带符号数除法指令IDIV格式:IDIVsrc【例】40003H÷8000H(1)无符号数除,即:262147÷32768=8……3MOVDX,4MOVAX,3;(DXAX)=40003H=262147DMOVCX,8000H;CX=8000H=32768DDIVCX;商AX=8,余数DX=3(2)符号数除,即:262147÷(-32768)=-8……3MOVDX,4MOVAX,3;(DXAX)=40003H=262147DMOVCX,8000H;CX=8000H=-32768DIDIVCX;商AX=FFF8H=-8,;余数DX=3(3)扩展指令

扩展指令用于将字节扩展为字(CBW)或字扩展为双字(CWD),指令格式及功能如表所示:指令功能说明CBW把寄存器AL中数据的符号位扩到AH寄存器中,使字节扩为字。即:AL<80H时,AH←00H;

AL≥80H时,AH←FFH;源操作数隐含为寄存器AL,目标操作数隐含为寄存器AX。CWD把寄存器AX中数据的符号位扩到DX寄存器中,使字扩为双字。即:AX<8000H时,DX←0000H;

AX≥8000H时,DX←FFFFH;源操作数隐含为寄存器AX,目标操作数隐含为寄存器DX,AX。

【例】(1)MOVAL,75HCBW

执行结果为:AX=0075H(2)MOVAX,0A085H

CWD

执行结果为:DX=0FFFFH,AX=0A085H

4.4逻辑操作类指令内容:

(一)逻辑运算指令(二)移位指令(三)循环移位指令

(一)逻辑运算指令1、AND(Logicaland)逻辑“与”指令2、TEST(Testornon-destructivelogicaland)测试指令3、OR(Lgicalinclusiveor)逻辑“或”指令4、XOR(Logicalexclusiveor)逻辑“异或”指令5、NOT(Logicalnot)逻辑“非”指令特点:8086可以对8位,或16位操作数执行逻辑操作。逻辑运算是按位操作,操作数应该是位串而不是数。影响条件:(NOT指令除外,其他指令同)

CF=OF=0,AF未定义,影响SFZFPF

逻辑运算指令包括逻辑非(NOT)、逻辑与(AND)、逻辑测试(TEST)、逻辑或(OR)和逻辑异或(XOR)指令。这些指令的操作数可以是8位、16位,运算按位进行。对操作数的要求与MOV指令相同。指令格式如表所示:指令名格式功能标志位逻辑非NOTdest(dest)←(dest)NOT指令不影响,其它指令:①CF、OF清零②影响SF、ZF、PF③AF不定TEST指令执行与操作,影响标志位,但不保留结果逻辑与ANDdest,src(dest)←(dest)∧(src)测试TESTdest,src(dest)∧(src)逻辑或ORdest,src(dest)←(dest)∨(src)逻辑异或XORdest,src(dest)←(dest)⊕(src)1、AND(Logicaland)逻辑“与”指令格式:ANDdest,src

;B/W,(dest)

(dest∧(src)

src:立即数、寄存器、存储器。

dest:寄存器、存储器。执行操作:进行“与”运算,两位中有一位为0(或二位都为0),则结果为0,否则为1。操作类型举例:ANDAL,0FH;寄存器∧

立即数ANDCX,DI ;寄存器∧寄存器ANDSI,MEM_NAME;寄存器∧存储器ANDALPHA[DI],AX;存储器∧寄存器ANDwordptr[BX][SI],0FFFEH;存储器∧立即数注意:

“与”指令中操作数不能同时为存储器;影响标志位:CF=OF=0,AF未定义,影响SFZFPF

“与”指令的用途:(1)清CF,自己“与”自己.操作数不变,CF=0

例:ANDAL; 结果:操作数不变,CF=0。

(2)使操作数中若干位保持不变,若干位与“1”相与;而若干位置为“0“的场合,若干位与“0”相与。例:

若(AL)=43HANDAL,0FH ;(AL)=03H,(AL)0~3不变;

;(AL)4~7=00H,屏蔽高4位。“与”指令应用举例:例1:将英文小写字母ASCII转换成大写。 小写英文字母ASCII为:‘a’~’z’61H~7AH

大写英文字母ASCII为:‘A’~’Z’41H~5AH01100001010000011101111161H41HDFH程序: MOVAL,’z’ANDAL,0DFH;(AL)=5AH2、TEST(Testornon_destructivelogicaland)测试指令格式:TESTdest,src;(dest)∧(src)

src:立即数、寄存器、存储器。

dest:寄存器、存储器。执行操作:二个操作数相与的结果不存,置标志位。操作类型举例:

TESTBH,7 ;寄存器∧立即数

TESTSI,BP ;寄存器∧寄存器

TESTDI,TABLE[BX] ;寄存器∧存储器

TEST[SI],CH ;存储器∧寄存器TESTWORDPTR[BX][DI],6ACEH;存储器∧立即数3、OR(Lgicalinclusiveor)逻辑“或”指令格式:ORdset,src;(dest)←(dest)(src)

dest:寄存器、存储器。

src:立即数、寄存器、存储器。执行操作:进行按位“或”运算两位操作数中任一位为1(或都为1), 则该位(结果)=1, 否则为0。操作类型举例:

ORBL,0F6H ;寄存器立即数

ORAH,BL ;寄存器

寄存器

OR CL,BETA[BX][DI] ;寄存器

存储器

OR GAMMA[SI],DX ;存储器

寄存器ORBYTEPTRMEM_BYTE,80H ;存储器

立即数∧∧∧∧∧∧注意:

“或”指令中操作数不能同时为存储器;影响条件码:CF=OF=0,A未定义,SFZFPF

(2)使某个操作数若干位保持不变,若干位与“0”或;

而若干位置1。若干位与“1”或。

将两个操作数信息组合。若(AL)=03H用OR指令组合使(AL)=33H=‘3’。

ORAL,30H;(AL)=33H用途:(1)清CF,自己与自己“或”,操作数不变,CF=0

例:ORAL,AL;(AL)不变,CF=04、XOR(Logicalexclusiveor)逻辑“异或”指令格式:XORdset,src

;B/W(dset)

(dset)

(src)

dest:寄存器、存储器。

src:立即数、寄存器、存储器。执行的操作:对指令的两个操作数进行按位“异或”运算。

两位不相同时为1,相同时为0。操作类型举例:XORDI,23F6HH ;寄存器

立即数XORSI,DX ;寄存器

寄存器XOR CL,BUFFER ;寄存器

存储器XOR MEM[BX],AX ;存储器

寄存器XOR byteptrTABLE[BP][SI],3DH;存储器

立即数注意:

“或”指令中操作数不能同时为存储器;

影响条件码:CF=OF=0,AF未定义,SFZFPF

用途:对某些特定位求反,某些特定位与“1”

其余位保持不变,保持不变与“0”

。应用举例:例1:将(AL)中的第1、3、5、7位求反

0、2、4、6位保持不变。

MOVAL,0FH XORAL,0AAH例2:比较三条(AX)清“0”指令:

XORAX,AX ;清AX,清CF。

SUBAX,AX ;清AX,清CF。

MOVAX,0;清AX,不影响标志位。

XOR清“0”指令在多字节累加程序中十分有用。5、NOT(Logicalnot)逻辑“非”指令格式:NOTdest;B/W

指令操作数只有一个,指令对操作数按位求反。执行操作:字节求反:(dest)

0FFH-(dest)

字求反:(dest

0FFFFH-(dest)

源操作数:寄存器、存储器。不能是立即数。

影响标志位:对标志位无影响。操作类型举例:NOTAH ;8位寄存器求反

NOTCX ;16位寄存器求反

NOTBYTEPTR[BP] ;8位存储器求反

NOTWORDPTRCOUNT;16位存储器求反综合举例:1.使某些位置“0”。

INAL,61H;(AL)=××××××××B ↑想使此位为0执行指令:ANDAL,0FDH

即可。2.使某些位置“1”。

INAL,61H;(AL)=××××××××↑想使此位为“1”执行指令:ORAL,02

3.使某些位求反:

INAL,61H;(AL)=××××××0×XORAL,02H⊕00000010 ××××××1× 4.测试某些位(测奇偶性): 测试“奇”“偶”性。

见TEST指令的用途例子。逻辑指令应用小结:(1)AND指令用来对指令的指定位清“0”。(2)OR指令常用来对某些位置1。(3)XOR指令用在程序开头,使某个寄存器清“0”。(4)NOT指令对某个数据取反,+1成补码。(5)TEST指令用来检测指定位为1,还是0。(二)移位指令

1、算术逻移位指令(4条):SHL,SHR,SAL,SAR

。(1)

SHL/SAL(Shiftlogicalleft/shiftarithmeticleft)

逻辑左移/算术左移指令(2)SHR(Shiftlogicalright)逻辑右移指令(3)SAR(Shiftarithmeticright)算术右移指令2、循环移位(4条):ROL,ROR,RCL,RCR。(1)ROL(Rotateleft)不含CF循环左移指令(2)ROR(Rotateright)不含CF循环右移指令(3)RCL(Rotateleftthroughcarry)含CF循环左移指令(4)RCR(Rotaterightthroughcarry)含CF循环右移指令共同点:(1)所有移位指令都可以作B/W操作。

(2)指令中的dest:寄存器、存储器寻址方式。(3)cnt:表示移位次数

cnt=1,1可写在指令中,不能是1以外的常数。 cnt>1,用CL存放移位次数,不能是其他寄存器。 如: SALAX,1 MOVCL,4 SALAX,CL标志位设置:算术逻移位移位指令:执行多次移位指令后对CF、OF的影响: CF=从目标操作数移出的最后一位;OF不定。执行一次移位指令指令后对CF、OF的影响: OF用于判断移位后最高有效位是否发生变化.

最高位与CF不等,

则:OF=1,

否则:无变化时,OF=0 CF根据各条指令的规定设置。

影响SF、ZF、PF,AF无定义。

循环移位指令:SF、ZF、PF、AF不影响。

OF、CF影响情况在指令中讲:

ROL、RCL影响标志OF、CF情况相同;

ROR、RCR影响标志OF、CF情况相同。1、算术/逻辑移位指令(4条):SHL,SHR, SAL,SAR

(1)

SHL/SAL(Shiftlogicalleft/shiftarithmeticleft)

逻辑左移/算术左移指令格式:SHLdest,cnt

;逻辑左移指令,B/W SALdest,cnt

;算术左移指令,B/W

dest:寄存器、存储器寻址方式。

cnt:表示移位次数

cnt=1,1可写在指令中。

cnt>1,用CL存放移位次数。执行操作:相当于无符号数的×2功能。

SHL/SAL指令操作示意图如下图所示:0CFdest

指令格式举例:

SHLAH,1 SALSI,CL SALWORDPTR[BX+5],1 SHLBYTEPTR[SI],CL(2)SHR(Shiftlogicalright)逻辑右移指令格式:SHRdest,cnt

;逻辑右移指令,B/W执行操作:相当于无符号数的÷2功能。

SHR指令操作示意图如下图所示:

dest:寄存器、存储器寻址方式。destCF0指令格式举例:

SHRBL,1 SHRAX,CL SHRBYTEPTR[DI+BP],1 SHRWORDPTRBLOCK,CL(3)SAR(Shiftarithmeticright)算术右移指令格式:SARdest,cnt

;算术右移指令,B/WSAR指令操作示意图如下图所示:最高位保持不变dest指令格式举例:

SARAL,1 SHRDL,CL SHRWORDPTRTABLE[SI],1 SHRBYTEPTRSTATUS,CLdest:寄存器、存储器寻址方式。应用举例:(BX)=84F0H

(1)若(BX)无符号数,求(BX)/2SHRBX,1;(BX)=4278CF=0,OF=1,SF=0,ZF=0

(2)若(BX)无符号数,求(BX)/4MOVCL,02H 或SARBX,1SARBX,CL SARBX,1

;CF=0,OF无意义,

SF=1,ZF=02、循环移位(4条):ROL,ROR,RCL,RCR。共同点:

ROL、ROR不含CF循环移位指令,操作数移动8次后还原。

RCL、RCR含CF循环移位指令,操作数移动9次后还原。影响标志OF、CFSF、ZF、PF、AF不影响。(1)ROL(Rotateleft)不含CF循环左移指令格式:ROLdest,cnt

;不含CF循环左移指令,B/W执行操作:ROL指令操作示意图如下图所示

移动8次后操作数还原。CFdest指令格式举例:

ROLBH,1 ROLDX,CL ROLWOR

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论