21 世纪高等院校规划教材

80
21 世世世世世世世世世世 世世世世世世世世 世世 世世世 世世世 世世世 世世世世世世世世世

description

21 世纪高等院校规划教材. 汇编语言程序设计. 相 伟 主编 徐小平 李珍香 副主编. 中国水利水电出版社. 第 3 章顺序程序设计. 本章主要讲解汇编语言中的常用机器指令 和顺序程序设计方法。通过本章学习,读者应 该掌握以下内容: 数据传送指令 算术运算指令 逻辑运算和移位指令 处理机控制指令 顺序程序设计方法. 3.1 数据传送指令. - PowerPoint PPT Presentation

Transcript of 21 世纪高等院校规划教材

Page 1: 21 世纪高等院校规划教材

21 世纪高等院校规划教材

汇编语言程序设计相 伟 主编徐小平 李珍香 副主编

中国水利水电出版社

Page 2: 21 世纪高等院校规划教材

第 3 章 顺序程序设计 本章主要讲解汇编语言中的常用机器指令和顺序程序设计方法。通过本章学习,读者应该掌握以下内容: 数据传送指令 算术运算指令 逻辑运算和移位指令 处理机控制指令 顺序程序设计方法

Page 3: 21 世纪高等院校规划教材

3.1 数据传送指令 数据传送是计算机中最基本、最重要的一种操作。数据传送指令主要负责把数据、地址或立即数传送到寄存器或存储单元中。它又可分为通用数据传送指令、地址传送指令、 I/O 指令和标志寄存器传送指令等四组。除标志寄存器传送指令外,均不影响标志位。本节主要介绍通用数据传送指令和地址传送指令。

Page 4: 21 世纪高等院校规划教材

3.1.1 通用数据传送指令 通用数据传送指令包括 MOV 、 XCHG 和 XLAT 三条指令。1 .数据传送指令 MOV 指令格式: MOV dest , src 功能:将源操作数传送至目的地址中,源操作数保持不变,即 dest(src) 。 其中: MOV 为操作码助记符; dest 为目的操作数,可以是通用寄存器、段寄存器、存储单元; src 为源操作数,可以是立即数、通用寄存器、段寄存器、存储单元。

Page 5: 21 世纪高等院校规划教材

MOV 指令可以实现 CPU 内部通用寄存器之间、寄存器和存储单元之间、立即数到存储单元、立即数到内部通用寄存器的数据传送。 具体传送路径如图 3-1 所示: 图中箭头离开的操作数为源操作数,箭头指向的操作数为目的操作数。

立即数

段寄存器

存储单元

通用寄存器

图 3-1 MOV 指令传送路径

Page 6: 21 世纪高等院校规划教材

( 1 )立即数到通用寄存器的传送 立即数传送到通用寄存器主要用于给通用寄存器赋初值,立即数( 8 位或 16位)与通用寄存器的类型必须匹配。立即数可以是各种数制(十进制、二进制、八进制、十六进制)的常数、 ASCII 字符和符号常数。

Page 7: 21 世纪高等院校规划教材

例 3-1 :分析下列立即数到通用寄存器的传送指令。 MOV AL , 6 ; AL6 ,字节传送 MOV AX , 10 ; AX10 ,字传送 MOV AL , 1000H ;非法指令, 1000H 为字, AL 为字节寄存器 MOV CX , 0FFH ; CX0FFH ,字传送(十六进制) MOV AL , 1010B ; AL00001010B ,字节传送(二进制) MOV AL ,‘ $’ ; AL24H

Page 8: 21 世纪高等院校规划教材

( 2 )通用寄存器之间的数据传送 CPU 内部通用寄存器之间可以相互传送,传送时要注意两操作数类型必须匹配,即同为字节型或同为字型。例 3-2 :分析下列各条指令。 MOV AX , BX ; AX ( BX ),字型 MOV CL , AL ; CL ( AL ),字节型 MOV AL , CX ; 非法指令,两操作数类型不一致

Page 9: 21 世纪高等院校规划教材

( 3 )通用寄存器与存储单元之间数据传送 通用寄存器与存储单元之间相互传送数据时,传送类型由通用寄存器类型来定。例 3-3 :分析下列各条指令。 MOV [2000H] , AL ; [2000H] ( AL ),字节型传送 MOV [2000H] , AX ; [2000H] ( AL ), [2001H] ( AH ),字型传送 MOV BH , [1050H] ; BH ( [1050H] ),字节型传送 MOV BX , [1050H] ; BL ( [1050H] ), BH ( [1051H] ),字型传送

Page 10: 21 世纪高等院校规划教材

( 4 )通用寄存器与段寄存器之间、存储单元与段寄存器之间的数据传送 由于段寄存器皆为 16 位寄存器,因此,通用寄存器与段寄存器之间、存储单元与段寄存器之间只能是字传送。另外, CS 段寄存器不能作为传送指令的目标操作数。例 3-4 :分析下列各条指令。 MOV DS , AX ; DS ( AX ) MOV BX , CS ; BX ( CS ) MOV CS , AX ;非法指令,不允许给 CS 寄存器赋值 MOV DS , AL ;非法指令,操作数的类型不匹配 MOV [2000H] , DS ;将 16 位段寄存器 DS 的内容送入 1000H (低字节)和 1001H (高字节)单元中

Page 11: 21 世纪高等院校规划教材

( 5 )立即数传送到存储单元 当存储单元的类型不确定时,必须用 BYTE PTR 或WORD PTR属性操作符来指定存储单元的类型。例 3-5 :分析下列各条指令。 MOV BUF1 , 20 ; BUF1 为字节变量 MOV SUM , 0FFFFH ; SUM 为字变量 MOV BYTE PTR [1000H] , 8 ;字节型传送,表示将 08 传送到 1000H 单元中 MOV WORD PTR [1000H] , 8 ;字传送,将 08 传送到 1000H 单元, 将 00 传送到 1001H 单元 MOV [2000H] , 10H ; 非法指令,无法确定操作类型

Page 12: 21 世纪高等院校规划教材

① MOV 指令不改变源操作数内容,不影响标志位。 ② 源操作数和目的操作数应该有相同的类型,即必须同为字节型或同为字型。 ③ 代码段寄存器 CS 不能用作目的操作数,即不允许给 CS 赋值。 ④ 立即数不能用作目的操作数,立即数也不能直接传送给段寄存器。

以上介绍了MOV 指令的各种形式,具体应用时要特别注意以下几点:

Page 13: 21 世纪高等院校规划教材

例 3-6 : 若要设置数据段寄存器 DS 的初值为 2000H ,不能直接用指令 MOV DS , 2000H 可用如下两条指令表示: MOV AX , 2000H MOV DS , AX

Page 14: 21 世纪高等院校规划教材

例 3-7:交换两个存储单元 BUF1 和 BUF2 的内容。 MOV AX , BUF1 ; AX ( BUF1 ) MOV BUF2 , AX ; BUF2 ( AX )⑥ 不允许在段寄存器之间直接传送数据。 例如: MOV DS , ES 为非法指令。

⑤ 源操作数和目的操作数不能同时为存储单元操作数。

Page 15: 21 世纪高等院校规划教材

2 .交换指令 XCHG 指令格式: XCHG dest , src 功能:将源操作数和目的操作数的内容互换,不影响标志位。 其中: XCHG 为操作码助记符; dest 为目的操作数,可以是通用寄存器或存储单元; src 为源操作数,可以是通用寄存器或存储单元。 说明: XCHG 指令中操作数可以是字,也可以是字节。可以在通用寄存器与通用寄存器之间、通用寄存器和存储单元之间交换数据。但不允许在两个存储单元之间直接交换数据。指令执行后不影响状态标志位。

Page 16: 21 世纪高等院校规划教材

例 3-8 :下列三条指令执行后,将寄存器 AX 和BX 的内容互换。 MOV AX , 1234H ; (AX) = 1234H MOV BX , 5678H ; (BX) = 5678H XCHG AX , BX ; (AX) = 5678H ,(BX) = 1234H

Page 17: 21 世纪高等院校规划教材

3 .换码指令 XLAT 指令格式: XLAT 或 XLAT 标号 功能:将以 (BX) 为首址、 (AL) 为偏移量的字节存储单元中的内容传送给 AL ,即: AL((BX)+ (AL)) 。 其中: XLAT 为操作码助记符; 说明:换码指令的两种格式完全等效。标号表示首地址,是为了提高程序的可读性而设置的。本指令只能是字节操作。指令执行结果不影响标志位。 换码指令常用于代码转换,即将一种代码转换为另一种代码。

Page 18: 21 世纪高等院校规划教材

例 3-9:分析下列程序段。 DATA SEGMENT TAB DB ‘0123456789ABCDEF’ DATA ENDS …… MOV BX , OFFSET TAB ; BXTAB 的偏移地址 MOV AL , 6 ;将 TAB表中第七项的偏移地址 6 送 AL 中 XLAT TAB ;( AL )= 36H …… 该程序段的功能就是将 AL 中的一位十六进制数转换成对应的 ASCII 码。

Page 19: 21 世纪高等院校规划教材

3.1.2 地址传送指令8086/8088 中有三条地址传送指令: LEA 、 LDS 和 LES 。1 .传送偏移地址指令 LEA 指令格式: LEA dest , src 功能:按源操作数提供的寻址方式计算偏移地址,并将其送入目的操作数中。 其中: LEA 为操作码助记符; dest 为目的操作数,只能是 16 位通用寄存器; src 为源操作数,只能是存储单元。 该指令的执行不影响标志位。

Page 20: 21 世纪高等院校规划教材

例 3-10 :阅读下面程序段,分析各条指令的执行过程。 DATA SEGMENT BUF1 DB ‘ABCDEF’ NUM DW 20 , 35 , -10 COUNT DW 0 DATA ENDS …… ① MOV BX , OFFSET NUM ;将 NUM 的偏移地址 6 送入 BX 中 ② LEA BX , NUM ;将 NUM 的偏移地址 6 送入 BX 中 ③ MOV AX , [BX] ;将偏移地址为 6 的单元中内容 20 送入 AX ④ LEA AX , [BX] ;将 BX 所指存储单元的偏移地址 6 送 AX 中 ⑤ MOV COUNT , OFFSET BUF1 ;将 BUF1 的偏移地址送 COUNT ⑥ LEA COUNT , BUF1 ;非法指令,目的操作数是存储单元 …… 上述程序段中指令前面的数字标号① ~⑥是为方便说明问题而加的。

Page 21: 21 世纪高等院校规划教材

2 .传送偏移地址及数据段首址指令 LDS 指令格式: LDS dest , src 功能:将源操作数所指存储单元中的第一个字传送给指定的 16 位通用寄存器,第二个字传送给段寄存器 DS ,即 dest ( src ), DS ( src + 2 )。 其中: LDS 为操作码助记符; dest 为目的操作数,只能是 16 位通用寄存器; src 为源操作数,只能是存储单元(四个字节)。 该指令执行结果不影响标志位。

Page 22: 21 世纪高等院校规划教材

例 3-11 :有如下指令 LDS DI , [20H] 指令执行前,假设:( DS )= C000H , ( C0020H )= 34H , ( C0021H )= 12H , ( C0022H )= 00H , ( C0023H )= 60H 指令执行后, ( DI )= 1234H ,( DS )= 6000

Page 23: 21 世纪高等院校规划教材

3 .传送偏移地址及附加数据段指令 LES 指令格式: LES dest , src 功能:将源操作数所指存储单元中的第一个字传送给指定的 16 位通用寄存器,第二个字传送给段寄存器 ES ,即 dest

(src) , ES(src+ 2)

Page 24: 21 世纪高等院校规划教材

3.2 算术运算指令 8086/8088 的算术运算指令主要包括二进制运算指令和十进制调整指令。 二进制算术运算指令是指对二进制数进行加、减、乘、除运算的指令。它们中有单操作数指令,如加 1 指令 INC 、减 1 指令 DEC 、求补指令 NEG 等;也有双操作数指令,如加法指令 ADD 、减法指令 SUB 、乘法指令 MUL 、除法指令 DIV 等。单操作数指令的操作数不允许用立即数和段寄存器,而双操作数指令的两个操作数中除源操作数为立即数情况外,其中必须有一个是寄存器操作数。除加 1 、减 1 指令不影响 CF ,其余指令均对 CF 、 OF 、 ZF 、 SZ、 PF 、 AF产生影响。

Page 25: 21 世纪高等院校规划教材

3.2.1 加法类指令 包括 ADD 、 ADC 和 INC 三条指令,执行字或字节的加法运算。1 .加法指令 ADD 指令格式: ADD dest , src 功能:将目的操作数与源操作数相加,结果保存在目的操作数单 元中,源操作数保持不变。即 dest ( dest )+( src ) 。 其中: ADD 为操作码助记符; dest 为目的操作数,可以是通用寄存器或存储单元; src 为源操作数,可以是立即数、通用寄存器或存储单元。 指令执行后对状态标志 CF 、 OF 、 ZF 、 SZ、 PF 、 AF产生影响。

Page 26: 21 世纪高等院校规划教材

例 3-12 :分析下列指令执行后 AX 、 CX寄存器和标志寄存器中各状态位的值。 ADD AX , CX 指令执行前,假设( AX )= 022AH ,( CX )= 14E8H 。 具体执行过程用二进制表示如下: 0000 0010 0010 1010 B + 0001 0100 1110 1000 B 0001 0111 0001 0010 B 由上式可知,最高位无进位, CF= 0 ;低四位有进位, AF= 1 ;最高位为 0 , SF= 0 ;运算结果不为 0 , ZF= 0 ;运算结果中 1 的个数为偶数, PF= 1 ;运算结果无溢出, OF= 0 。 指令执行后, CF= 0 , AF= 1 , SF= 0 , ZF= 0 , PF= 1 , OF= 0 。( AX )= 022AH + 14E8H = 1712H ;( CX )= 14E8H ,内容不变。

Page 27: 21 世纪高等院校规划教材

2 .带进位加法指令 ADC 指令格式: ADC dest , src 功能:与 ADD 指令基本相同,区别是 ADC 指令执行时要将进位标志位 CF加进去。即 dest ( dest )+( src )+ CF 。 该指令主要用于多字节数或多字数的相加运算。在多字节或多字相加时,先进行低字节或低字相加(用 ADD 指令实现),再进行高字节或高字相加。在进行高字节或高字相加时必须加上低位的进位 CF 。

Page 28: 21 世纪高等院校规划教材

例 3-13 :分析以下程序段 DATA SEGMENT NUM1 DW 5678H , 1234H ; 双精度数 12345678H NUM2 DW 0ABCDH , 6789H ; 双精度数 6789ABCDH SUM DW 0 , 0 DATA ENDS …… MOV AX , NUM1 ADD AX , NUM2 ;两低位字相加 MOV SUM , AX ;和放在 SUM 中 MOV AX , NUM1+ 2 ADC AX , NUM2+ 2 ;两高位字相加,同时加上进位 CF MOV SUM+ 2 , AX ……

Page 29: 21 世纪高等院校规划教材

该例完成两个双精度数的加法运算。 运算过程如下所示: ① 两低位字相加 0101 0110 0111 1000 B 5678H+ 0ABCDH = 0245H + 1010 1011 1100 1101 B 进位 CF= 1 1 0000 0010 0100 0101 B ② 两高位字相加 0001 0010 0011 0100 B 1234H + 6789H = 79BDH +  0110 0111 1000 1001 B 0111 1001 1011 1101 B 再加进位 CF + 1 B 79BDH +1 = 79BEH 0111 1001 1011 1110 B

Page 30: 21 世纪高等院校规划教材

3 .加 1 指令 INC 指令格式: INC dest 功能:操作数自身加 1 ,结果再送回到原操作数单元中。即 dest ( dest )+ 1 。 其中: INC 为操作码助记符; dest 为操作数,可以是通用寄存器或存储单元,若 为存储单元,必须指明其操作类型(字或字节)。 该指令执行结果影响除 CF 外的所有条件标志,主要用于对计数器或地址指针的调整,常用在循环结构程序中。

Page 31: 21 世纪高等院校规划教材

例 3-14 :以下指令可实现对寄存器或存储单元加 1 (注意存储单元的类型)。 INC AL INC CX INC WORD PTR [BX] INC BYTE PTR [1000H]

Page 32: 21 世纪高等院校规划教材

3.2.2 减法类指令 包括 SUB 、 SBB 、 DEC 、 NEG 和 CMP五条指令,执行字或字节的减法运算。1 .减法指令 SUB 指令格式: SUB dest , src 功能:将目的操作数与源操作数相减,结果保存在目的操作数单元中,源操作数保持不变。即 dest ( dest )-( src ) 。 其中: SUB 为操作码助记符; dest 为目的操作数,可以是通用寄存器或存储单元; src 为源操作数,可以是立即数、通用寄存器或存储单元。

Page 33: 21 世纪高等院校规划教材

例 3-15 :分析下列指令 MOV AX , 8765H SUB AX , 1234H 上述两条指令可以对两个立即数 8765H 与 1234H求差运算,最终结果保存在 AX 中,即( AX )= 7531H2 .带借位减法指令 SBB 指令格式: SBB dest , src 功能:与 SUB 指令基本相同,区别是 SBB 指令执行时要减去借位标志 CF 。即 dest ( dest )- ( src )- CF 。 该指令主要用于多字节数或多字数相减运算。运算时,先进行低字节或低字相减(用 SUB 指令实现),再进行高字节或高字相减。在进行高字节或高字相减时,必须减去低位的借位 CF 。

Page 34: 21 世纪高等院校规划教材

例 3-16 :有两个双精度数 0A1365724H 和 9248B578H ,计算两数之差,结果的高位放在 DX 中,低位放在 AX 中。 程序段如下: MOV AX , 5724H SUB AX , 0B578H ;低字相减,有借位 MOV DX , 0A136H SBB DX , 9248H ;高字相减,再减去借位

Page 35: 21 世纪高等院校规划教材

3 .减 1 指令 DEC 指令格式: DEC dest 功能:操作数自身减 1 ,结果送回到原操作数单元中。即 dest ( dest )- 1 。 其中: DEC 为操作码助记符; dest 与 INC 指令中规定相同。 注意:该指令不影响进位标志 CF 的状态,常用在循环结构程序中。例 3-17: DEC CX ; CX ( CX )- 1 DEC BYTE PTR[BX] ;必须指明存储单元的操作类型(字或字节)

Page 36: 21 世纪高等院校规划教材

4 .求补指令 NEG 指令格式: NEG dest 功能:将目的操作数按位取反后加 1 ,送回原操作数单元中。即 dest0-( dest ) 。 其中: NEG 为操作码助记符; dest 与 INC 指令中规定相同。 注意:该指令影响所有的条件标志。

Page 37: 21 世纪高等院校规划教材

例 3-18 :分析下列指令的执行结果。 NEG AX 指令执行前,( AX )= 10H 指令执行后,( AX )= ( 0010H )+ 1 = 0FFF0H例 3-19:假设有一双精度数,低字保存在AX 中,高字保存在 DX 中。若要求其补码,可用如下指令实现: NEG AX MOV BX , 0 SBB BX , DX MOV DX , BX

Page 38: 21 世纪高等院校规划教材

5 .比较指令 CMP 指令格式: CMP dest , src 功能:目的操作数减源操作数,但不送结果。即 ( dest )-( src ) 。 其中: CMP 为操作码助记符; dest 为目的操作数,可以是通用寄存器或存储单元; src 为源操作数,可以是立即数、通用寄存器或存储单元。 该指令与 SUB 指令一样执行减法操作,但不回送相减结果,仅影响全部状态标志位。 CMP 指令通常用在选择结构程序中,其后紧跟着条件转移指令,用来根据比较结果转向不同的程序分支。

Page 39: 21 世纪高等院校规划教材

例 3-20 :比较 AX 是否大于 100 ,可用如下代码段实现。 CMP AX , 100 ;( AX )- 100 JB BELOW ;若( AX ) <100 ,则转移 到 BELOW执行 SUB AX , 100  ;否则, AX←( AX )- 100 …… BELOW: ……

Page 40: 21 世纪高等院校规划教材

3.2.3 乘法指令 乘法指令用来实现两个二进制操作数的字节或字相乘运算。根据操作数是无符号数还是带符号数,乘法指令可分为无符号数乘法指令和带符号数乘法指令两种。 1 .无符号数乘法指令 MUL 指令格式: MUL src 功能:两个无符号数相乘。 字节乘法: AX←( AL ) *( src ) 字乘法: DX (高字), AX (低字)←( AX ) *( src ) 其中: MUL 为操作码助记符; src 为源操作数(乘数),可以是寄存器或存储单元,但不能使用立即数或段寄存器。 注意:指令中只指定乘数,被乘数默认在寄存器 AL 或 AX 中。 该指令只影响状态标志 CF 和 OF ,对其它标志位无定义。

Page 41: 21 世纪高等院校规划教材

例 3-21 :假设( AL )= 0B5H ,( BL )= 12H ,分析下列指令的执行情况。 MOV AL , 0B5H MUL BL 指令执行前,( AL )= 0B5H ,为无符号数 181 ; ( BL )= 12H ,为无符号数 18 。 执行指令时,字节相乘,( AL )×( BL )= 3258 = 0CBAH 。 指令执行后,( AX )= 0CBAH , OF= CF= 1例 3-22 :假设 (AL)= 0B5H , (BL)= 12H ,分析下列指令的执行情况。 IMUL BL 指令执行前,( AL )= 0B5H ,为带符号数- 75 ; ( BL )= 12H ,为无符号数 18 。 执行指令时,字节相乘,( AL )×( BL )= - 1350 = 0FABAH 。 指令执行后,( AX )= 0FABAH , OF= CF= 1

Page 42: 21 世纪高等院校规划教材

2 .带符号数乘法指令 IMUL 指令格式: IMUL src 功能:两个带符号数相乘。 字节乘法: AX←( AL ) *( src ) 字乘法: DX (高字), AX (低字)←( AX ) *( src ) 其他说明同 MUL 指令。 该指令只影响状态标志 CF 和 OF ,对其它标志位无定义。指 令执行后,如果乘积的高一半是低一半的符号扩展,则 OF = CF= 0 ;否则, OF= CF= 1 。

Page 43: 21 世纪高等院校规划教材

例 3-22 :假设( AL )= 0B5H ,( BL )= 12H ,分析下列指令的执行情况。 IMUL BL 指令执行前,( AL )= 0B5H ,为带符号数- 75 ; ( BL )= 12H ,为无符号数 18 。 执行指令时,进行字节相乘,( AL )×( BL )= - 1350 = 0FABAH 。 指令执行后,( AX )= 0FABAH , OF= CF= 1

Page 44: 21 世纪高等院校规划教材

3.2.4 除法指令 除法指令用来实现两个二进制操作数的字节或字相除运算。根据操作数不同,又分为无符号数除法指令和带符号数除法指令。1 .无符号数除法指令 DIV 指令格式: DIV src 功能:两个无符号数相除。 字节除法: AL←( AX )÷( src )的商 AH←( AX )÷( src )的余数 字除法: AX←( DX , AX )÷( src )的商 DX←( DX , AX )÷( src )的余数 其中: DIV 为操作码助记符; src 为源操作数(除数),可以是寄存器或存储单元,但 不能使用立即数或段寄存器。 注意:指令中只指定除数,被除数默认在寄存器 AX 或( DX 、 AX )中。该指令对所有状态标志位无定义。

Page 45: 21 世纪高等院校规划教材

例 3-23 :假设( AX )= 0CBAH ,( BL )= 12H ,分析下列指令的执行情况。 DIV BL 指令执行前,( AX )= 0CBAH ,为无符号数 3258 ; ( BL )= 12H ,为无符号数 18 。 执行指令时,进行字节相除,( AX )÷( BL )= 3258÷18= 181= 0B5H ,余数为 0 。 指令执行后,( AH )= 0 ,( AL )= 0B5H

Page 46: 21 世纪高等院校规划教材

2 .带符号数除法指令 IDIV 指令格式: IDIV src 功能:两个带符号数相除。 字节除法: AL←( AX )÷( src )的商 AH←( AX )÷( src )的余数 字除法: AX←( DX , AX )÷( src )的商 DX←( DX , AX )÷( src )的余数 IDIV执行与 DIV 相同,但操作数为带符号数。相除后,商的符号与数学上规定相同,即两个同符号数相除,商为正数,两个异符号数相除,商为负数;余数与被除数同号。 在例 3-23 中,若( AX )= 0CBAH ,( BL )= 12H ,均为带符号数,请自己分析用带符号数的除法指令执行后的结果。

Page 47: 21 世纪高等院校规划教材

3.2.5 符号扩展指令 在实际应用中,我们有时需要将操作数由字节型转换成字型,或由字型转换成双字型。这时不能简单地通过在高位补 0 的方法实现,因为带符号数在计算机中是以补码形式存放。扩展时,正数前补 0 ,负数前全补 1 。为便于扩展, 8086/8088提供了两条符号扩展指令 CBW和 CBD 。

Page 48: 21 世纪高等院校规划教材

1 .字节扩展指令 CBW 指令格式: CBW 功能:将 AL 中数的符号位扩展到 AH 中。若 AL 中的数为正数,则( AH )= 00 ,若 AL 中的数为负数,则( AH )= 0FFH 。例 3-24 :分析下列程序段的执行过程。 MOV AL , -15 ; AL←0F1H CBW 执行上述 2 条指令后,( AX )= 0FFF1H 。

Page 49: 21 世纪高等院校规划教材

2 .字扩展指令 CWD 指令格式: CWD 功能:将 AX 中数的符号位扩展到 DX 中。若 AX 中的数为正数,则( DX )= 0000 ,否则( DX )= 0FFFFH 。例 3-25 :有如下程序段 MOV DX , 0 MOV AX , 0FA48H CWD 指令执行后,( AX )= 0FA48H ,( DX )= 0FFFFH 。 注意:以上两条指令在使用时均不带操作数,即它们只能对隐含的累加器中的内容进行操作。

Page 50: 21 世纪高等院校规划教材

例 3-26 :阅读程序,分析程序完成功能。 STACK SEGMENT STACK DB 200 DUP ( ?) STACK ENDS DATA SEGMENT X DW 25 Y DW 140 Z DW 235 BUF DW 2 DUP ( 0 ) DATA ENDS CODE SEGMENT ASSUME DS:DATA , CS:CODE , SS:STACK BEGIN: MOV AX , DATA MOV DS , AX ;数据段首址送 DS MOV AX , X IMUL Y ; DX , AX←X*Y MOV CX , AX MOV BX , DX MOV AX , Z CWD ;对Z进行符号扩展 ADD AX , CX ADC DX , BX ; DX , AX←X*Y+Z SUB AX , 385 SBB DX , 0 ; DX , AX←X*Y+Z-385 IDIV X MOV BUF , AX MOV BUF+2 , DX MOV AH , 4CH INT 21H ;程序结束 CODE ENDS END BEGIN

Page 51: 21 世纪高等院校规划教材

该程序综合运用了前面介绍的加、减、乘、除算术运算指令,完成如下算式: ( 25*140+235-385 ) /25 最终将计算结果的商 86H 存入 BUF 单元,余数 00H 存入 BUF+2 单元中。

Page 52: 21 世纪高等院校规划教材

3.3 位操作指令 位操作指令又分为逻辑运算指令和移位指令,它们均可直接对寄存器或存储单元中的位进行操作。3.3.1 逻辑运算指令 逻辑运算指令用来对字或字节按位进行逻辑运算,包括逻辑非 NOT 、逻辑与 AND 、逻辑或OR、逻辑异或 XOR、测试 TEST 等五条指令。

Page 53: 21 世纪高等院校规划教材

1 .逻辑非指令 NOT 指令格式: NOT dest 功能:将目的地址中的内容逐位取反后再送回 目的地址中。即 dest (dest) 。例 3-27: MOV AL , 56H ;( AL )= 01010110B NOT AL ;( AL )= 10101001B = 0A9H 说明: NOT 指令是单操作数指令,该操作数可以是立即数以外的任何寻址方式。 NOT 指令不影响标志位。

Page 54: 21 世纪高等院校规划教材

2 .逻辑与指令 AND 指令格式: AND dest , src 功能:将目的操作数和源操作数按位“与”,结果存入目的地址中。

即 dest (dest)∧(src) 。 “与”运算的规则为: 1∧1= 1 , 1∧0= 0 , 0∧1= 0 , 0∧0= 0 。 该指令可以屏蔽操作数中的某些位,使其余位保持不变。要屏蔽的位与 0 相“与”,不变的位与 1 相“与”。

例 3-28 : ASCII 码转换成对应的二进制数。 MOV AL , 35H ;( AL ) 35H AND AL , 0FH ;( AL )= 05H 执行上述两条指令后, AL 寄存器高 4 位被屏蔽,低 4 位保持不变。

Page 55: 21 世纪高等院校规划教材

3 .逻辑或指令 OR 指令格式: OR dest , src 功能:将目的操作数与源操作数按位“或”,结果存入目的地址中。即 dest (dest)∨(src) 。 “或”运算的规则是: 1∨1= 1 , 1∨0= 1 , 0∨1= 1 , 0∨0= 0 。 该指令可以将操作数的某些位置 1 ,其余位保持不变。要置 1 的位与 1“或”,不变的位与 0“或”。

Page 56: 21 世纪高等院校规划教材

例 3-29:二进制数转换成对应的 ASCII 码。 MOV AL , 09H ;( AL )= 00001001B OR AL , 30H ; 00001001B∨00110000B = 00111001B = 39H→AL

例 3-30 :要将 AL 寄存器中的第 5 位置 1 。 MOV AL , 46H ;( AL )= 01000110B OR AL , 20H ; 01000110B∨00100000B = 01100110B = 66H→AL

Page 57: 21 世纪高等院校规划教材

4 .逻辑异或指令 XOR 指令格式: XOR dest , src 功能:将目的操作数与源操作数按位“异或”,结果存入目的地址中。即 dest (dest)⊕(src) 。 “异或”运算的规则是: 1⊕1= 0 , 1⊕0= 1 , 0⊕1= 1 , 0⊕0= 0 。 该指令可以将操作数的某些位变反,其余位保持不变。要变反的位与 1“异或”,不变的位与 0“异或”。例 3-31 :使 AL 的低 4 位变反,高 4 位不变。 MOV AL , 55H ;( AL )= 01010101B XOR AL , 0FH ; 01010101B⊕00001111B= 01011010B = 5AH→AL 另外, 如果操作数自身按位“异或”,则可以将操作数清零。 语句 XOR AX , AX 等价于 MOV AX , 0 。

Page 58: 21 世纪高等院校规划教材

5 .测试指令 TEST 指令格式: TEST dest , src 功能:将目的操作数和源操作数按位“与”,结果不送入任何操作数单元中。 即: (dest)∧(src) 。 该指令和 AND 指令一样执行按位“与”的操作,但不保存结果,主要用于位测试,它的后面通常跟着转移指令,根据测试结果决定转移方向。

Page 59: 21 世纪高等院校规划教材

例 3-32 :要测试寄存器 AL 的最低位是否为 1 ,为 1则转移到 EXIT执行,代码如下: TEST AL , 01H JNZ EXIT …… EXIT :……例 3-33 :要测试寄存器 AX 第 7位和第 15 位是否同时为 0 ,为 0则转 OVER,代码如下: TEST AX , 8080H JE OVER …… OVER:……

Page 60: 21 世纪高等院校规划教材

3.3.2 移位指令 移位指令可以对操作数按位向左或向右移动,根据移动方式的不同,可分为算术移位指令、逻辑移位指令和循环移位指令。

Page 61: 21 世纪高等院校规划教材

1 .逻辑移位指令( 1 )逻辑左移指令 SHL 指令格式: SHL dest , 1 或 SHL dest , CL 功能:将 dest 的内容向左移动指定的位数,最高位移入 CF 中,低位补 0 。 其中: SHL 为操作码助记符; dest 为通用寄存器或存储单元,若为存储单元,应指定其类型。 源操作数 1表示将目的操作数向左移动一位,若移位次数大于 1 ,应预先将移位次数置于 CL 中。 指令执行情况 如图 3-3 所示: CF 高位 低位dest

0

图 3-3 逻辑左移操作示意图

Page 62: 21 世纪高等院校规划教材

例 3-34 :分析以下程序段。 MOV BX , 4 ;( BX )= 00000100B MOV CL , 2 SHL BX , CL ;将 BX 内容左移 2 位, ( BX )= 00010000B , CF= 0 执行程序段以后,( BX )= 10H= 16 ,相当于乘以 2 的 2次方。 由此可见,逻辑左移指令可以方便地实现操作数乘运算( n为移位次数)。不过在使用中要注意是否会发生溢出,否则会得出错误结果。

Page 63: 21 世纪高等院校规划教材

( 2 )逻辑右移指令 SHR 指令格式: SHR dest , 1 或 SHR dest , CL 功能:将 dest 的内容向右移动指定的位数,最低位移入 CF 中,高位补 0 。 其中: SHR为操作码助记符; dest 为通用寄存器或存储单元,若为存储单元,应指定其类型。 源操作数 1表示将目的操作数向右移动一位,若移位次数大于 1 ,应预先将移位次数置于 CL 中。 指令执行情况如图 3-4 所示: CF高位 低位dest

0

图 3-4 逻辑右移操作示意图

Page 64: 21 世纪高等院校规划教材

例 3-35 :分析以下程序段。 MOV BX , 24H ;( BX )= 36 = 00100100B MOV CL , 2 SHR BX , CL ;将 BX 内容右移 2 位, ( BX )= 00001001B , CF= 0 执行程序段以后,( BX )= 09H = 9,相当于除以2 的 2次方。 由此可见,逻辑右移指令可以方便地实现操作数除运算( n为移位次数)。不过在使用中要注意操作数应该为无符号数,否则会得出错误结果。

Page 65: 21 世纪高等院校规划教材

2 .算术移位指令( 1 )算术左移指令 SAL 指令格式: SAL dest , 1 或 SAL dest , CL 功能:其操作与逻辑左移指令 SHL完全相同,不再介绍。( 2 )算术右移指令 SAR 指令格式: SAR dest , 1 或 SAR dest , CL 功能:将 dest 的内容向右移动指定的位数,最低位移入 CF 中,最高位保持不变。 其中: SAR为操作码助记符; 其它说明同前。 指令执行情况如图 3-5 所示:

CF高位 低位dest

图 3-5 算术右移操作示意图

Page 66: 21 世纪高等院校规划教材

例 3-36 :分析以下程序段。 MOV BX , 0DCH ;( BX )= -36 = 11011100B MOV CL , 2 SAR BX , CL ;将 BX 内容右移 2 位, ( BX )= 11110111B , CF= 0 执行程序段以后,( BX )= 0F7H= -9,相当于除以 2 的 2次方。 由此可见,算术右移指令可以方便地实现对有符号操作数除运算( n为移位次数)。

Page 67: 21 世纪高等院校规划教材

3 .循环移位指令( 1 )循环左移指令 ROL 指令格式: ROL dest , 1 或 ROL dest , CL 功能:将 dest 的内容向左移动指定的位数,最高位同时移入最低位和 CF 中。 其中: ROL 为操作码助记符; 其它说明同前。 指令执行情况如图 3-6 所示:

高位CF 低位dest

图 3-6 循环左移操作示意图

Page 68: 21 世纪高等院校规划教材

例 3-37:分析以下程序段。 MOV AX , 1234H ;( AX )= 0001001000110100B MOV CL , 8 ROL AX , CL ;将 AX 内容循环左移 8 位 ( AX )= 0011010000010010B , CF= 0 执行程序段以后,( AX )= 3412H ,相当于将高 8 位与低 8 位交换。 由此可见,循环移位指令可以改变操作数中原有位的位置。

Page 69: 21 世纪高等院校规划教材

( 2 )循环右移指令 ROR 指令格式: ROR dest , 1 或 ROR dest , CL 功能:将 dest 的内容向右移动指定的位数,最低位同时移入最高位和 CF 中。 其中: ROR为操作码助记符; 其它说明同前。 指令执行情况如图 3-7所示: CF高位 低位dest

图 3-7 循环右移操作示意图

Page 70: 21 世纪高等院校规划教材

( 3 )带进位的循环左移指令 RCL 指令格式: RCL dest , 1 或 RCL dest , CL 功能:将 dest 的内容连同 CF 标志一起向左循环移动所规定的位数。 其中: RCL 为操作码助记符; 其它说明同前。 指令执行情况如图 3-8 所示:例 3-38 :将 AX 中的最高位移至 BX 的最低位,可用如下语句实现: RCL AX , 1 ;将 AX 中的最高位移至 CF 中 RCL BX , 1 ;将 CF 的内容移至 BX 的最低位

高位CF 低位dest

图 3-8 带进位循环左移操作示意图

Page 71: 21 世纪高等院校规划教材

( 4 )带进位的循环右移指令 RCR 指令格式: RCR dest , 1 或 RCR dest , CL 功能:将 dest 的内容连同 CF 标志一起向右循环移动所规定的位数。 其中: RCR为操作码助记符; 其它说明同前。 指令执行情况如图 3-9所示: CF高位 低位dest

图 3-9 带进位循环右移操作示意图

Page 72: 21 世纪高等院校规划教材

3.4 处理机控制指令 处理机控制指令主要是对状态寄存器 Flags 中的位以及 CPU 的运行状态进行控制。主要指令如下: 进位标志清零指令 CLC 进位标志置 1 指令 STC 方向标志清零指令 CLD 方向标志置 1 指令 STD 中断标志清零指令 CLI 中断标志置 1 指令 STI 空操作指令 NOP 停机指令 HLT 等待指令WAIT

Page 73: 21 世纪高等院校规划教材

3.5 顺序程序设计方法 顺序程序结构是最基本、最简单的程序结构,即完全按指令书写的前后顺序执行每一条指令。从流程图上看,顺序结构的程序只有一个起始框、一个终止框和一至几个处理框。程序无分支、无循环,按直线形式顺序执行。设计这种程序的方法十分简单,只要遵照算法步骤依次写出相应的指令即可。设计时主要考虑如何选择简单有效的算法,如何选择存储单元和寄存器。实际应用中单纯的顺序结构程序非常少见,但这种程序结构是其它程序结构如分支、循环、子程序的主体。 下面通过几个例子介绍顺序程序设计的基本思想。

Page 74: 21 世纪高等院校规划教材

例 3-39:假设( BX ) = 00F8H ,计算( BX )﹡ 10 →( BX )。 分析:本例算法比较简单,要实现两个数的乘法运算,可以直接用乘法指令实现。考虑到运算结果不会产生溢出,我们可以选用加法及移位指令来代替乘法。 具体算法如下:左移指令可以方便地实现将操作数乘 2 的整数次方( 2 、 4 、 8 、 16 ),由于本例的乘数 10 不是 2 的整数次方,因此我们可以再结合加法运算来实现,即 ( BX )﹡ 10 =( BX )﹡ 8 +( BX ) +( BX )。

Page 75: 21 世纪高等院校规划教材

源程序如下: STACK SEGMENT STACK DB 200 DUP ( ?) STACK ENDS CODE SEGMENT ASSUME CS:CODE , SS:STACK BEGIN: MOV BX , 00F8H MOV AX , BX ;将原始数据保存在 AX 中 MOV CL , 3 ; CL 中存放移位次数 3 SHL BX , CL ;算术左移 3次,即( BX )﹡ 8 →( BX ) ADD BX , AX ADD BX , AX MOV AH , 4CH INT 21H ;程序结束 CODE ENDS END BEGIN 程序执行后,( BX ) = 09B0H 。

Page 76: 21 世纪高等院校规划教材

例 3-40 :编写一个汇编语言程序,要求从键盘输入一个小写字母,将其转换成大写字母在屏幕上显示出来。 分析:本例涉及到对输入设备和输出设备的操作,可以利用DOS 功能调用来实现。另外将小写字母转换成大写字母只要将其 ASCII 码减去 32 即可。 为了简化程序设计,程序中我们假设从键盘输入的字符一定是小写字母。 程序流程图如图 3-10 所示:

开始

结束

1 号调用输入一小写字母

2 号调用显示大写字母

将小写字母转换成大写

图 3-10 大小写字母转换程序流程图

Page 77: 21 世纪高等院校规划教材

源程序如下: STACK SEGMENT STACK DB 200 DUP ( ?) STACK ENDS CODE SEGMENT ASSUME CS:CODE , SS:STACK BEGIN: MOV AH , 01H ; 1 号调用,从键盘输入一字符存入 AL INT 21H SUB AL , 20H ;将 AL 中字符的 ASCII 码减去 20H 变成大写字母 MOV DL , AL MOV AH , 02H ; 2 号调用,在屏幕上显示 DL 中的内容 INT 21H ;取第一个数送 AX 中 MOV AH , 4CH INT 21H ;程序结束 CODE ENDS END BEGIN

Page 78: 21 世纪高等院校规划教材

例 3-41 :将 NUM 中的二进制数以十六进制形式在显示器上显示出来。 本例综合运用了前面介绍的数据传送指令( MOV 、 LEA )、加 1 指令( INC )、逻辑运算指令( AND 、 OR)和移位指令( SHR),读者可以自己分析程序的执行过程。 源程序如下:

Page 79: 21 世纪高等院校规划教材

STACK SEGMENT STACK DB 200 DUP ( ?) STACK ENDS DATA SEGMENT NUM DB 01100101H BUF1 DB 0AH , 0DH ,‘ (NUM)=’ BUF2 DB 4 DUP ( ?) DATA ENDS CODE SEGMENT ASSUME DS:DATA , CS:CODE , SS:STACK BEGIN: MOV AX , DATA MOV DS , AX ;数据段首址送 DS LEA DI , BUF2 MOV AL , NUM MOV CL , 4 SHR AL , CL OR AL , 30H MOV [DI] , AL INC DI MOV AL , NUM AND AL , 0FH OR AL , 30H MOV [DI] , AL INC DI MOV BYTE PTR [DI] ,‘ H’ INC DI MOV BYTE PTR [DI] ,‘ $’ MOV DX , OFFSET BUF1 MOV AH , 9 ; 9号调用显示字符串 INT 21H MOV AH , 4CH INT 21H ;程序结束 CODE ENDS END BEGIN

Page 80: 21 世纪高等院校规划教材

本章小结 本章主要讲授了汇编语言中的常用机器指令和顺序程序设计方法。机器指令是组成代码段内容的主体,代码段通过对机器指令的合理组合实现程序的功能。熟练掌握常用机器指令并灵活使用各种寻址方式是汇编语言程序设计的重要基础。只有学好它们,才能正确选用指令,设计出好的应用程序。顺序结构是程序设计中最简单的一种结构形式,它是组成复杂程序的基础。一定要熟练掌握其结构特点和设计方法。