3.4.2 算术运算指令 ( arithmetic)

100
3.4.2 算算算算算算Arithmetic) 算算算算算算 算算算算算算算算8086/8088 8086/8088 算算算 算算 算算 算算算算算算算算算算 、、、 算算算 算算 算算 算算算算算算算算算算 、、、 算算算算算 (一)( Addition) 算算算算算 )( Subtraction) 算算算算算 )( Multiplication) 算算算算算 )( Division) 算算算算算算 算算 算算算算算算算 ()

Upload: chavi

Post on 11-Jan-2016

83 views

Category:

Documents


4 download

DESCRIPTION

3.4.2 算术运算指令 ( Arithmetic). 算术运算指令 内容: 8086/8088提供加、减、乘、除等六种基本算术操作 (一)加法指令( Addition) ( 二)减法指令( Subtraction) ( 三)乘法指令( Multiplication) ( 四)除法指令( Division) ( 五)符号扩展指令 (六)十进制调整指令. 特点: 大部分都影响标志位 ,不同指令影响不同: (1) 加、减法指令影响 SF,ZF,AF,PF,CF,OF; (2) 加1和减1指令不影响 CF; - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 3.4.2  算术运算指令 ( Arithmetic)

3.4.2 算术运算指令( Arithmetic)

算术运算指令算术运算指令内容:• 8086/80888086/8088 提供加、减、乘、除等六种基本算术操作提供加、减、乘、除等六种基本算术操作(一)加法指令( Addition)

(二)减法指令( Subtraction)

(三)乘法指令( Multiplication)

(四)除法指令( Division)

(五)符号扩展指令(六)十进制调整指令

Page 2: 3.4.2  算术运算指令 ( Arithmetic)

特点:特点:• 大部分都影响标志位大部分都影响标志位 , 不同指令影响不同 :

(1) 加、减法指令影响 加、减法指令影响 SF,ZF,AF,PF,CF,OF;SF,ZF,AF,PF,CF,OF;

(2) (2) 加加 11 和减和减 11 指令不影响指令不影响 CF;CF;

(3) (3) 乘法指令影响乘法指令影响 CF,OF;CF,OF;

(4) (4) 除法指令使大部分标志位的状态不确定除法指令使大部分标志位的状态不确定 ;;

(5) (5) 对对 BCDBCD 码调整指令对标志位的影响不同码调整指令对标志位的影响不同 ;;

(6) (6) 转换指令对标志位无影响转换指令对标志位无影响• 都可以用于字节、字的运算都可以用于字节、字的运算 ;;

• 双操作数指令除源为立即数外,其余必须有一个操作数 双操作数指令除源为立即数外,其余必须有一个操作数 为寄存器;单操作数指令不能为立即数。为寄存器;单操作数指令不能为立即数。

Page 3: 3.4.2  算术运算指令 ( Arithmetic)

80868086 具有具有 55 种加法操作指令种加法操作指令 ::

1 、 ADD(Addition) 加法指令

2 、 ADC(Add with carry) 带进位加法指令

3 、 INC(Increment by 1) 加 1 指令

44、、 AAA(ASCII adjust for addition)AAA(ASCII adjust for addition) 加法加法 ASCIIASCII 调整指令调整指令

55、、 DAA(Decimal adjust for addition)DAA(Decimal adjust for addition) 加法十进制调整指令加法十进制调整指令

(一)加法指令( Addition)

Page 4: 3.4.2  算术运算指令 ( Arithmetic)

指令格式: ADD dst , src ;(dst) (dst)+(src)

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

dstdst ::寄存器,存储器。寄存器,存储器。

例:ADD CL,10 ; 寄存器 + 立即数

ADD DX,SI ; 寄存器 + 寄存器

ADD AX, MEM ; 寄存器 + 存储器

ADD DATA[BX], AL ; 存储器 + 寄存器

ADD BYTE PTR ALPHA[DI],30H; 存储器 + 立即数

1 、 ADD(Addition) 加法指令

Page 5: 3.4.2  算术运算指令 ( Arithmetic)

格式: ADC dst, src ;( dst ←) ( dst) +( src)+CFCF

CF:CF: 进位标志 CF 的现行值 ( 上条指令上条指令 CFCF 值值 )

特点 : 与 ADD 同。

用途:主要用于多字节运算中。

例:

ADC CX, 300 ; 寄存器 + 立即数 +CF

ADC AL, BL ; 寄存器 + 寄存器 +CF

ADC DX, COUNT[SI] ; 寄存器 + 存储器+ CF

ADC BLOCK[DI], BX ; 存储器 + 寄存器 +CF

ADC BYTE PTR MEM, 6 ; 存储器 + 立即数 +CF

2 、 ADC(Add with carry) 带进位加法指令

Page 6: 3.4.2  算术运算指令 ( Arithmetic)

应用举例:计算两个多字节数相加 3B74AC60F8H+20D59E36C1H=?两个多字节数存放在:DATA1,DATA2 开始的单元。

F8H

60H

ACH

74H

3BH

.. .

C1H

36H

9EH

D5H

20H

.. .

DATA1

DATA2

流程图多字节数内存存放

开始

CX初始化,置循环次数SI CF清 、

取一个字节加数

取一个被加数字节相加送内存

SI)+1 SI)( 送(

(CX)-1 (CX)送

(CX)=?0

结束

N

Y

Page 7: 3.4.2  算术运算指令 ( Arithmetic)

程序:MOV CX, 5MOV SI, 0 ; 清 SICLC ;清 CF

LOOPER: MOV AL, DATA2[SI]ADC DATA1[SI],ALINC SI ;(SI)+1 (SI)DEC CX ;(CX)-1 (CX)JNZ LOOPER ;(CX)0 转HLT ;停机

Page 8: 3.4.2  算术运算指令 ( Arithmetic)

特点特点:• 可以进行可以进行 88 位、位、 1616 位的位的无符号数和带符号数无符号数和带符号数的加法运算;的加法运算;• 源操作数和目标操作数源操作数和目标操作数不能同时为存储器不能同时为存储器 , , 不能为段寄存器不能为段寄存器;• 指令影响标志位的情况指令影响标志位的情况:

OF=1OF=1, 8 位带符号数相加,和超出范围(- 128 ~+ 127 ) ,

16 位带符号数相加,和超出范围 (-32768~+32767);

CF=1CF=1, 8 位无符号数相加,和超过 255 ,

16 位无符号数相加,和超过 65535 。

其他条件标志( SF,AF,PF,ZF) 根据定义设定。

Page 9: 3.4.2  算术运算指令 ( Arithmetic)

例: MOV AL,7EH ;(AL)=7EH

MOV BL, 5BH ;(BL)=5BH

ADD AL,BL ;(AL)=7EH+5BH=D9H

影响标志位的情况 :

SF=1 , 结果最高位= 1

ZF=0 ,结果不等于 0

AF=1 , D3 位向 D4 有进位

PF=0 ”, 1” 的个数为奇数

CF=0 ,无进位

OF=1 ,和超过+ 127

(两个正数相加,结果为负;反之亦是)(两个正数相加,结果为负;反之亦是)

1 1 1 1 1 1 00

0 1 0 1 1 0 1 1+

1 1 0 1 1 0 0 1

AF=1

Page 10: 3.4.2  算术运算指令 ( Arithmetic)

分析两标志位分析两标志位( 1 )什么叫溢出?溢出?什么什么叫进位?进位?

( 2 ) 有进位就有溢出,没有进位就没有溢出?有进位就有溢出,没有进位就没有溢出?

( 1 )解答:解答:

溢出溢出 ------------ 通常是指通常是指带符号数的补码溢出溢出。。

补码运算能表示范围为 :-2 n-1 ~+2 n+1 –1 ,如果运算结果超出该范围,叫补码溢出溢出,此时,此时 OF=1 ,故用 OF 标志判断带符号数带符号数运算是否超范围(结果溢出)溢出)。

进位进位 ------------ 是指是指运算结果的最高位向更高位的进位。进位。

有进位,有进位, CF=1CF=1 ;;无进位, 无进位, CF=0CF=0 ,,用 CF 标志判断无符号数无符号数运算是否超范围(结果溢出)溢出) 。

问题思考问题思考:

Page 11: 3.4.2  算术运算指令 ( Arithmetic)

(( 22 ))有进位就有溢出,没有进位就没有溢出?有进位就有溢出,没有进位就没有溢出?

结论:结论: 有进位不一定有溢出 , 没有进位不一定没有溢出。

以 8 位二进制数为例分析一下数的溢出与进位情况:

下面分 4 种情况加以讨论:

( 1 )带符号数和无符号数都不溢出

( 2 )无符号数溢出

( 3 )带符号数溢出

( 4 )带符号数和无符号数都溢出

Page 12: 3.4.2  算术运算指令 ( Arithmetic)

(( 11 ))带符号数和无符号数都不溢出带符号数和无符号数都不溢出。二进制数 看作无符号数 看作带符号数

0 0 0 0 0 1 0 0

0 0 0 0 1 0 1 1+

0 0 0 0 1 1 1 1

4

11+

15

+ 4

+1 1+

+1 5

相加

标志 CF=0,OF=0 CF=0 OF=0

溢出 不溢出 不溢出

不溢出同符号数相加,结果符号与其相同

Page 13: 3.4.2  算术运算指令 ( Arithmetic)

(( 22 ))无符号数溢出无符号数溢出

二进制数 看作无符号数 看作带符号数

0 0 0 0 0 1 1 1

1 1 1 1 1 0 1 1+

0 0 0 0 0 0 1 0

7

251+

258

+ 7

- 5+

+ 2

相加

标志 CF=1,OF=0 CF=1 OF=0

溢出 无符号数溢出 溢出结果应为 2 ,错

不溢出异号数相加

不可能有溢出

CF=1

Page 14: 3.4.2  算术运算指令 ( Arithmetic)

(( 33 ))带符号数溢出带符号数溢出

二进制数 看作无符号数 看作带符号数

0 0 0 0 1 0 0 1

0 1 11 1 1 1 0 0+

1 0 0 0 0 1 0 1

9

124+

133

+ 9

+1 2 4+

+1 3 3

相加

标志 CF=0,OF=1 CF=0 OF=1

溢出 带符号数溢出 不溢出

溢出 123结果为-

结果错

Page 15: 3.4.2  算术运算指令 ( Arithmetic)

(( 44 ))带符号数和无符号数都溢出带符号数和无符号数都溢出

二进制数 看作无符号数 看作带符号数

1 0 0 0 0 1 1 1

1 1 1 1 0 1 0 1+

0 1 1 1 1 1 0 0

135

245+

380

121-

- 11+

132-

相加

标志 CF=1,OF=1 CF=1 OF=1

溢出 无符号数溢出溢出

现结果为124,结果错

溢出124现结果为 ,

结果错

CF=1

Page 16: 3.4.2  算术运算指令 ( Arithmetic)

( 1 )带符号数相加是否溢出根据 OF= 1 ?判断。

OF=1OF=1 ,,同符号数相加,结果符号与其相反,产生溢出;同符号数相加,结果符号与其相反,产生溢出;

OF=0OF=0 ,同符号数相加,结果符号与其相同,不产生溢出;,同符号数相加,结果符号与其相同,不产生溢出;

异号数相加,不可能溢出。异号数相加,不可能溢出。

( 2 )无符号数相加是否溢出根据 CF= 1 ?判断。

CF=1,CF=1, 无符号数相加产生溢出。无符号数相加产生溢出。

( 3 )对标志的解释,取决于程序员。如带符号数只关心OF、 SF ;无符号数只关心 CF ,而 OF、 SF 无意义 。 。

结论结论::

Page 17: 3.4.2  算术运算指令 ( Arithmetic)

格式: INC dst ;( B/W) , (dst)←( dst) +1

dst : 寄存器、存储器。不能是段寄存器。寄存器、存储器。不能是段寄存器。

功能:对指定的目标操作数 +1 操作数单元。

用途:用于在循环程序中修改地址指针和循环次数。

标志位影响情况:影响 SF,ZF,AF,PF,OF。

不影响不影响 CFCF。。

3、 INC (Increment by 1 ) 加 1 指令

Page 18: 3.4.2  算术运算指令 ( Arithmetic)

操作数类型:可以是寄存器,存储器,不能是段寄存器。操作数类型:可以是寄存器,存储器,不能是段寄存器。

例: INC DL ; 8 位寄存器+ 1

INC SI ; 16 位寄存器+ 1

INC BYTE PTR [BX][SI] ;存储器+ 1 (字节操作)

INC WORD PTR [DI] ;存储器+ 1 (字操作)

INC DS ; 错

Page 19: 3.4.2  算术运算指令 ( Arithmetic)

8086 有 7 条减法指令 :

1、 SUB(Subtraction) 减法指令

2、 SBB(Subtraction with borrow) 带进位减法指令

3、 DEC(Decrement by 1 ) 减 1 指令

4、 NEG(Negate) 求补指令

5、 CMP(Compare) 比较指令

6、 AAS(ASCII adjust for subtraction) 减法 ASCII 调整指令

7、 DAS(Decimal adjust for subtraction) 减法十进制调整指令

(二)减法指令( Subtraction)

Page 20: 3.4.2  算术运算指令 ( Arithmetic)

格式: SUB dst, src;( dst ←) ( dst) -( src)

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

dstdst ::寄存器,存储器。寄存器,存储器。

例: SUB AL,37H ; 寄存器 - 立即数

SUB BX,DX ; 寄存器 - 寄存器

SUB CX, VAR1 ; 寄存器 - 存储器

SUB ARRAY[SI], AX ; 存储器 - 寄存器

SUB WORD PTR [BX][DI],512H ; 存储器减立即数

这种指令影响标志位 : AF、 CF、 OF、 PF、 SF、 ZF 标志。

CF=1, 无符号数小减大,运算结果溢出;

OF=1 ,带符号数运算溢出。

1、 SUB(Subtraction) 减法指令

Page 21: 3.4.2  算术运算指令 ( Arithmetic)

格式:: SBB dst, src;( dst ←) ( dst) -( src) -CF

CF: 借位标志 CF 的现行值 ( 上条指令 CF 值 )

SrcSrc ::立即数,寄存器,存储器;立即数,寄存器,存储器;dstdst ::寄存器,存储器。寄存器,存储器。

指令影响标志位、 B/W 数运算情况同 SUB。用途:用于多字节数相减。例:

SBB BX,100H ; 寄存器 - 立即数 -CF

SBB CX,DX ; 寄存器 - 寄存器 -CF

SBB AL, DATA1[SI] ; 寄存器 - 存储器 -CF

SBB DISP[BP], BL ; 存储器 - 寄存器 -CF

SBB BYTE PTR ALPHA[SI+6], 96H; 存储器 - 立即数 -CF

2、 SBB(Subtraction with borrow) 带借位减法指令

Page 22: 3.4.2  算术运算指令 ( Arithmetic)

格式: DEC dst ;( B/W) (dst)←( dst) -1

dst : dst : 寄存器寄存器 、存储器。不能是段寄存器。、存储器。不能是段寄存器。

功能:对指定的目标操作数 -1 操作数单元。

用途:用于在循环程序中修改地址指针和循环次数。

标志位影响情况:影响 SF,ZF,AF,PF,OF。

不影响 CF。

3、 DEC (Decrement by 1 ) 减 1 指令

Page 23: 3.4.2  算术运算指令 ( Arithmetic)

DEC 用途举例:…MOV AX , 0FFFFH

CYC: DEC AXJNZ CYCHLT…

用于延时时间。

Page 24: 3.4.2  算术运算指令 ( Arithmetic)

格式: NEG dst ;B/W, (dst) ← 0 - (dst)

dst : 寄存器 、存储器。

操作 : 把操作数按位求反后末位 +1 。

( dst ← ) 0FFFFH -( dst) +1

影响标志: AF、 CF、 OF、 PF、 SF、 ZF。

CF: 操作数为 0 时求补 ,CF=0 ; 其他情况均使 CF=1.

OF: 对- 128 或- 32768 求补, OF=1; 否则 OF=0.

4、 NEG (Negate) 求补指令

Page 25: 3.4.2  算术运算指令 ( Arithmetic)

应用举例:求绝对值

在内存中,从 AREA1 开始存放100 个带符号数。

求各数的绝对值存于AREA2 的开始单元。

流程图

开始

初始化置源地址,置目的地址指针

置循环次数

取一个带符号数

负数?

求补

送存

1地址指针+

1循环次数-

0循环次数= ?

结束

N

Y

N

Y

Page 26: 3.4.2  算术运算指令 ( Arithmetic)

程序:LEA SI, AREA1LEA DI, AREA2MOV CX, 100

CHECK: MOV AL, [SI]OR AL, AL ;(AL) 内容不变,置标志JNS NEXT ; SF=0转 NEXTNEG AL ; 负数求补

NEXT: MOV [DI], AL ;送目标INC SIINC DIDEC CXJNZ CHECKHLT

Page 27: 3.4.2  算术运算指令 ( Arithmetic)

格式: CMP dst, src ; B/W (( dstdst)) --(( srcsrc))

结果不回送,只置标志。结果不回送,只置标志。

影响标志: AF、 CF、 OF、 PF、 SF、 ZF 。

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

dst :寄存器,存储器。

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

CMP CX, DI ; 寄存器与寄存器比较

CMP AX, AREA1 ; 寄存器与存储器比较

CMP [BX+5], SI ; 存储器与寄存器比较

CMP WORD PTR AMMA,100H; 存储器与立即数比较

5、 CMP(Compare) 比较指令

Page 28: 3.4.2  算术运算指令 ( Arithmetic)

用途: 用比较指令来比较两个数之间的关系:

两者是否相等,两个数中哪个大。

( 1 ) 根据 ZF 标志,判断两者是否相等;

( 2 )根据 CF 标志, 判断两个无符号数的大小;

( 3 )用 SF、 OF 标志,判断二个带符号数的大小。

Page 29: 3.4.2  算术运算指令 ( Arithmetic)

(( 11 ) 根据) 根据 ZFZF 标志,可判断两者是否相等标志,可判断两者是否相等例: CMP AX, BX

ZF=1, (AX) = (BX), 两者相等ZF=0, (AX) = (BX), 两者不相等

(( 22 ))根据根据 CFCF 标志, 判断两个无符号数的大小标志, 判断两个无符号数的大小例: 比较 AX,BX 寄存器 , 将大数 ( AX )

CMP AX, BX

JNC NEXT ; CF=0转 NEXT

XCHG AX, BX

NEXT ……:结论: CF=0 ,(AX) > (BX); CF=1, (AX) < (BX)

(( 33 ))用用 SFSF、、 OFOF 标志,判断二个带符号数的大小(分析略)标志,判断二个带符号数的大小(分析略)

Page 30: 3.4.2  算术运算指令 ( Arithmetic)

(三)乘法指令( Multiplication)

• 可对字节、字进行操作;两个 8位数相乘,结果为 16位数,两个 16位数相乘,结果为 32位数;• 可对无符号整数或有符号整数进行操作;对应有两条乘法指令。

1 、 MUL( Multiply) 无符号数乘法指令

格式: MUL src ; 字节操作 ( AX ←) ( AL) ×( src) ; 字操作 ( DX) , ( AX ←) ( AX) ×( src) 2 、 IMUL( Integer Multiply) 有符号数乘法指令

格式: IMUL src ; 执行的操作同 MUL,只是处理的数据是带符号的。

Page 31: 3.4.2  算术运算指令 ( Arithmetic)

例:MUL CLIMUL DLMUL BYTE PTR[BX]IMUL NUMR

说明:

1 、被乘数(即 dst)隐含在 AL或 AX中,乘数(即src)由指令寻址,其寻址方式可以是除立即寻址方式之外的任何数据寻址方式,同时,它也决定了乘法是字运算还是字节运算。

2、乘法指令对除 CF和 OF以外的标志位无定义(即状态不定),如果乘积的高一半为 0(或为符号位),则 CF和 OF均为 0,否则均为 1。

Page 32: 3.4.2  算术运算指令 ( Arithmetic)

(四)除法指令( Division)除法与乘法指令一样•可对字节、字进行操作;但字节除法是用 16位数除以 8位数,字除法是用 32位数除以 16位数。• 可对无符号整数或有符号整数进行操作;对应有两条除法指令。1 、 DIV(Division) 无符号数除法指令

格式: DIV src ; 字节操作 ( AL ←) ( AX) /( src)的商

( AH ←) ( AX) /( src)的余数

; 字操作 ( AX ←) ( DX,AX) /( src)的商

( DX ←) ( DX,AX) /( src)的余数

2 、 IDIV(Integer Division) 有符号数除法指令

格式: IDIV src ; 执行的操作同 DIV ,只是处理的数据是带符号的,商和余数均为有符号数,余数符号同被除数符号。

Page 33: 3.4.2  算术运算指令 ( Arithmetic)

例:DIV CLIDIV DLDIV BYTE PTR[BP]IDIV WORD PTR[BX]

说明:

1 、被除数(即 dst)隐含在 AX 或 (DX,AX)中,除数(即 src)由指令寻址,其寻址方式可以是除立即寻址方式之外的任何数据寻址方式,同时,它也决定了除法是字运算还是字节运算。

2、除法指令对所有标志位无定义(即状态不定)。

3、执行除法指令时如果产生商溢出,微处理器就会产生除法错中断。

Page 34: 3.4.2  算术运算指令 ( Arithmetic)

(五)符号扩展指令

功能:将带符号的字节类型( 8位)数据扩展为字类型( 16位);将带符号的字类型( 16位)数据扩展为双字类型( 32位)。

1 、 CBW(Convert Byte to Word)字节转换为字指令

格式: CBW ; 将 (AL)的符号扩展到 (AH)中去。

0 • • • • • • 0 0 AH ALD7 D0 D7 D0

正数

1 • • • • • • 1 1 AH ALD7 D0 D7 D0

负数

* 指令执行后不影响标志位

Page 35: 3.4.2  算术运算指令 ( Arithmetic)

2 、 CWD(Convert Word to Double Word)字转换为双字指令

格式: CWD ; 将 (AX)的符号扩展到 (DX)中去。

0 • • • • • • 0 0 DX AX

D15 D0 D15 D0正数

1 • • • • • • 1 1 DX AXD15 D0 D15 D0

负数

* 指令执行后不影响标志位

Page 36: 3.4.2  算术运算指令 ( Arithmetic)

例: 使 NUMB2字节存储单元的内容除以 NUMB1字节存储单元的内容,将商存于 ANSQ字节单元中,余数存于 ANSR字节单元中。

MOV AL,NUMB2CBWIDIV NUMB1MOV ANSQ,AL;商MOV ANSR,AH;余数

Page 37: 3.4.2  算术运算指令 ( Arithmetic)

(六)十进制调整指令

11、、 AAA(ASCII adjust for addition)AAA(ASCII adjust for addition) 加法加法 ASCIIASCII 调整指令调整指令

22、、 DAA(Decimal adjust for addition)DAA(Decimal adjust for addition) 加法十进制调整指令加法十进制调整指令

3、 AAS(ASCII adjust for subtraction) 减法 ASCII 调整指令

4、 DAS(Decimal adjust for subtraction) 减法十进制调整指令

Page 38: 3.4.2  算术运算指令 ( Arithmetic)

DAA 指令

格式: DAA;调整 (AL)中压缩的二进制 BCD码的和。方法是:若 AF=1 or (AL)低 4位 >9 ,则 (AL)加 06H,且自动置 AF=1;若 CF=1 or (AL)高 4位 >9 ,则 (AL)加 60H,且自动置 CF=1。

说明:1、该指令对 PSW中的 OF标志无定义,会影响所有其他标志位。2、该指令应紧跟在加法指令后使用。调整后的和存入 AL中。

Page 39: 3.4.2  算术运算指令 ( Arithmetic)

BCD 码运算规则: BCD 码是十进制数,运算时应满足逢十进一规则;而运算器对数据运算时,都是按照二进制运算规则进行处理的,( BCD 码为 4 位二进制数,是逢十六进一)故将 BCD 码传给运算器进行运算时,其结果需要修正。例:计算 1+8 的值

0 0 0 1+ 1 0 0 0 1 0 0 1 1+8=9 正确

例:计算 5+7 的值 0 1 0 1+ 0 1 1 1 1 1 0 0+ 0 1 1 01 0 0 1 0

结果大于 9加 6 修正5+7=12 正确

Page 40: 3.4.2  算术运算指令 ( Arithmetic)

1、 AND( Logical and ) 逻辑“与”指令

2、 TEST( Test or non-dstructive logical and ) 测试指令

3、 OR( Logical inclusive or ) 逻辑“或”指令

4、 XOR( Logical exclusive or) 逻辑“异或”指令

5、 NOT( Logical not ) 逻辑“非”指令

特点:特点:• 8086 可以对 8 位,或 16 位操作数执行逻辑操作。• 逻辑运算是按位操作的逻辑运算是按位操作的。。• 影响标志位: ( NOT 指令除外,其他指令同)

CFCF== OF=0OF=0 , AF未定义 , SF ZF PF (SF ZF PF ( 根据运算结果根据运算结果设置)设置)

↕↕ ↕ ↕ ↕ ↕

3.4.3 逻辑运算和移位指令(一)逻辑运算指令(一)逻辑运算指令

Page 41: 3.4.2  算术运算指令 ( Arithmetic)

格式: AND dst, src ; B/W,( dst)( dst ∧ )( src)

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

dst: dst: 寄存器、存储器。寄存器、存储器。

注意:“与”指令中操作数不能同时为存储器。注意:“与”指令中操作数不能同时为存储器。

两位中有一位为 0 (或二位都为 0 ),则结 果 为 0 ,否则为1 。举例: AND AL, 0FH ;寄存器 ∧ 立即数

AND CX, DI ; 寄存器 ∧ 寄存器

AND SI, MEM_NAME ; 寄存器 ∧ 存储器

AND ALPHA [DI], AX ; 存储器 ∧ 寄存器

AND word ptr [BX][SI], 0FFFEH ; 存储器 ∧ 立即数

11、、 ANDAND(( Logical and )Logical and ) 逻辑“与”指令逻辑“与”指令

Page 42: 3.4.2  算术运算指令 ( Arithmetic)

“ 与”指令的用途:

(1) 清清 CF , CF , 自己“与”自己, 操作数不变 ,自己“与”自己, 操作数不变 , CF=0CF=0

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

(2) 使操作数中若干位保持不变,若干位清“操作数中若干位保持不变,若干位清“ 0 “0 “ ;保持;保持不 变的位与“不 变的位与“ 1”1” 相与相与;清“清“ 0 “0 “ 的位与“的位与“ 0” 0” 相与。相与。

例: 若( AL)=433H

AND AL, 0FFH ; (AL)=03H, (AL)(AL)0~30~3 不变不变;

;((AL)AL)4~74~7=0H,=0H,屏蔽高屏蔽高 44 位位。

Page 43: 3.4.2  算术运算指令 ( Arithmetic)

0110 0001

0100 0001

1101 1111

61H

41H

DFH

“与”指令应用举例

例:将英文小写字母 ASCII 转换成大写。

小写英文字母 ASCII 为: ‘ a’~’z’ 61H~7AH

大写英文字母 ASCII 为: ‘ A’~’Z’ 41H~5AH

程序:

MOV AL, ’z’

AND AL, 0DFDFH ; (AL)=5AH

Page 44: 3.4.2  算术运算指令 ( Arithmetic)

格式: TEST dst , src ; B/W ,( dst ∧) ( src)

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

dst: dst: 寄存器、存储器。寄存器、存储器。执行操作: 二个操作数相与的结果不保存,置标志位。

操作类型举例:TEST BH, 7 ; 寄存器 ∧ 立即数TEST SI , BP ;寄存器 ∧ 寄存器TEST DI ,TABLE[BX] ; 寄存器 ∧ 存储器TEST [SI],CH ;存储器 ∧ 寄存器

TEST word ptr [BX][DI], 6ACEH ;存储器 ∧ 立即数

22 、 、 TESTTEST( Test or non_dstructive logical and ) 测试指测试指令令

Page 45: 3.4.2  算术运算指令 ( Arithmetic)

用途:是条件转移指令的先行指令,常用于检测一些条件是否满用于检测一些条件是否满足足,但又不希望改变原有的操作数的情况,检测的位与“检测的位与“ 1”1” 相相与与;不检测的位与“不检测的位与“ 0” 0” 相与。相与。在此指令后边常加一条条件转移指令。例:判断 A 单元中数据的奇偶性设: ( A L) = 0AEH

程序: MOV AL, A ; (AL)=0AEH

TEST AL, 01H

JZ EVEN ; 结果 =0 为偶数转 EVEN …

奇数处理 …

EVEN :偶数处理检测( AL )的最低位是否为 0 ,若为 0转 EVEN

Page 46: 3.4.2  算术运算指令 ( Arithmetic)

格式: OR dst, src ; B/W ,( dst ←) ( dst )( src)

dst: dst: 寄存器、存储器。寄存器、存储器。

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

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

两位操作数中任一位为 1 (或都为 1 ), 则该位(结果) =1 , 否则为 0 。

举例:OR BL,0F6H ; 寄存器 立即数OR AH, BL ;寄存器 寄存器OR CL ,BETA[BX][DI] ; 寄存器 存储器OR GAMMA[SI] ,DX ;存储器 寄存器

OR BYTE PTR MEM_BYTE , 80H ;存储器 立即数

∧∧∧∧∧

33、、 OROR(( Logical inclusive or )Logical inclusive or ) 逻辑“或”指令逻辑“或”指令

Page 47: 3.4.2  算术运算指令 ( Arithmetic)

影响标志位: CF=0F=0 , AF未定义 , SF ZF PF

↕ ↕ ↕

用途:

( 1 )清 CF , 自己与自己“或”自己与自己“或” ,, 操作数不变,操作数不变, CF=0CF=0

例: OR AL,AL ;( AL )不变, CF=0

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

(3) 将两个操作数信息组合。

若( AL) =03H 用 OR 指令组合使( AL) =33H=’3’ 。

OR AL, 30H ;( AL) =33H

Page 48: 3.4.2  算术运算指令 ( Arithmetic)

格式: XOR dst , src ; B/W( dst ) ( dst ) ( src)

dst: dst: 寄存器、存储器。寄存器、存储器。

src: src: 立即数、寄存器、存储器。立即数、寄存器、存储器。执行的操作:对指令的两个操作数进行按位“异或”运算;二二位不相同时为位不相同时为 1, 1, 相同时为相同时为 00 。

注意: “异或”指令中操作数不能同时为存储器。“异或”指令中操作数不能同时为存储器。

举例:XOR DI, 23F6HH ; 寄存器 立即数XOR SI , DX ;寄存器 寄存器XOR CL , BUFFER ; 寄存器 存储器XOR MEM[BX],AX ;存储器 寄存器

XOR byte ptrTABLE[BP][SI], 3DH ; 存储器 立即数

44、、 XORXOR(( Logical exclusive or)Logical exclusive or) 逻辑“异或”指令逻辑“异或”指令

Page 49: 3.4.2  算术运算指令 ( Arithmetic)

影响标志位: CF= 0F=0 , AF未定义 , SF ZF PF

↕ ↕ ↕

用途:( 1 )使操作数清 0 ,同时清 CF , 自己与自己“异自己与自己“异或”或” ,, 操作数清操作数清 00,, CF=0CF=0

例: XOR AL,AL ;( AL ) =0, CF=0

(( 22 )对某些特定位求反时,这些特定位与“)对某些特定位求反时,这些特定位与“ 1” 1” ;;

让某些位保持不变时,这些位与“让某些位保持不变时,这些位与“ 0” 0” 。。

例:将( AL )中的第 1 、 3 、 5 、 7 位求反,

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

MOV AL, 0FH

XOR AL,0AAH

Page 50: 3.4.2  算术运算指令 ( Arithmetic)

( 3 )异或指令常用于判断两个操作数是否相等。

例:测试( AL) 中的值是否等于 33H。XOR AL, 33HJZ MATCH

比较三条( AX)清“ 0” 指令:

XOR AX , AX ; 清 AX , 清 CF,2 个字节, 3个 T。 SUB AX, AX ;清 AX , 清 CF,2 个字节, 3个 T。 MOV AX , 0 ;清 AX , 不影响标志位, 3 个字节, 4个T。

XOR清“ 0” 指令在多字节累加程序中十分有用。

Page 51: 3.4.2  算术运算指令 ( Arithmetic)

格式: NOT dst ; B/W

指令操作数只有一个 , 指令对操作数按位求反对操作数按位求反。

执行操作: 字节求反:( dst) 0FFH-( dst)

字求反: ( dst) 0FFFFH-( dst)

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

影响标志位:对标志位无影响。

例: NOT CX ; 16 位寄存器求反

NOT BYTE PTR [BP] ; 8 位存储器求反

例 : NOT AL

执行前( AL) =00111100B, 执行后( AL) =11000011B

55、、 NOTNOT(( Logical not )Logical not ) 逻辑“非”指令逻辑“非”指令

Page 52: 3.4.2  算术运算指令 ( Arithmetic)

综合举例:1.使某些位置“ 0” 。

IN AL, 61H;( AL) =×××× ×× × ×B

↑ 设备控制寄存器 ↑想使此位为 0

执行指令: AND ALAND AL,, 0FDH0FDH 即可。

2. 使某些位置“ 1” 。 IN AL, 61H;( AL) =×××× ××××B

执行指令: OR ALOR AL,, 0202 ↑想使此位为“ 1”

3. 使某些位求反。IN AL, 61H ;( AL) = × × × × × × 0 ×

XOR ALXOR AL,, 02H02H 0 0 0 0 0 0 1 0 ⊕

× × × × × × 1 ×

Page 53: 3.4.2  算术运算指令 ( Arithmetic)

( 1) AND 指令用来对指令的指定位清“ 0” 。

( 2) OR 指令常用来对某些位置 1 。

( 3) XOR 指令用在程序开头,使某个寄存器清“ 0” ;还常用来对某些位取反。

( 4) NOT 指令对某个数据取反, +1成补码。

( 5) TEST 指令用来检测指定位为 1 ,还是 0 。

逻辑指令应用小结:逻辑指令应用小结:

Page 54: 3.4.2  算术运算指令 ( Arithmetic)

(8086(8086 有有 88 条移位指令条移位指令 ) )

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

SARSAR 。

( 1 )、 SHL/SAL(Shift logical left/shift arithmetic left)

逻辑左移 / 算术左移指令( 2 )、 SHR (Shift logical right ) 逻辑右移指令( 3 )、 SAR (Shift arithmetic right ) 算术右移指令22 、循环移位、循环移位( 4 条) : ROL, ROR , RCL, RCRROL, ROR , RCL, RCR。

( 1)、 ROL (Rotate left ) 不含 CF 循环左移指令( 2 )、 ROR (Rotate right ) 不含 CF 循环右移指令( 3 )、 RCL (Rotate left through carry )含 CF 循环左移指令( 4 )、 RCR (Rotate right through carry )含 CF 循环右移指令

(二)移位指令(二)移位指令

Page 55: 3.4.2  算术运算指令 ( Arithmetic)

共同点:• 所有移位指令都可以作 B/W 操作。 • 指令中的 dst : dst : 寄存器、存储器寻址方式。寄存器、存储器寻址方式。• cnt : 表示移位次数

cnt=1, 1 可写在指令中,不能是 1 以外的常数。 cnt>1 ,用 CL 存放移位次数 , 不能是其他寄

存器。

如: SAL AX, 1

MOV CL, 4

SAL AX, CL

• 利用移位指令编制乘除程序,执行时间比直接用乘除指令快, 速度可提高 5-6倍。

Page 56: 3.4.2  算术运算指令 ( Arithmetic)

标志位设置:• 算逻移位指令 :执行多次移位指令后对 CF、 OF 的影响 :

CF=从目标操作数移出的最后一位; OF 不定。执行一次移位指令指令后对 CF、 OF 的影响 :

OF 用于判断移位后最高有效位是否发生变化 .

移位后最高位的值被改变, OF = 1 ; 否则,无变化时, OF = 0,

CF 根据各条指令的规定设置。 SF、 ZF、 PF, AF 无定义。

↕ ↕ ↕

• 循环移位指令: SF、 ZF、 PF、 AF 不影响。 OF、 CF 影响情况在指令中讲 :

ROLROL 、 、 RCLRCL 影响标志影响标志 OFOF、、 CFCF 情况相同 ;情况相同 ; ROR ROR 、 、 RCRRCR 影响标志影响标志 OFOF、、 CFCF 情况相同 。情况相同 。

Page 57: 3.4.2  算术运算指令 ( Arithmetic)

4 条 : SHL , SHR, SAL , SARSHL , SHR, SAL , SAR

( 1 )、 SHL/SAL(Shift logical left/shift arithmetic left)

逻辑左移 / 算术左移指令

格式: SHL dst ,cnt ;逻辑左移指令 , B/W

SAL dst ,cnt ;算术左移指令 , B/W

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

cnt : 表示移位次数

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

cnt>1 ,用 CL 存放移位次数 。

11 、 算逻移位指令、 算逻移位指令

Page 58: 3.4.2  算术运算指令 ( Arithmetic)

执行操作:相当于无符号数 ×2 功能。

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

指令格式举例:

SHL AH,1

SAL SI, CL

SAL WORD PTR [BX+5] ,1

SHL BYTE PTR , CL

0CF

dst

Page 59: 3.4.2  算术运算指令 ( Arithmetic)

( 2 )、 SHR (Shift logical right )逻辑右移指令

格式: SHR dst ,cnt ;逻辑右移指令 , B/W

执行操作:相当于无符号数 ÷2 功能。

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

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

指令格式举例:SHR BL , 1SHR AX , CLSHR BYTE PTR [DI+BP],1SHR WORD PTR BLOCK ,CL

dst

CF0

Page 60: 3.4.2  算术运算指令 ( Arithmetic)

(( 33 )、)、 SARSAR (Shift arithmetic right ) 算术右移指令算术右移指令

格式: SAR dst ,cnt ;算术右移指令 , B/W

执行操作:相当于带符号数 ÷2 功能 , 对负数向下舍入

IDIV 指令对负数向上舍入。 ( 下页解释)

SAR 指令操作示意图如下图所示dst

dst : dst : 寄存器、存储器寻址方式。寄存器、存储器寻址方式。指令格式举例: SAR AL , 1

SAR DL , CL

SAR WORD PTR TABLE[SI],1

SAR BYTE PTR STATUS ,CL

CF

Page 61: 3.4.2  算术运算指令 ( Arithmetic)

用 SAR 指令与用 IDIV 指令做除法的区别:

用 SAR 指令做除法(对负数向下舍入):

MOV AX , 81H ; (AX) = -127SAR AX , 1 ; (AX)= - 64

用 IDIV 指令做除法( IDIV 指令对负数向上舍入) :

MOV AX , 81H ;(AX)= -127MOV CL , 2IDIV CL ;(AL)= -63 , (AH)= -1

Page 62: 3.4.2  算术运算指令 ( Arithmetic)

应用举例:(BX)=84F0H

(1) 若 (BX) 无符号数,求( BX) /2

SHR BX, 1 ; ( BX) =4278 CF=0, OF=1, SF=0, ZF=0

(2) 若 (BX) 带符号数,求( BX) /4

MOV CL, 02H 或 SAR BX, 1

SAR BX, CL SAR BX, 1

; CF=0, OF 无意义, SF=1, ZF=0

1 1 1 1 0 0 0 0

01234567

00100001

89101112131415

0 1 1 1 1 0 0 0

01234567

01000010

89101112131415

Page 63: 3.4.2  算术运算指令 ( Arithmetic)

4 条 : ROL, ROR , RCL, RCRROL, ROR , RCL, RCR。

共同点:• ROLROL、、 RORROR 不含 CF 循环移位指令,操作数移动操作数移动 88 次后次后还原还原。• RCLRCL 、 、 RCRRCR 含 CF 循环移位指令,操作数移动操作数移动 99 次后还次后还原原。

• 影响标志 OF、 CF

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

ROR 、 RCR 影响标志 OF、 CF 情况相同 。

SF、 ZF、 PF、 AF 不影响。

22 、循环移位、循环移位

Page 64: 3.4.2  算术运算指令 ( Arithmetic)

(( 11 )、)、 ROLROL (Rotate left ) 不含不含 CFCF 循环(小循环)左移指循环(小循环)左移指令令

格式: ROL dst ,cnt ;不含 CF 循环左移指令 , B/W

执行操作: ROL 指令操作示意图如下图所示

移动移动 88 次后操作数还原。次后操作数还原。

CF

dst

指令格式举例:ROL BH , 1

ROL DX , CL

ROL WORD PTR TABLE[DI],1

ROL BYTE PTR ALPHA ,CL

Page 65: 3.4.2  算术运算指令 ( Arithmetic)

影响标志 OF、 CF 情况:• 左循环移动左循环移动 11 次后次后: 移位后,最高有效位(符号位)是否发生变化,

如果移位后,最高有效位最高有效位发生变化则: 则: OF = 1,OF = 1, 否则(无否则(无变化时)变化时) OF = 0OF = 0。。

CF 根据各条指令的规定设置。• 左循环移动多次后:左循环移动多次后: OF 值不定。 CF=从目标操作数移出的最后一位。

• SF、 ZF、 PF、 AF 不影响。

Page 66: 3.4.2  算术运算指令 ( Arithmetic)

(( 22 )、)、 RORROR (Rotate right ) 不含不含 CFCF 循环(小循环)右移指令循环(小循环)右移指令

格式: ROR dst ,cnt ;不含 CF 循环右移指令 , B/W

执行操作: ROR 指令操作示意图如下图所示

右移右移 88 次后操作数还原。次后操作数还原。

CF

dst

指令格式举例:ROR CX , 1

ROL BH , CL

ROL BYTE PTRBETA , 1

ROL WORD PTR COUNT , CL

Page 67: 3.4.2  算术运算指令 ( Arithmetic)

影响标志 OF、 CF 情况:

• 右循环移动右循环移动 11 次后:次后: 如果移位后,最高有效位最高有效位发生变化则则, OF=1; OF=1; 否则 : 否则 : OF=0OF=0。。

CF 根据各条指令的规定设置。

• 右循环移动多次后右循环移动多次后: OF 值不定。 CF=从目标操作数移出的最后一位。

• SF、 ZF、 PF、 AF 不影响。

Page 68: 3.4.2  算术运算指令 ( Arithmetic)

(( 33 )、)、 RCLRCL (Rotate left through carry ) 含含 CFCF 循环(大循循环(大循环)左移指令环)左移指令

格式: RCR dst ,cnt ;含 CF 循环左移指令 , B/W

执行操作: RCL 指令操作示意图如下图所示, 左移左移 99 次后操次后操作数还原作数还原。

CF

dst

指令格式举例:RCL BX , 1

RCL DL , CL

RCL BYTE PTR ARRAY[DI] , 1

RCL WORD PTR [SI+BP] , CL

影响标志:影响标志: RCL RCL 与与 ROL ROL 影响标志影响标志 OFOF、、 CFCF 情况相同情况相同

Page 69: 3.4.2  算术运算指令 ( Arithmetic)

(( 44 )、)、 RCRRCR (Rotate right through carry )含含 CFCF 循环(大循循环(大循环)右移指令环)右移指令

格式: RCR dst ,cnt ;含 CF 循环左移指令 , B/W

执行操作: RCR 指令操作示意图如下图所示, 右移右移 99 次后操作次后操作数还原。数还原。

CF

dst

指令格式举例:RCR DI, 1

RCR SI , CL

RCR WORD PTR[SI+BX+3], 1

RCL BYTE PTRPORT, CL

影响标志:影响标志: RCR RCR 与 与 ROR ROR 影响标志影响标志 OFOF、、 CFCF 情况相同情况相同

Page 70: 3.4.2  算术运算指令 ( Arithmetic)

带进位循环左移移 9 次还原

带进位循环左移移 9 次还原

循环右移(不带CF ) 移 8 次还原

循环左移(不带CF ) 移 8 次还原

算术右移(带符号数 ÷2 )

逻辑右移(无 符号数 ÷2 )

执行操作名称指令格式

SHL oprd, 1CL

逻辑左移(无符号数 *2 ) 0 CF

0 CF SAL oprd,1

CL算术左移

CF0 SHR oprd, 1CL

CF SAR oprd,

1CL

CF ROL oprd,

1

CL

CF ROR oprd,

1

CL

CF RCL oprd, 1 1

CL1

CF

RCR oprd, 1

1

CL

1

小结:小结:

Page 71: 3.4.2  算术运算指令 ( Arithmetic)

循环移位指令循环移位指令( Rotate) 与移位指令与移位指令 (Shift) 不同点不同点:

• 循环移位指令移位后,操作数中原来各数位的信息不会丢失,只是移动了位置,必要时可以恢复。

• 循环移位指令可以对操作数进行测试。

例:测试 (AL)5 =? 0

MOV CL , 3ROL AL , CLROL AL , CLJNC ZERO

…ZERO: …

Page 72: 3.4.2  算术运算指令 ( Arithmetic)

• 利用带进位循环移位指令将两个寄存器或存储器单元利用带进位循环移位指令将两个寄存器或存储器单元 组合起来一起移位组合起来一起移位。

例: 将 DX、 AX组合起来构成 32 位寄存器向左移一位。如下图所示:

015015 DX AX

程序: SHL AX , 1 RCL DX , 1

32 位寄存器向左移一位

Page 73: 3.4.2  算术运算指令 ( Arithmetic)

“串”就是内存中一段地址相连的字节或字。 串操作—对串中各项进行操作,也叫数据块操作串操作—对串中各项进行操作,也叫数据块操作。

8088 有 5 种基本操作:

1、MOVS(Move string ) 串传送指令 2、 LODS( Load from string ) 从串取指令 3、 STOS ( Store in to string ) 存入串指令 4、 CMPS( Compare string ) 串比较指令 5、 SCAS( Scan string ) 串扫描指令

3.4.4 串操作指令( String manipulation ) (自学)

Page 74: 3.4.2  算术运算指令 ( Arithmetic)

共同点:共同点:• 可以只有源操作数,可以只有目标操作数,可能二者都有。• 源操作数用 SI 寻址,隐含 DS 值为段地址,可以用段跨越前缀指定其它段。• 目的操作数用 DI寻址,隐含 ES 为段地址。• 每次操作对 SI、 DI 调整:

DF=1DF=1,, DIDI、、 SISI自动自动 -1 (-1 ( 字节)或字节)或 -2-2 (字);(字);DF=0DF=0,, DIDI、、 SISI自动自动 +1+1 (字节)或(字节)或 +2+2 (字)。(字)。

• 与上述指令基本配合使用前缀有:

REPREP( Repeat )重复。重复。

REPE/REPZREPE/REPZ( Repeat while equal/zero ) 相等相等 // 为零则重为零则重复。复。

REPNE/REPNZREPNE/REPNZ( Repeat while not equal/not zero )不相等不相等 //不为零则重复不为零则重复。

Page 75: 3.4.2  算术运算指令 ( Arithmetic)

分二种情况:

(( 一一 ) ) 与与 REPREP 相配合工作的相配合工作的 MOVSMOVS、、 STOSSTOS、、 LODSLODS 指令指令

REP REP 重复串操作直到(重复串操作直到( CXCX)) =0=0 为止为止

(( 二二 ) ) 与与 REPE/REPZREPE/REPZ和和 REPNE/REPNZREPNE/REPNZ 联合工作的联合工作的 CMPSCMPS和和SCASSCAS 指令指令

REPE/REPZ REPE/REPZ 当相等当相等 // 为零时重复串操作为零时重复串操作

REPNE/REPNZ REPNE/REPNZ 当不相等当不相等 // 不为零时重复串操作不为零时重复串操作

Page 76: 3.4.2  算术运算指令 ( Arithmetic)

• REP REP 重复串操作直到(重复串操作直到( CXCX)) =0=0 为止为止

格式: REP 串指令

串指令可为: MOVS、 STOS、 LODS。

1. MOVS(Move String ) 串传送指令

2. LODS(Load from String) 从串取指令

3. STOS( Store into String ) 存入串指令

(( 一一 ) ) 与与 REPREP 相配合工作的相配合工作的 MOVSMOVS、、 STOSSTOS、、 LODSLODS指令指令

Page 77: 3.4.2  算术运算指令 ( Arithmetic)

• REP REP 重复串操作执行过程重复串操作执行过程 ::

(1) 当 (CX)= 0 ,结束REP,

执行 REP 后的下一条指令。

(2) 当 (CX)≠0,

(CX) (CX) -1 ,

(3) 执行 REP 后的串指令,

(4) 重复 (1) ~( 3 )。 REP 执行流程图

(CX)=0?Y

(CX) (CX)-1

执行下一条指令

REP执行 后的串指令

N

Page 78: 3.4.2  算术运算指令 ( Arithmetic)

串传送有串传送有 33 种格式:种格式:

(1) MOVS dst, src;(( ES):( DI ←) (( DS):( SI))

(2) MOVSB (字节) ;( SI ←) ( SI) ±1,( DI ←) ( DI ) ±1

(3) MOVSW (字);( SI ←) ( SI) ±2,( DI ←) ( DI) ±2

当方向标志 当方向标志 CLD , DF=0CLD , DF=0 时 用“时 用“ +”+”

STD , DF=1STD , DF=1 时 用“时 用“ -”-”

该指令不影响标志位 。

如: MOVS ES: BYTE PTR [DI], DS: [SI]

* MOVMOV 单指令不能完成 存储单元之间的数据传送存储单元之间的数据传送;

MOVSMOVS 指令就是为解决 存储单元之间数据传送而设置的。指令就是为解决 存储单元之间数据传送而设置的。

11、、 MOVSMOVS(( Move stringMove string ))串传送串传送

Page 79: 3.4.2  算术运算指令 ( Arithmetic)

将内存的数据段中以 AREA1 为首地址的 100 个数据,传送到附加段中的 AREA2 为首地址的区域。

用MOVS串操作指令编程: MOV AX, SEG AREA1

MOV DS, AX

MOV AX, SEG AREA2

MOV ES, AX

MOV SIMOV SI,, OFFSET AREA1OFFSET AREA1

MOV DIMOV DI,, OFFSET AREA2OFFSET AREA2

MOV CXMOV CX,, 100100

CLDCLD ; DF=0 ,增址传送

REP MOVSBMOVSB ; ; or MOVS ESor MOVS ES:: BYTE PTR[DI], DSBYTE PTR[DI], DS::[SI][SI]

例:

Page 80: 3.4.2  算术运算指令 ( Arithmetic)

应用应用 MOVMOV 指令编程指令编程: MOV AX, SEG AREA1

MOV DS, AX

MOV AX, SEG AREA2

MOV ES, AX MOV SIMOV SI,, OFFSET AREA1 OFFSET AREA1 ;;将将 ARE1ARE1偏移地址→偏移地址→ SISI

MOV DIMOV DI,, OFFSET AREA2OFFSET AREA2

MOV CXMOV CX,, 100100

LOOP1: MOV ALMOV AL,, [SI][SI] ; ( AL ←) (( DS):( SI))

MOV ESMOV ES:: [DI][DI],, ALAL ;(( ES):( DI ←)) ( AL)

INC SI

INC DI

DEC CX

JNE LOOP1

Page 81: 3.4.2  算术运算指令 ( Arithmetic)

归纳:在执行 MOVS 指令时,应该先做好以下准备工作

(1) 数据段中源串首地址源串首地址(或反向传送末地址)存入存入 SISI 寄存器中寄存器中。

(2) 附加段中目的串首地址目的串首地址(或反向传送末地址)存入存入 DIDI 寄存器寄存器中中。

(3) 数据串长度数据串长度存入存入 CXCX 寄存器寄存器。

(4) 建立方向标志建立方向标志

建立方向标志介绍两条指令:建立方向标志介绍两条指令:

· CLD( clear direction flag )

功能: DF=0DF=0 ,执行串处理指令时 可以使地址自动自动 +1+1 或或 ++22 。

· STD( set direction flag)

功能: DF=1DF=1 ,执行串处理指令时可以使地址自动自动 -1-1 或 或 -2-2 。。

Page 82: 3.4.2  算术运算指令 ( Arithmetic)

从串取指令有从串取指令有 33 种格式:种格式:

(1) LODS src; (字节) (AL) ((DS): (SI)), (SI) (SI) ±1

(字 )( AX ) ((DS):( SI)),( SI ) (SI)±2

(2) LODSB (字节) ;( AL ) ((DS):( SI)), (SI) (SI) ±1

(3) LODSW (字) ;( AX ) ((DS):( SI)),( SI ) (SI)±2

功能:该指令把由(( SISI ))指定的数据段中某单元内容指定的数据段中某单元内容 ((AL)AL)

或 或 ((AX)AX) 中中。

DF=0,( SI ← ) ( SI) +1 或 +2

DF=1,( SI ←) ( SI) -1 或 -2

22、、 LODS(Load from string) LODS(Load from string) 从串取指令从串取指令

Page 83: 3.4.2  算术运算指令 ( Arithmetic)

LODSLODS 应用注意:应用注意:(1) 指令允许用段跨越前缀来指定非数据段的存储区。

(2) 该指令不影响标志位。

(3)一般说来,• 它不与 REP联用 ,每重复一次,累加器的内容就改变一次。

(AL) 中只能保持最后一个元素。• 当缓冲区中的一串字符需要多次取出测试时可用本指令缓冲区中的一串字符需要多次取出测试时可用本指令。• 适用于在一个循环中,用基本串操作指令构成复杂串操作

时很有用。

Page 84: 3.4.2  算术运算指令 ( Arithmetic)

将将 ((AL)AL) 或(或( AX)AX) ( ((ES):(DI))(ES):(DI)),(,( DI) ±1DI) ±1 或或 ±2±2((DI)DI)

存入串指令有存入串指令有 33 种格式:种格式:

(1) STOS dst; (字节) ((ES): (DI)) (AL) , (DI) (DI) ±1

(字 ) ((ES): (DI)) (AX) , (DI) (DI) ±2

(2) STOSB (字节) ; ((ES): (DI)) (AL) , (DI) (DI) ±1

(3) STOSW (字) ; ((ES): (DI)) (AX) , (DI) (DI) ±2

用途:

与 REP联用时,( CX ←) 缓冲区长度。用来建立一串相同的值。

3 3 、 、 STOSSTOS(( Store into stringStore into string ) ) 存入串指令存入串指令

Page 85: 3.4.2  算术运算指令 ( Arithmetic)

例:在附加段 STORE 开始存 5 个空格

程序:

MOV AL, 20H ‘ ’ ; ( AL)

MOV CX, 5

MOV DI, offset STORE

CLD

REP STOSB ; ((ES): (DI)) (AL)

(DI) (DI)+1

20H

20H

20H

20H

20H

.. .

. . .

. . .

STORE:

Page 86: 3.4.2  算术运算指令 ( Arithmetic)

LODSLODS,, STOSSTOS 指令应用指令应用

例:内存中有一个首地址为 BLOCK 补码表示的有符号数的数据块补码表示的有符号数的数据块。

要求将正、负数分开,分别存于二个缓冲区要求将正、负数分开,分别存于二个缓冲区 ::

存放正数的缓冲区首址为 PLUS-DATA ,

存放负数的缓冲区首址为 MINUS-DATA。

设: 源数据块用 SI寻址,

正数的目的区用 DI寻址,

负数的目的区用 BX寻址。

循环次数 ( CX )。

Page 87: 3.4.2  算术运算指令 ( Arithmetic)

传送过程:传送过程:•用 LODS 指令把源数据取入( AL )中,•检查其符号,确定正、负,

若为正数用 STOS 指令送至正数缓冲区,

若是负数,把( DI )与( BX )交换,仍使用 STOS传送,

传送完后再将( DI )与( BX )交换,恢复原值。

Page 88: 3.4.2  算术运算指令 ( Arithmetic)

程序: START: MOV SI, OFFSET BLOCK

MOV DI, OFFSET PLUS-DATA ; 正数缓冲区MOV BX, OFFSET MINUS-DATA ;负数缓冲区MOV CX, COUNT

CLDCLD

GOON: LODS BLODS B

TEST ALTEST AL,, 80H80H

JNZ MINS ;若负数转 MINS

STOS BSTOS B ;正数 ,( DI ←) ( AL),( DI ←) ( DI)+1

JMP AGAIN

MINS : XCHG BX, DI

STOSBSTOSB ;负数 ,( DI ←) ( AL),( DI ←) ( DI)+1 XCHG BX, DI

AGAIN: DEC CX

JNZ, GOON

HLT

Page 89: 3.4.2  算术运算指令 ( Arithmetic)

REPE/REPZ REPE/REPZ 当相等当相等 // 为零时重复串操作为零时重复串操作

格式: REPE (或 REPZ )串指令

REPZREPZ前缀:当相等重复前缀:当相等重复

串指令可为 : CMPS , SCASCMPS , SCAS

1、 CMPS( Compare string ) 串比较指令

2、 SCAS (Scan string ) 串扫描指令,搜索指令

(( 二二 ) ) 与与 REPE/REPZREPE/REPZ和和 REPNE/REPNZREPNE/REPNZ 联合工作的联合工作的 CMPSCMPS和和 SCASSCAS指令指令

Page 90: 3.4.2  算术运算指令 ( Arithmetic)

执行过程:(1) 当 (CX)= 0 , 结束 REPZ ,

执行 REPZ 下一条指令;

(2) 当 (CX)≠0 ,将 CX 的内容减 1 ,

执行 REPZ 后的串指令;

(3) 当 ZF = 1, 返回 (1) ;

(4) 当 ZF≠1, 则结束 REPZ

执行 REPZ 下一条指令。

注意:注意:◆◆ ((CX)CX) 减减 11 操作不影响标志操作不影响标志

◆◆ ZFZF 标志由串操作决定标志由串操作决定

◆◆ 当 当 ((CX) = 0CX) = 0或或 ZF=0ZF=0 时退出循环时退出循环 REPZ执行流程

(CX)=0?Y

(CX) (CX)-1

执行下一条指令

REZ执行 后的串指令

N

ZF=1?

N

Y

Page 91: 3.4.2  算术运算指令 ( Arithmetic)

REPNE/REPNZ REPNE/REPNZ 当不相等当不相等 // 不为零时重复串操作不为零时重复串操作

格式: REPNE (或 REPNZ) string primitive

REPNZREPNZ前缀前缀 : : 当不相等重复当不相等重复

串指令可为 : CMPS , SCASCMPS , SCAS

1、 CMPS( Compare string ) 串比较指令

2、 SCAS (Scan string ) 串扫描指令,搜索指令

Page 92: 3.4.2  算术运算指令 ( Arithmetic)

执行过程:(1) 当 (CX )= 0 , 结束 REPNZ,

执行 REPNZ 下一条指令。

(2) 当 (CX)≠0 ,将 CX 的内容减 1 ,

执行 REPNZ 后的串指令。

当 ZF = 0, 返回 (1) ; 当 ZF≠0, 则结束 REPNZ,

(4) 执行 REPNZ 下一条指令。

注意:◆◆ ((CX)CX) 减减 11 操作不影响标志操作不影响标志

◆◆ ZFZF 标志由串操作决定标志由串操作决定

◆ ◆ 当 当 ((CX) = 0CX) = 0或或 ZF=1ZF=1 时退时退出循环出循环

REPNZ执行流程

(CX)=0?Y

(CX) (CX)-1

执行下一条指令

RENZ执行 后的串指令

N

ZF=0?

N

Y

Page 93: 3.4.2  算术运算指令 ( Arithmetic)

11、、 CMPSCMPS(( Compare string ) Compare string ) 串比较指令串比较指令 ( SI —) 作为源串地址,( DI —) 目的串地址串比较指令串比较指令有有 33 种格式:种格式:(1) CMPS dst, src ;

(2) CMPSB (字节) ;

(3) CMPSW (字);执行操作:• ((ES) :(DI) -( DS): (SI)), 结果不存,置标志。• 字节操作: (SI) (SI)±1, (DI)←(DI) ±1

• 字操作: (SI) (SI)±2, (DI) (DI)±2

注意:两数相减,只影响标志,不影响操作数。注意:两数相减,只影响标志,不影响操作数。其它操作规定与其它操作规定与 MOVSMOVS 同。同。

Page 94: 3.4.2  算术运算指令 ( Arithmetic)

REPZ CMPSB 指令应用例: 利用 CMPS 指令对 STRING1和 STRING2 二个字符串进行比较,相同在 RESULT 单元送 00H ,不同送 0FFH。

MOV SI, OFFSET STRING1

MOV DI, OFFSET STRING2

MOV CX, COUNT

CLD

REPZ CMPSB

JNZ UNMAT ;若串不同,在 RESUL 单元中置 0FFH

MOV AL, 0 ; 若串相等,在 RESULT 单元中置 00H

JMP OULPT

UNMAT:MOV AL, 0FFH

OUTPT : MOV RESULT, AL

HLTHLT

Page 95: 3.4.2  算术运算指令 ( Arithmetic)

22、、 SCASSCAS (Scan string ) 串扫描指令,搜索指令串扫描指令,搜索指令

(( DIDI —)—) 字符串起始地址,(字符串起始地址,( AL)AL) 或(或( AXAX — ) — ) 关键字关键字 串串扫描扫描指令指令有有 33 种格式种格式:格式: SCAS dst

SCASB (字节);( AL) -(( ES):( DI)),( DI)( DI) ±1

SCASW (字);( AX) -(( ES):( DI)),( DI ) ( DI) ±2

注意:注意:( AL )或( AX ) - 目的串两数相减,只影响标志,不影响操作数。其它特性与 MOVS 同。

Page 96: 3.4.2  算术运算指令 ( Arithmetic)

REPNE SCASBREPNE SCASB 指令应用。指令应用。例:要搜索的关键字放在 (AL) 或 (AX) 中,搜索某一数据块或字符串中有无关键字,若有,把搜索次数记下来,且记录关键字地址若有,把搜索次数记下来,且记录关键字地址;若搜索次数为若搜索次数为 00 ,,表示没有要搜索的关键字。表示没有要搜索的关键字。

MOV DI, 0FFSET BLOCK ;设置数据块地址指针MOV CX, COUNT ;设置数据块长度MOV AL, CHAR CHAR ; 关键字送入 AL或 AX

REPNE SCASBREPNE SCASB ;( CX ≠) 0, ZF=0 继续 SCASB

JZ FOUND

MOV DI, 0 ;没有搜索到,搜索次数为搜索次数为 00

JMP DONE

FOUND: DEC DI

MOV POINTRMOV POINTR,, DI DI ;;记录关键字地址记录关键字地址 MOV BXMOV BX , , OFFSET BLOCKOFFSET BLOCK

SUB DI SUB DI , , BX BX ;;把搜索次数记下来把搜索次数记下来DONE: HLT

Page 97: 3.4.2  算术运算指令 ( Arithmetic)

应用举例:

例:一个数据块由大小写英文字母、数字、其他符号组成,用 CR( ASCII 码 0DH) 结束。数据块首地址为

BLOCK1。

将其传送到 BLOCK2 为首地址的内存区,并将英文中小将英文中小写英文字母写英文字母 ((a~z)a~z) 转换成大写英文字母转换成大写英文字母 ((A~Z),A~Z), 其余不变其余不变。

分析:• 大小写英文字母中相应 ASCII 码的关系:

‘a’~’z’ 相应 ASCII 码为: 61H~7AH‘A’~’Z’ 相应 ASCII 码为: 41H~5AH

• 英文中小写英文字母英文中小写英文字母 ((a~z)a~z) 转换成大写英文字母转换成大写英文字母((A~Z)A~Z)::

只要将小写的只要将小写的 ASCIIASCII 码减去码减去 2020HH 即可。即可。

• 程序和流程图如下:

Page 98: 3.4.2  算术运算指令 ( Arithmetic)

程序 :LEA SI , BLOCK1LEA DI , BLOCK2CLD

NEXT: LODSBCMP AL , 0DH, 0DHJZ DONECMP AL , 61H61HJC OKCMP AL , 7BH7BHJNC OKSUB AL , 20HSUB AL , 20H

OK: STOSBSTOSBJMP NEXT

DONE: HLT

开始

初始化,置源地址、目的地址指针DF清方向标志

取一个字符

回车?

>' z'?

<‘ a'

转换为大写字母

送存

结束

Y

YN

N

Y

N

流程图

Page 99: 3.4.2  算术运算指令 ( Arithmetic)

小结:串操作指令重复前缀,操作数,地址指针小结:串操作指令重复前缀,操作数,地址指针

指令 重复前缀 操作数 地址指针寄存器

MOVS REPREP 源,目标 (DS): (SI) , (ES): (DI)

CMPS REPE/REPNEREPE/REPNE 源,目标 (DS): (SI) ,(ES): (DI)

SCAS REPE/REPNEREPE/REPNE 目标 (ES): (DI)

LODS 无无 源 (DS): (SI)

STOS REPREP 目标 (ES): (DI)

Page 100: 3.4.2  算术运算指令 ( Arithmetic)

作业三(续 1):

教材: P121 习题7 , 8 , 9, 13