数据表示现代计算机接口技术课件

PPT
  • 阅读 67 次
  • 下载 0 次
  • 页数 267 页
  • 大小 4.799 MB
  • 2022-12-01 上传
  • 收藏
  • 违规举报
  • © 版权认领
下载文档50.00 元 加入VIP免费下载
此文档由【小橙橙】提供上传,收益归文档提供者,本网站只提供存储服务。若此文档侵犯了您的版权,欢迎进行违规举报版权认领
数据表示现代计算机接口技术课件
可在后台配置第一页与第二页中间广告代码
数据表示现代计算机接口技术课件
可在后台配置第二页与第三页中间广告代码
数据表示现代计算机接口技术课件
可在后台配置第三页与第四页中间广告代码
数据表示现代计算机接口技术课件
数据表示现代计算机接口技术课件
还剩10页未读,继续阅读
【这是免费文档,您可以免费阅读】
/ 267
  • 收藏
  • 违规举报
  • © 版权认领
下载文档50.00 元 加入VIP免费下载
文本内容

【文档说明】数据表示现代计算机接口技术课件.ppt,共(267)页,4.799 MB,由小橙橙上传

转载请保留链接:https://www.ichengzhen.cn/view-77597.html

以下为本文档部分文字说明:

汇编语言(8学时)第二节数据表示第一节基本概念知识概述第三节例题及操作第四节汇编语言的基本元素第五节说明性语句第六节微处理器的基本指令集第七节COM文件的编程第八节宏第九节算术协处理器退出第十节CPU扩展指令集第十一节Win32汇编语言的编程第一节基本概念(4学时)3.1.

1汇编语言的由来退出汇编语言:汇编语言的语句和其语法规则。一、机器指令机器指令:它是计算机能识别的一组二进制代码,用于指出计算机所要进行的操作以及操作对象,是在设计CPU时,就已确定的编码。例如:1.把数“16‖送到寄存器AL中,用下列机器指令

实现:1011000000010000操作码操作数3.1.12.把数“4‖与寄存器AL的内容相加,结果仍放在AL中,用下列机器指令实现:0000010000000100操作码操作数3.把寄存器AL的内容送到地址为6的单元中

,用下列机器指令实现:101000100000011000000000操作码操作数地址不同的机器操作,由不同的代码指令实现。一个计算机能够执行的所有代码指令的集合,就是该计算机的指令系统。退出3.1.1二、机器

语言与机器语言程序1.机器语言:把指令系统及书写代码程序的语法规则称为机器语言。2.机器语言程序:用机器语言编写的程序称为机器语言程序。三、汇编语言由于机器指令难于使用,人们采用符号代替二进制代码,于是产生了符号化的汇

编语句。例如:机器指令汇编语句1011000000010000MOVAL,160000010000000100ADDAL,4101000100000011000000000MOVADDR6,AL退出3.1.1

四、高级语言这里仍用相同的两个数的加法运算为例,用机器语言、汇编语言、高级语言实现的语句如下:机器指令汇编语句高级语言1011000000010000MOVAL,160000010000000100ADDAL,4ADDR6=16+4101000100000011000000000MOVADDR

6,AL1.与汇编语言相比,高级语言有两个主要优点:使用方便。易读、易写、易调试,因而容易学习,编程速度也快。便于移植。程序很容易从一种计算机换到另一种计算机上运行。退出3.1.12.与高级语言相比,汇编语言的优点是:效率高。其程序比相同功能的高级语言程序所占的内存

少,运行速度快。能将计算机的全部功能提供给用户使用。这是因为,汇编语言能最直接最充分地描述计算机语言,使用汇编语言就是使用机器语言。五、汇编语言的应用领域要求执行效率高,反应快的领域,如操作系统内核、工业控制、实时系统;系统频繁使用的子程序或程序段;与硬件资源密切相关的软件开发,如设备驱动

程序等;受内存容量限制的应用领域,如小型控制仪器、仪表。退出3.1.2汇编程序汇编程序:它能把用汇编语言编写的源程序翻译成CPU能识别的机器指令序列。这里,称该翻译程序为汇编程序。图3.1是一次翻译过程的示意图。退出第二节数据表示(2学时)3.

2.1十六进制数及Intel惯例退出一、十六进制数十六进制数是逢十六进1位,每一位有16种状态,用0,1,2,,9,A,B,C,D,E,F表示。如果十六进制数是以字符开头,为了与字符串区别,须在十六进制数的开头加数码‘0’。3.2.1二、Intel存数的惯例数据

在内存中的存放有两种不同的格式:Big-Endian格式和Little-Endian格式。在Big-Endian格式中,数据的存放原则是:高地址存放低字节,低地址存放高字节。这种存储格式如图3.2所示。在Little-Endia格式中,数据的存放原则是:低地址存放低字节,高地址存放高字节。

这种存储格式如图3.3所示。Intel芯片的是按Little-Endia格式存储数据。退出3.2.2定点微处理器处理的数据类型对于Intel系列的8086CPU能够处理4种类型的数据。一、无符号二进制数1.8位无符号二进制数形式:数值其数值范围:0~255(28-1)。2.16为无符号二进制

数形式:数值其数值范围:0~65535。3.32为无符号二进制数形式:数值退出3.2.2二、带符号二进制数带符号的二进制数,其左边的一位(最高位)为符号位,“0”表示正,“1”表示负。带符号的二进制数用补码来表示。1.8位有符号二进制数形式:S数码其数值范围:-128(-27)~+

127(+(27-1))。2.16位有符号二进制数150形式:S数码其数值范围:-32768(-215)~+32767(+(215-1))。退出3.2.23.32位有符号二进制数310形式:S数码其数值范围:-2147483648(-231)~+2147483647(+(231-1))。三、

无符号十进制数BCD码无符号十进制数BCD(Binary-CodedDecimal)每位数用4位二进制数表示。显然,4位二进制数中只有0~9有效。这种数称为BCD码,它的存放形式有两种。退出3.2.21.无符号组合式BCD码70形式:十位数个位数一个字节存放两位十进制数。

字节的十进制数范围:0~99。例如,34的组合式BCD码为:7000110100书写为:34H例如,754组合式BCD码为:70700000011101010100书写为:754H退出3.2.22.无符号分离式BCD码70形式:uuuu

数码一个字节存放一位十进制数。字节的十进制数范围:0~9。其中u表示任意。例如,34的无符号分离式BCD码形式为:7070uuuu0011uuuu0100若u位为“0”,书写为:0304H退出3.2.2四、字符数据用单引号

括起来的字符成为字符数据。每个字符占1个字节。在计算机中用该字符对应的ASCII表示。例如,字符数据ABCD在内存中用十六进制表示为41424344H,可记成:ABCD=41424344H又如字符数据53,用十六进制表示则为3533H,可记成

:53=3533H寄存器或内存中二进制数码按哪一种数据来理解,其值可能是不同的。例如表3.2中有4个字节的数据,分别按5种数据类型来理解,其值就各不相同。退出第三节例题及操作为了较生动地由浅入深地讲述语法,也为了使读者能较快地上机

实践,我们这里先介绍一个用汇编语言编写的完整段源程序及其相应的简化段源程序,并简要说明汇编语言程序的上机操作步骤。退出3.3.1例题简介源程序由语句组成,汇编语句一般可分为三部分,其一般形式为:[名字]指令

操作符[操作数1[,操作数2[,操作数3]]][;注释]例3-1计算Z=(X-Y+3),其中X=10,Y=4。汇编语言对大小写不敏感,但是为了区分保留字与标识符,本例中把保留字用大写表示,标识符用非大写标识符表示,以示区分。退出3.3.

1一、名字与指令操作符1.名字:其定义类似于高级语言中的标识符的概念,由用户给出。2.指令的操作符:表示指令的主要操作或功能,通常分为伪操作符与操作符两大类。1)伪操作符:由汇编程序执行的操作。2)操作符:由CPU执行的

操作。二、操作数部分1.两操作数语句形式:[标号:]操作符目标操作数,源操作数退出3.3.1功能:目标操作数(目标操作数)操作(源操作数)操作数可以是变量、寄存器、段名或数据。2.单操作数语句形式:[标号:]操作符操作数功能:

对单个操作数进行操作符规定的操作。这里的操作数同以上说明。3.无操作数语句形式:[标号:]操作符功能:执行操作符规定的操作。从例子可以看出,汇编语言源程序由分段组成。该程序有3个分段。第1个分段是堆栈段,第二个分段是数据段,第3个分段式程序段。退出3.3.2上机操作步骤汇编语言的运行分下列

3个步骤:步骤1:编辑源程序首先是进入编辑程序,如EDIT.COM,记事本及写字板等编辑软件,键入源程序,正确输入完成后,命名存盘,其中.ASM是汇编程序规定的源文件的扩展名。步骤2:汇编源程序及连接目标程序汇编语言源程序可适用下列简化命令进行源程序编译:MASMFILENAM

E.ASM如果系统显示出有语法错误,则应在进入编辑程序进行修改。如果系统显示出下列信息:WARNINGSEVEREERRORSERRORS00退出3.3.2则表示源程序无语法错误,已完成汇编,并得到一个目标文件FILENAME.OBJ。这是可用下列命令进行连接:LINKFILENAM

E.OBJ如果有错误信息,则还需要进入编辑程序进行修改。如果无错误,则产生FILENAME.EXE文件。步骤3:运行.EXE文件运行FILENAME.EXE文件,程序输出结果为9。如果程序结果有误,则可进入DEBUG或

CV调试系统中运行、调试。退出第四节汇编语言的基本元素(2学时)3.4.1符号退出源程序中的符号有两类:一类是保留字(事先由汇编程序约定的,它们不用定义与说明,也不能更改);另一类是名字(由用户定义)。一、保留字1.寄存器名称的约定2.操作符的约定3.伪操

作符的约定3.4.1二、名字定义名字必须遵守下列规则:名字只能由下列字符组成:字母AZ数字09符号$@?._数字不能作为名字第一个字符。名字的长度可达31个字符,超过部分的字符被系统忽略。符合上面规定的字符组合并且不与任

何保留字相同的字符串被认为是合法的名字,否则是非法的名字。常见的名字有以下几种。退出3.4.11.标号及其属性标号:是一个冒号“:”引入的名字,它代表所定义语句对应代码指令的开始地址。该地址形式为:该代码段的段地址:偏移地址标号有3个属性:1)标号的段值属性:标号的段值属性就是标号所

在段的段地址。标号的段值属性可写成如下形式:SEG标号如SEGSTART就是START所在代码段的段地址。退出3.4.12)标号的偏移属性:标号的偏移属性是指标号所处位置的偏移地址。标号的偏移属性可写成如下形式:OFFSET标号如OFFSETSTAR

T就是START所在代码段的偏移地址。3)标号的类型属性:标号有FAR与NEAR之分,这个特性称为标号的类型属性,其形式为:TYPE标号该属性系统也定义了一个类型值:若为近标号,则(TYPE标号)=-

1若为远标号,则(TYPE标号)=-2对某段来说,远标号表示该标号的定义不在本段。近标号表示该标号的定义在本段。因此,标号的类型是相对的。退出3.4.1标号的默认类型为NEAR型,标号的类型是相对的,也就是说,标号的类型是在指令引用它

时才确定下来的。2.变量及属性变量是用数据伪操作符定义的名字。一般数据用下列伪操作符定义:DB—每个数据为1个字节。DW—每个数据为1个字,即2个字节。DD—每个数为1个双字,即4个字节。DQ—每个数

为8个字节。DT—每个数为10个字节。变量有两重含义,它一方面代表所表示的变量的值,另一方面表示变量所占空间的首地址。该地址形式为:所在段的段地址:所在段的偏移地址退出3.4.1变量有5个属性:1)变量的段属性变量的段值属性是指变量定义

所在段的段地址。变量的段值属性可写成如下形式:SEG变量2)变量的偏移属性变量的偏移属性是指变量所处位置的偏移地址。变量的偏移属性可写成如下形式:OFFSET变量3)变量的类型属性变量所表示的数据元素的长度(以字节为单位)为变量的类型,其形式为

:TYPE变量因而“TYPE变量”这个表达式的值是1~10之间的数字。退出3.4.14)变量的长度属性变量所指数据元素的个数为变量的长度属性,其形式为:LENGTH变量但是变量的元素个数只对单项的重复子句有意义,对其它变量,LENGTH变

量=1。5)变量的容量属性变量的容量属性是指变量所表示数据所占空间的字节和,其形式为:SIZE变量但是变量的容量属性也只对单项的重复子句有意义,实际上,SIZE变量的值也可用下式计算:SIZE变量=(LENGTH变量)(TYPE变量)退出3.4.13.段名用伪操作符SEGMENT定义的名字为

段名。段定义形式为:段名SEGMENT段名ENDS段名是所定义段的符号化段地址。退出3.4.14.过程名用伪操作符PROC定义的名字成为过程名。过程的定义形式为:过程名PROC类型过程名ENDS过程名与标号类似,只是远、近过程名的类型是在过程的定义时由“

类型”参数决定,类型为“FAR”时为远过程,类型为“NEAR”时为近过程。过程名的默认类型为近过程。远过程名是过程所处位置首地址的符号化地址,表示形式为:段地址:偏移地址近过程名则是过程所处位置首地址的偏移地址的符号化偏移地

址。退出3.4.2常数数值常数汇编语言中的常数字符串常数属性常数当前地址数一、数值常数数值常数分为整数常数和实数常数。1.整数常数按其基数的不同,可以有二进制数B、八进制数Q、十进制数D、十六进制数H等几种不同的表示形式,汇编语言中采用不同

的后缀加以区分。当一个数值数据后面没有后缀时,将默认为十进制数。退出3.4.22.实数常数实数常数在机内的表示有十进制和十六进制两种。1)十进制实数它是一个带小数点的十进制数或带方幂的十进制数。例5.89,2.0,5.1E6,其中5.

1E6=5.11062)十六进制实数用R替换H作标记的十六进制实数,为实数在机内的表示形式。它与十六进制数一样必须以数字作首字符。例如:42C88000R是IEEE格式编码的短实数100.25在机内的表示。0C1C90000R是IEEE格式编码的短

实数-25.125在机内的表示。退出3.4.2二、字符串常数字符串常数是由单引号“”括起来的一串字符。例如:AssmblyLanguageandProgramming23退出3.4.2三、属性常数以上讲的名字的属性,都可以作为常数使用。1.段值形式:SEG标号

或变量2.偏移值形式:OFFSET标号或变量3.变量类型值形式:TYPE变量4.变量长度值形式:LENGTH变量5.字节总和值形式:SIZE变量退出3.4.2四、当前地址数汇编语言允许把某些语句所处内存地址取出使用。一种是$代表当前位置的

偏移地址。一般有两种方式另一种是THIS指示当前位置的地址及其类型。形式:[变量]THIS类型。类型为“BYTE”时,表示所处位置是字节变量的地址。类型为“WORD”时,表示所处位置是字变量的地址。类型为“DWORD”时,表示所处位置是双字变量的地址。类型为“NEAR”时,表示所处位置是本段标号的

地址。类型为“FAR”时,表示所处位置是远标号地址。退出3.4.3表达式表达式:由数据和运算符组成,汇编语句在表达式中允许使用的数据有数字和标识符,并且限制表达式在整数范围内使用。汇编语言表达式运算法则同高级语言一样,即:首先计算高级优先级的

运算符。相同优先级的运算符按从左到右的顺序计算。括号可以改变运算符的优先级,即应最先考虑括号中的运算符。汇编语言的表达式不能构成单独语句。算术运算符运算符逻辑运算符关系运算符。退出3.4.3一、算术运算符及移位运算符1.*,/,MOD,SHL,SHR形式:数据1*数据2或数据1/数据2

*与/是一般乘除法。形式:数据1MOD数据2其值为数据1/数据2的余数。形式:数据1SHL数据2其值为数据1左移数据2位的值。形式:数据1SHR数据2其值为数据1右移数据2位的值。退出3.4.32.+,-+,-为一般的加、减法。算术运算

符应用于数字数据,结果也是数字。当算术运算符应用于存储器即地址数据时,其规则就更加严格:只有当结果有明确的、有意义的物理解释时,这些运算才有效的。二、关系运算符形式:数据1EQ数据2判断数据1等于数据2?形式:数据1NE数据2判断数据1不等于数据2?退出3.4.3形式:数据

1LT数据2判断数据1小于数据2?形式:数据1LE数据2判断数据1小于等于数据2?形式:数据1GT数据2判断数据1大于数据2?形式:数据1GE数据2判断数据1大于等于数据2?关系运算符的两个数据,或者都是数字

的,或者是同一段的存储器地址。退出3.4.3三、逻辑运算符形式:NOT数据表示把数据取反。形式:数据1AND数据2其值为数据1与数据2进行逻辑与运算。形式:数据1OR数据2其值为数据1与数据2进行逻辑或运算。形式:数据1XOR数据2其值为数据1与数据2进行逻辑异或

运算。逻辑运算符的数据只能是数字的。退出第五节说明性语句(2学时)退出汇编语言的语句有两种基本类型,即执行性语句与说明性语句。执行性语句也就是CPU指令系统中的指令。说明性语句由伪操作符定义,仅仅在汇编过程中告诉汇编程序应如何汇编。常用说明性语句共有5种类型。内存变量定

义语句:语句用于描述数据和给数据赋值。包括简单内存变量和复合内存变量定义语句。3.5调整偏移量语句:调整偏移量语句是在内存变量定义时用来调整内存变量起始偏移量的。符号定义语句:为常量或表达式定义一个符号名的语句。程序结构语句:程序结构语句用于说明源程序的结构和目标程序的结构

。这些将在3.6.2.7节讲解。条件汇编语句:条件汇编语句用于说明汇编某部分语句时的条件,满足条件汇编,否则跳过这部分不予汇编。详细内容见3.8.2节。退出3.5.1内存变量定义语句一、简单内存变量定

义语句1.字节变量定义语句形式:[变量名]DBEXP[,EXP]EXP除字符串外每个数值占1个字节。EXP可以是整数表达式、字符串以及“?”。“?”在数据说明语句中表示不确定的值,即不赋初值。退出3.5.1例如:bVarADB101B

,7,D,0FH,-1DB2*56,INPUTPLEASE$,?DB100DUP(0)bVarBDB1,2,3,4,5,6bVarCDB1,2,3,4,5,6见内存分配图退出3.5.12.字变量定义语句形式:[变量名]DWEXP[,EXP]它的数值为EXP,

每个数值占2个字节。EXP可以是整数表达式、字符串以及“?”。注意,EXP若是字符串最多只能为两个字符,不足两个字符采用右对齐,左补0。整数表达式可包括属性常数,若取偏移值,可省略标记“OFFSET”。例如:wVarADW011B,-32678,65535,0FH,2

,5+7ACH,ABwVarBDWwVarA,DISPwVarCDW1,2,3,4,5,6退出3.5.13.双字变量定义语句形式:[变量名]DDEXP[,EXP]它的数值为EXP,每个数值占4个字节。EXP可以是整数表达式、字符串以及“?”。表达式可包括属性常

数,变量及标号在这里取段值与偏移值时不用标记,双字中低地址字存放偏移值,高地址字存放段值。字符串最多可写4个字符。例如:dVarADD101B,2D89AH,5,5.0,3F800000R,20E30dVarBDDdVarA,wVarA退出3.5.1

4.三字变量定义语句形式:[变量名]DFEXP[,EXP]它的数值为EXP,每个数值占6个字节。EXP可以是常数表达式、字符串以及“?”。字符串最多可写6个字符。例如:fVarADF56DC2301AB00H,-15.四字变量定义语句形式:[变量名]DQEXP[,EXP]它的数值为EXP,

每个数值占8个字节。EXP可以是常数表达式、字符串以及“?”。字符串最多可写8个字符。退出3.5.1例如:qVarADQ1,-1,1.2,1.0,A6.十字节变量定义语句形式:[变量名]DTEXP[,

EXP]它的数值为EXP,每个数值占10个字节。EXP可以是常数表达式、字符串以及“?”。字符串最多可写10个字符。实数在内存中一律为暂时实数形式。注意,在该语句中十进制整数的标记“D”通常不可省略

。省略后表示BCD码数。例如:tVarADT1.0,567834,567834D,3FFF5600000000000000R退出3.5.1二、复合内存变量定义语句1.重复子句形式:重复次数DUP(EXP[,EXP])其中重复次数取非零正整数,EXP可以是常数表达式、字符串以及“?

”。例如:bArrayDB100DUP(?)dArrayDD4DUP(160),90DUP(A5)tArrayDT4.4,10DUP(56)退出3.5.12.结构类型1)结构类型的定义用STRUC和ENDS可

以把一系列数据定义语句括起来作为一种新的、用户定义的结构类型。其一般说明格式如下:结构名STRUC变量定义序列结构名ENDS结构名代表整个结构类型,开始和结束两个结构名必须一致。结构内被定义的变量为结构字段,变量名即为字段名。退出3.5.1一个结构中允许含

有任意多个字段,各字段的类型和所占字节数也都可任意。如果字段有字段名,则字段名必须唯一。每个字段可独立存取。例如:courseSTRUCdNoDD1cNameDB'English'wScoreDW?courseENDS上例中,course是结构名,它

含有三个字段:dNo、cName和wSCORE,这些字段的类型分别是DD、DB和DW。结构course的字段分布如图3.4所示。退出3.5.12)结构类型变量的定义它的说明形式与前面介绍的简单数据类型的变量说明基本上一致。形式:[变量名

]结构名<[字段值表]>字段值表是给字段赋初值,中间用逗号','分开,其字段值的排列顺序及类型应与该结构说明时各字段相一致;如果结构变量中某字段用其说明时的缺省值,那么,可用逗号来表示;如果所有字段都如此,则可省去字段值表,但必须保留一对尖括号"<>"。退出3.5.1例如:cours

eEnglishcourse<>;使用缺省值courseAssembercourse<2,’Assember’,90>courseMathcourse<,’Math’,78>;使用缺省的学号3)结构类型字段的引用定义了结构类型

的变量后,若要访问其结构中的某个字段,则可采用如下形式:结构变量名.字段名退出3.5.1下面二种方法都可以把结构变量courseMath中字段wScore的内容赋给寄存器AX,但如果在字段wScore之前增加或减少了字段,那么,偏移量的引用是

需要改变,而字段名的引用是无需改变的。(1)用字段名引用MOVAX,courseMath.wScore(2)用字段的偏移量引用LEABX,courseMathMOVAX,[BX+11];其中11是wScore的偏移量退出3.5.13.共用体类型有时需要

使几种不同类型的变量存放在同一段内存单元中。例如,可把一个字变量、一个字节变量、一个双字变量放在同一个地址开始的内存单元中,如图3.5所示。这种使几个不同的变量共占同一段内存的结构,称为“公用体”类型的结构。1)公用体类型的定义共用体类型定义格式如下:公用体名

UNION变量定义序列公用体名ENDS退出3.5.1共用体类型中的各字段相互覆盖,即同样的存储单元被多个不同的字段所对应,并且其每个字段的偏移量都为0。共用体类型所占的字节数是其所有字段所占字节数的最大值。例如:dataUN

IONwVarDW9876HbVarDB09HdVarDD1234ABCDHdataENDS退出3.5.12)公用体类型变量的定义形式:[变量名]共用体名<[字段值表]>注意:共用体数据类型的变量只能用第一个字段的数据类型来进行初始化。例如:dNum1data<0F435h>dNum2data<

54674357H>;初始化错误3)公用体类型字段的引用定义了供用体类型的变量后,就可根据需要,以不同的字段名来存取该公用体类型中的数据。引用其字段的具体形式如下:公用体类型变量名.字段名退出3.5.1例如:MOVAX,dNum1.wVarMOVdNum1.bVar,BL4.记录类型汇编语言

的记录类型与高级语言的记录类型不同,它是为按二进制位存取数据提供方便的。1)记录类型的定义记录类型定义格式如下:记录名RECORD字段名:宽度[=EXP][,字段名:宽度[=EXP],]退出3.5.1其中记录名及字段名是用户定义

的名字,宽度取1~16之间的整数,它表示字段所占的二进制的位数,EXP是给相应字段赋初值,是个可选项。一个记录最长为机器字长。信息一律按照字段的先后顺序从信息区的高位向低位排列,右对齐,左补0。例如:recodeNameRECORDx:7,y:4,z:5则记录各字段的分配形式为

:XXXXXXXYYYYZZZZZrecodeName1RECORDa:2,b:3则记录各字段的分配形式为:000AABBB退出3.5.12)记录变量的定义形式:[变量名]记录名<[字段值表]>字段值表是给字段赋初值,中间用逗号','分开,其字段

值的排列顺序及大小应与该记录说明时各字段相一致。如果记录变量的某字段用其说明时的缺省值,那么,可用逗号来表示;如果所有字段都如此,则可省去字段值表,但必须保留一对尖括号"<>"。例如:Name1recordName<7,0,2>退出3.5

.13)记录的专用操作符操作符WIDTH和MASK是用于记录类型变量的两个属性操作符,犹如变量的OFFSET和SEG操作符的应用一样。(1)操作符WIDTH操作符WIDTH返回记录或其字段的二进制位数,即其

宽度。其一般书写格式如下:WIDTH记录名或WIDTH记录字段名假设有上面的记录recordName定义,则有下列属性结果:WIDTHrecordName=16WIDTHX=7WIDTHY=4WIDTHZ=5退出3.5.1(2)操作符MASK操作符MAS

K返回一个8位或16位二进制数。在该二进制数中,被指定记录或字段的对应位的值为1,否则,其值为0。其一般书写格式如下:MASK记录名或MASK记录字段名假设有上面的记录recordName定义,则有下列属性结果:MASKX=0FE00HMASKY=01E0

HMASKZ=001FH退出3.5.14)记录字段的引用其书写格式如下:记录字段名字段名在使用中代表1个数值,此数值是把该字段右移到信息区最右端的移位次数。假设有上面的记录recordName定义,则有下列

属性结果:x=9y=5z=0退出3.5.2调整偏移量定义语句常用的调整偏移量伪指令有:EVEN、ALIGN和ORG,它们的主要目的是:为了更有效地读取内存单元的内容。一、偶对齐定义语句形式:EVEN功能:告诉汇编程序,本伪指令下面

的内存变量从下一个偶地址单元开始分配。退出3.5.2二、对齐定义语句形式:ALIGNEXP其中:EXP必须是2的幂,如2、4、8和16等。功能:告诉汇编程序,本伪指令下面的内存变量必须从下一个能被EXP整除的地址开始分配。例如:bVar1DB34HbVar

1DB34HEVEN等价ALIGN2wVar2DW8795HwVar2DW8795H退出3.5.2三、调整偏移量语句形式:ORGEXP其中:EXP的取值范围0~65535。功能:告诉汇编程序,本语句下面的内存变量从该“EXP‖所指定的偏移地

址开始分配。例如,.COM文件的程序段中,程序代码必须从0100H偏移地址开始存放,所以程序的第一句需用ORG语句定义:ORG0100HMOVAX,dataMOVDS,AX退出3.5.3符号定义语句MASM中有三种等价语句:赋值等价语句,数值

等价语句及串等价语句。一、赋值等价语句形式:名字=EXP其中,EXP可以是一个整数、常数表达式,地址表达式,一个或两个字符。功能:汇编时该名字用表达式的值取代,类似与高级语言的符号数。允许重新定义。例如:l

ab=la-lbprice=30price=40退出3.5.3二、数值等价语句形式:名字EQUEXP功能:该语句与赋值等价语句功能一样,唯一的区别是:用EQU定义的名字不允许再定义。例如:labEQUla-lbpriceEQU30

priceEQU40;错误的定义退出3.5.3三、串等价语句形式:名字EQU<字符串>功能:汇编时该名字用其字符串取代。例如:bVarDB12H,56HwPtEQU<WORDPTR>LEABX,bVarINCwPt[BX]退出第六节微处理器的基本指令集(20学时)指令

系统确定了CPU所能完成的功能,是汇编语言进行程序设计的最基本部分。前面曾讲解过如下汇编语句:[标号:/变量]指令操作符[操作数1[,操作数2[,操作数3]]][;注释]操作数:操作数是指令或程序的主要处理对象。退出3.6机器中参加操作

的数据存放位置有以下三种:参加操作的数据就包含在指令中。参加操作的数据在CPU的某个寄存器中。参加操作的数据在内存中,这时指令中的操作数包含着寻找参加操作的数据所在地址的信息。寻址方式:寻址方式就是寻找参加操作的数据的偏移地址的方式。指令中如何表达操作数就是正确运用汇编指令的一个重要因素

。退出3.6.1寻址方式一、立即寻址方式这种寻址方式,就是上面所提到的第一种情况,参加操作的数据就包含在指令代码中。通常操作数写成“Im‖,表示立即寻址方式,“Im‖可以是汇编语言的常数。例如:MOV

AL,06H;功能:AL06H指令代码:B006MOVBX,100;功能:BX0064H指令代码:BB6400可以看出,指令中的源操作数部分的06H,100就包含在指令代码中,所以就是立即寻址方式,06H,100就是立即数Im。退

出3.6.1二、寄存器寻址方式这种寻址方式,就是上面所提到的第二种情况,参加操作的数据在CPU的某个寄存器中。通常操作数写成“R”,表示寄存器寻址方式。指令中可以引用的寄存器及其符号名称如下:8位寄存器:AH、

AL、BH、BL、CH、CL、DH和DL,通常写成“R8”;16位寄存器:AX、BX、CX、DX、SI、DI、SP和BP,通常写成“R16”,用“R”代表8位与16位寄存器。段寄存器:CS、SS、DS和ES,通常写成“SegR”;退出3.6.1例如:MOVAL,06H

;指令中的目标操作数AL就是寄存器寻址方式MOVDS,AX;指令中的两个操作数DS和AX都是寄存器寻址方式下面描述操作数的形式,均表示参加操作的数据都在内存中,通常操作数写成“M”,表示内存的寻址方式,那么寻找存储参加操作数据的内存单元有效地址的方法有以下几种。三、直接寻址在指令中直接给出了参加操

作数据的有效地址,这种寻址方式为直接寻址。退出3.6.1例如:MOVAX,[2000H];功能:AX(DS:2000H)指令代码:A10020MOV[2000H],AX;功能:DS:2000H(AX

)指令代码:A30020可以看出,有效地址2000H在指令代码中直接给出,所以就是直接寻址。而在汇编语言源程序中,由于汇编程序不支持数字化的直接地址,所以直接地址用内存变量来表示,所以上例可写成:退出3.6.1ORG2000HwDataDW1234HMOVAX,wDat

a;功能:AX(DS:2000H)指令代码:A10020MOVwData,AX;功能:DS:2000H(AX)指令代码:A30020退出3.6.1四、寄存器间接寻址参加操作数据的有效地址用SI、DI、BX和BP这4个寄存器之一来指定,称这种寻址方

式为寄存器间接寻址方式。在不指定段的情况下,有下列规定:若有效地址用SI、DI和BX之一来指定,则其默认的段寄存器为DS;若有效地址用BP来指定,则其默认的段寄存器为SS。例如:MOVAL,[SI]该指令是将DS段中的偏移量为SI的内存单

元内容传给AL,如图3.6所示。MOVAL,[BP]该指令是将SS段中的偏移量为BP的内存单元内容传给AL,如图3.7所示。退出3.6.1五、相对寄存器寻址方式参加操作数据的有效地址是由SI、DI、BX和BP这4个寄存器之一的内容和指令中的8位或16位偏移量之和,段寄存器的默认情

况同寄存器间接寻址。在程序中,8位或16位偏移量通常用内存变量来表示。例如:MOVAH,count[SI];该指令的功能是将DS段中的偏移量为SI+count的内存单元内容传给AH,其执行过程如图3.8所示。退出3

.6.1六、基址加变址寻址方式参加操作数据的有效地址是一个基址寄存器(BX、BP)和一个变址寄存器(SI、DI)的内容之和。在不指定段的情况下,规定:如果有效地址中含有BP,则默认的段寄存器为SS;否则,默认的段寄存器为DS。

例如:MOVAX,[BP][SI];该指令的功能是将SS段中的偏移量为(BP+SI)的内存单元内容传给AL,(BP+SI+1)的内存段元的内容传给AH,其执行过程如图3.9所示。退出3.6.1七、相对基址加变址寻址方式参加操作数据的有效地址是一个

基址寄存器(BX或BP)的值、一个变址寄存器(SI或DI)的值和指令中的8位或16位偏移量3项之和。例如:MOVBX,mask[BX][SI]该指令的功能是将DS段中的偏移量为(BX+SI+mask)的内存单元内容传给BL,(BP+SI+mask+1)的内存单元的内容传给BH,其

执行过程如图3.10所示。退出3.6.2指令系统指令系统是CPU指令的集合,CPU除了具有运算功能的指令外,还有一些实现其它功能的指令。通常,把指令按其功能分成以下几类:数据传送指令算术运算指令逻辑运算指令串指令转移指令处理器控制指令退出3.

6.2一、数据传送指令(2学时)1.MOV—传送指令形式:MOV目标操作数,源操作数功能:目标操作数(源操作数)该指令有如下9种形式:MOVR,R;通用寄存器间传送MOVR,Imm;立即数送通用寄存器MOVM,Imm;立即数送

内存单元MOVM,R;通用寄存器送内存单元MOVR,M;内存数送通用寄存器MOVSegR,R;通用寄存器送段寄存器(CS除外)退出3.6.2MOVR,SegR;段寄存器送通用寄存器MOVSegR,M;内存数送段寄存器(CS除外)MOVM,SegR;段寄存器送内存

单元使用MOV指令应注意:源操作数和目的操作数不能同时为内存数,即MOVM,M的指令形式是非法的;两操作数的类型属性要一致,例如,MOVAX,BL是非法指令;操作数不能出现二义性,即至少一个操作数的类型要明确,例如,MOV[BX],1000H是非法指

令。更要特别注意的是,立即数的是没有类型。退出3.6.22.XCHG—数据交换指令形式:XCHG目标操作数,源操作数功能:目标操作数(源操作数)源操作数(目标操作数)该指令有如下3种形式:XCHGR,R;RRXCHGR,M;R

MXCHGM,R;MR退出3.6.23.地址传送类指令微处理器有三条指令专门传送地址,它们的目标操作数均是16位的通用寄存器,源操作数都是内存数。1)LEA—传送偏移地址指令形式:LEA目标操作数,源操作数功能:目标操作数源操作数的偏移地址该指令只有如下1种形式:LEAR16,M;R16O

FFSETM假设,BUFF是内存变量名,例如:LEASI,BUFF退出3.6.2MOVSI,OFFSETBUFFMOVSI,BUFF;2)LDS—传送数据段地址指令形式:LDS目标操作数,源操作数功能:目标操作数(源操作数),DS(源操作数+2)该指令只有如下1种形式:LDSR16,M;R16

(M),DS(M+2)例如:LDSSI,[BX];SI(DS:[BX])、(DS:[BX+1]),DS(DS:[BX+2])、;(DS:[BX+3])退出3.6.23)LES—传送附加段地址指令形式:LES目标操作数,源操作数功能:目标

操作数(源操作数),ES(源操作数+2)该指令只有如下1种形式:LESR16,M;R16(M),DS(M+2)例如:LESSI,[BX];SI(DS:[BX])、(DS:[BX+1])ES(DS:[BX+2])、;(DS:[BX+3])例如,有一数据段定义如下:myda

taSEGMENTORG1000H退出3.6.2dPt1DD15780100HdPt2DD20001000HwEaDW4765HmydataENDS有如下语句:LEASI,dPt1;SI1000HLEABP,dPt2;

BP1004HLDSDI,dPt1;DI0100H,DS1578HLESBX,dPt2;BX1000H,ES2000HLDSDI,wEa;非法指令退出3.6.24.XLAT—查表转换指令形式:XLA

T功能:AL([BX+AL])该指令的操作数都是隐含的,所执行的操作是将BX为基地址,AL为位移量的字节存储单元中的数送AL。例3-2例如数字0~7对应的格雷码为:序号格雷码十六进制值000000H100101H201103H301002H411006H511107H610105

H710004H退出3.6.2要求从键盘输入一位0~7的十进制数码,把它变成格雷码再输出到显示器上。分析:因为十进制数码与格雷码之间没有函数关系,所以就必须用查表指令来实现转换,不过须在数据段首先建立格雷

码表。退出3.6.25.PUSH/POP—堆栈操作指令堆栈是以“后进先出”的规则存取信息的一种存储机构。该存储区的存取地址由一个专门的地址寄存器(SP)来管理。在信息的存与取的过程中,栈顶是不断移动的,而栈底是

固定不变的。对堆栈的操作主要有两大类:进栈和出栈。1)进栈形式:PUSH操作数16功能:系统自动完成两部操作:SPSP-2,SP操作数16该指令有如下3种形式:PUSHR16;SPSP-2,SPR16PUSHSegR;SPSP-2,SPSegRPUSHM16;SPSP-2,SP

M16退出3.6.22)出栈形式:POP操作数16功能:系统自动完成两部操作:操作数16SP,SPSP-2该指令有如下3种形式:POPR16;R16(SP),SPSP-2POPSegR;SegR(SP),SPSP-2,(CS除外)POPM16;M16(SP),SPSP-2退出3.

6.2例3-3在例3-2中显示界面不是很好,因为从键盘输入的数码和格雷码混在一起,为了有所区分,希望显示格式为:键盘输入的数码—对应的格雷码分析:为了达到所要求的显示格式,我们只需在例3-2中显示格雷码前加显“—”。但是,加显“—”的系统程序的调

用改变了AL寄存器值,为了保护AL中的值,通常做法,都是将其压入堆栈,显示“—”后,在将其从堆栈中取出传给AL。退出3.6.2现在我们来分析该程序的堆栈定义及操作。该程序中的语句.STACK200H就是对堆栈的定义,即就是在内存中划分出200H字

节作为堆栈区,其地址为SS:0000H~SS:01FFH,那么堆栈指针SP的初值为0200H,如图3.11所示。程序中的堆栈操作语句有:PUSHAX;SP01FEH,SS:01FE(AL),SS:01FF(AH),堆栈变化如图3.12所示POPAX

;AL(SS:01FE),AH(SS:01FFH),SP0200H,堆栈变化如图3.13所示退出3.6.2二、算术运算指令(4学时)算术运算类指令对标志寄存器的均有影响,必须特别注意。算术运算语句共有以下5种类型:二进制无符号数的算术运算语句二进制无符号数的算术

运算语句无符号压缩BCD码加减运算语句无符号分离BCD码算术运算语句多字节运算语句1.二进制无符号数的算术运算语句退出3.6.21)ADD—加法指令形式:ADD目标操作数,源操作数功能:目标操作数(目标操

作数)+(源操作数)该指令有如下5种形式:ADDR,R;通用寄存器之间相加ADDR,Imm;通用寄存器与立即数之间相加ADDM,Imm;内存数与立即数相加ADDM,R;通用寄存器与内存数之间相加ADDR,M;内存数与通用

寄存器之间相加例如,设(AX)=4,(BX)=200H,(DX)=6,(DI)=500H并(DS:502)=2ADDAX,BX;语句执行后(AX)=204ADDDX,2[DI];语句执行后(DX)=8退出3.6.22)SUB—减法

指令形式:SUB目标操作数,源操作数功能:目标操作数(目标操作数)(源操作数)该指令有如下5种形式:SUBR,R;通用寄存器之间相减SUBR,Imm;通用寄存器与立即数之间相减SUBM,Imm;内存数与立即数相减SUBM,R

;通用寄存器与内存数之间相减SUBR,M;内存数与通用寄存器之间相减例如,设(CX)=10,(DX)=2,(BX)=5,OFFSETSW=100,(DS:105)=3SUBCX,DX;语句执行后(CX)=8SUBCH,DL;语句执行后(CH)=-2SUBDX,SW[BX];执行语句后(D

X)=-1退出3.6.23)MUL—乘法指令形式:MUL操作数功能:当操作数为字节数据时,AX(操作数)(AL)当操作数为字数据时,DX-AX(操作数)(AX)该指令有如下2种形式:MULR;8位寄存器:AX(R)

(AL);16位寄存器:DX-AX(R)(AX)MULM;字节类型:AX(M)(AL);字类型:DX-AX(M)(AX)对于单操作数的指令,要特别注意操作数的类型要明确。例如,下面的指令都是非法指令MUL[SI]MUL2[DI]MU

L[BX][SI]退出3.6.24)DIV—除法指令形式:DIVOPRD功能:当操作数为字节数据时,AL(AX)(操作数),AH(AX)MOD(操作数)当操作数为字数据时,AX(DX-AX)/

(操作数),DX(DX-AX)MOD(操作数)该指令有如下2种形式:DIVR;8位寄存器:AL(AX)/(R),AH(AX)MOD;16位寄存器:AX(DX-AX)/(R),DX(DX-AX)MOD(R)DIVM;字节类型:AL(AX)/(

M),AH(AX)MOD(M);字类型:AX(DX-AX)/(M),DXDX-AX)MOD(M)除法有溢出问题,凡字节运算商超过255或字运算商超过65535时均为溢出,0做除数也为溢出。除法溢出时,将立即产生0号中断并转中断处理,程序停止执行。退出3.6.

25)CMP—比较指令形式:CMP目标操作数,源操作数功能:(目标操作数)(源操作数)该指令有如下5种形式:CMPR,R;通用寄存器之间比较CMPR,Imm;通用寄存器与立即数之间比较CMPM,Imm;内存数与立即数相减CMPM,R;通用寄存器与内存

数之间比较CMPR,M;内存数与通用寄存器之间比较从以上可以看出,比较指令与减法指令不同的是所产生的两数之差并不取代目标操作数,指令执行后的结果仅仅体现在改变了标志寄存器的内容,为后面的具有判别功能的指令提供条件。退出3.6.26)INC—加1指

令形式:INC操作数功能:操作数(操作数)1该指令有如下2种形式:INCR;R(R)1INCM;M(M)17)DEC——减1指令形式:DEC操作数功能:操作数(操作数)1该指令有如下2种形式:DECR

;R(R)1DECM;M(M)1退出3.6.28)NEG—求负指令形式:NEG操作数功能:操作数0(操作数)该指令有如下2种形式:NEGR;R0(R)NEGM;M0(M)例如,8位[-3]补码=11111101B=0FDH,执行如下

指令:MOVAL,-3;AL0FDHNEGAL;AL00FDH=03H,03H就是-3的负数MOVAL,3;AL03HNEGAL;AL003H=0FDH,0FDH就是3的负数退出3.6.22.二进制无符号数的算术运算语句1)ADD—加法指令与SUB—减法指令对于二

进制符号数的加减法运算,由于系统采用补码表示法,故与无符号数的加减法指令是一样的。2)IMUL—符号数乘法指令形式:IMUL操作数功能:当操作数为字节数据时,AX(操作数)(AL)当操作数为字数据时,DX-AX(操作数)(AX)该指令有如下2种形式:IMULR;8位寄存器:AX(R

)(AL);16位寄存器:;DX-AX(R)(AX)IMULM;字节类型:AX(M)(AL);字类型:DX-AX(M)(AX)退出3.6.2例如,有如下语句:wNumDW8004H;(wNum)=8004HMOVAX,5;AX5MULw

Num;DX0002H,AX8014HIMULwNum;DX0FFFDH,AX8064H退出3.6.23)IDIV—符号数除法指令形式:IDIVOPRD功能:当操作数为字节数据时,AL(AX)(操作数),AH(AX)MODOPRD当操作数为字数

据时,AX(DX-AX)/(操作数),DX(DX-AX)MODOPRD该指令有如下2种形式:IDIVR;8位寄存器:AL(AX)/(R),AH(AX)MOD(R);16位寄存器:AX(DX-AX)/(R),DX(DX-AX)MODOPRD,IDIVM;字节类型:AL(AX)/(M),

AH(AX)MOD(M);字类型:AX(DX-AX)/(M),DX(DX-AX)MOD(M)退出3.6.2如果被除数不是除数的两倍长度,则要把被除数低一半的符号位填充到高一半中,变成除数的双倍长度。其相应的支持指令

为:形式:CBW功能:将AL中的符号扩展到AH中,即将一个字节的带符号数扩展成一个字。形式:CWD功能:将AX中的符号扩展到DX中,即将一个字的带符号数扩展成双字。退出3.6.2例如,有如下语句:SWDB-9DATADB2MOVAL,SWCBWIDIVDATA

;(AL)=-4退出3.6.23.无符号组合式BCD加减法运算指令1)DAA—加法调整指令形式:DAA功能:如果AL寄存器中低4位大于9或辅助进位(AF)=1,则(AL)=(AL)+6并且(AF=1);如果(AL)0

A0H或(CF)=1,则(AL)=(AL)+60H并且(CF)=1。2)DAS—减法调整指令形式:DAS功能:如果AL寄存器中低4位大于9或辅助借位(AF)=1,则(AL)=(AL)-6并且(AF)=1;如果(AL)0A0H或(CF)=1,则(AL)=(AL)-60H并且(CF)=1。

退出3.6.2进行组合式BCD加法或加法运算实现用ADD语句或SUB语句,使运算结果在AL中,然后再用DAA或DAS调整语句即可得组合式BCD加减法的正确结果。例如,有如下语句:MOVAL,43H;(AL)=43HM

OVBL,29H;(BL)=29HADDAL,BL;(AL)=6CHDAA;(AL)=72HMOVAL,43H;(AL)=43HMOVBL,29H;(BL)=29HSUBAL,BL;(AL)=1AHDAS;(AL)=14H退出

3.6.24.无符号分离式BCD运算指令无符号分离式BCD可进行四则运算,因而相应有四种调整指令,它们都是对字节运算进行调整。1)AAA—ASCII加法调整指令形式:AAA功能:如果AL的低4位大于9或(AF)=1

则:(AL)=(AL)+6(AH)=(AH)+1(AF)=(CF)=1AL高4位清零;否则:(AF)=(CF)=0AL高4位清零;退出3.6.2例如,有如下语句:MOVAH,0MOVAL,7;(AL)=37HMOVBL,4;(BL)=34HADDAL,BL;(AL)=6BHAAA;(AX)

=0101H退出3.6.22)AAS—ASCII减法调整指令形式:AAS功能:如果AL的低4位大于9或(AF)=1则:(AL)=(AL)-6(AH)=(AH)-1(AF)=(CF)=1AL高4位清零;否则:(AF)=(CF)=0AL高4位清零;退出3.6.23)AAM—ASCII乘法调

整指令形式:AAM功能:被调整的乘积在AX中,其调整规则如下:AH(AL)/10,AL(AL)%10例如,有如下语句:MOVAL,9;(AL)=39HMOVBL,8;(BL)=38HSUBAL,30H;(AL)=09HSUBBL,30H;(BL)=08HMULBL;(AX)=

0048HAAM;(AX)=0702H退出3.6.24)AAD—ASCII码除法调整指令形式:AAD功能:除法运算前,先调整AX内容,使:(AL)=(AL)+(AH)10(AH)=0即把非压缩十进制数变成二进制数。例3-4编写程序实现输入任意两个0~9之间的数字,并分别进行加法与乘法运算后

在屏幕上。分析:由于输入与输出的数据均为ASCII码,故用分离式BCD码较为方便。又由于程序很简单,故采用寄存器CX存放数据,不用数据段。退出3.6.25.多字节数运算指令1)ADC—带进位加法指令形式:ADD

C目标操作数,源操作数功能:目标操作数(目标操作数)+(源操作数)+CF该指令有如下5种形式:ADDCR,R;通用寄存器之间相加,再加进位位ADDCR,Imm;通用寄存器与立即数之间相加,再加进位位ADDCM,Imm;内存数与立即数相加,再加进位位

ADDCM,R;通用寄存器与内存数之间相加,再加进位位ADDCR,M;内存数与通用寄存器之间相加,再加进位位退出3.6.2例如,求3B07B2H+65C2H的程序片断如下:bNum1DB0B2H,07,3BHbNum2DB0C2H,65HMOVAL,bNum1ADDAL,bNum2

MOVAH,bNum1+1ADCAH,bNum2+1MOVDL,bNum1+2ADCDL,0请问最后一条指令,为什么加0?退出3.6.22)SBB—带借位减法指令形式:SBB目标操作数,源操作数功能:目标操作数(目标操

作数)(源操作数)CF该指令有如下5种形式:SBBR,R;通用寄存器之间相减,再减借位位SBBR,Imm;通用寄存器与立即数之间相减,再减借位位SBBM,Imm;内存数与立即数相减,再减借位位SBBM,R;通用寄存器与内存数之间相减,再减借位位SBBR,M;内存数与通用寄存器之间相减,

再减借位位实现多字节减法和实现多字节加法方法一样,那么实现多字节乘法及除法的思想我们通过下面的程序来介绍。退出3.6.2例如,求3B07B2HC2H的程序片断如下:bMul1DB0B2H,07,3BHbMul2DB0C2HbResultDB4DUP(0)MOVAL,bMul1

MULbMul2MOVbResult,ALMOVbResult+1,AHMOVAL,bMul1+1MULbMul2ADDbResult+1,ALADCbResult+2,AH退出3.6.2MOVAL,bMul1+2MULbMul2ADDbResult+2,ALADCbResul

t+3,AH例如,求3B07B2HC2H的程序片断如下:bDiv1DB0B2H,07,3BHbDiv2DB0C2HbResultDB4DUP(0)MOVAH,0MOVAL,bDiv1+2DIVbDiv2MOVbResult,AL退出3.6.2MOVAL,bDi

v1+1DIVbDiv2MOVbResult+1,ALMOVAL,bDiv1DIVbDiv2MOVbResult+2,ALMOVbResult+3,AH退出3.6.2三、逻辑运算指令(1)因为逻辑运算类指令是

在ALU中完成的,所以除NOT指令外,均对PF,SF及ZF有影响,CF=OF=0,AF不确定。1.逻辑运算类指令1)NOT—求反指令形式:NOT操作数功能:操作数操作数的每一位取反该指令有如下2种形式:NOTR;R把R寄存的每个二进

制位取反NOTM;M把M寄存的每个二进制位取反例如,设(AL)=46H,有如下语句:NOTAL;语句执行后(AL)=0B9H退出3.6.22)AND—逻辑与指令形式:AND目标操作数,源操作数功能:目

标操作数(目标操作数)按位逻辑与(源操作数)变异功能:任何位与0相与,其相应位为0;任何位与1相与,其相应位维持不变该指令有如下5种形式:ANDR,R;通用寄存器之间按位相与ANDR,Imm;通用寄存器与立即数之间按位相与ANDM,Imm;内存数与立即数按位相与

ANDM,R;通用寄存器与内存数之间按位相与ANDR,M;内存数与通用寄存器之间按位相与退出3.6.2例如,设(AL)=76H,要求把其第0、1和5位清为0,其指令为:ANDAL,11011100B;其计算过程如下所示:01110110

AND1101110001010100退出3.6.23)OR—逻辑或指令形式:OR目标操作数,源操作数功能:目标操作数(目标操作数)按位逻辑或(源操作数)变异功能:任何位与1相或,其相应位置1;任何位与0

相或,其相应位维持不变。该指令有如下5种形式:ORR,R;通用寄存器之间按位相或ORR,Imm;通用寄存器与立即数之间按位相或ORM,Imm;内存数与立即数按位相或ORM,R;通用寄存器与内存数之间按位相或ORR,M;内存数与通用寄存器之间按位相或退出3.6.2例如,设(BL)=

46H,要求把其1、3、4、和6位置为1,其指令为:ORBL,01011010B;其计算过程如下所示:01000110OR0101101001011110退出3.6.24)XOR—逻辑异或指令形式:XOR目标操作数,源操作数功能:目标操作数(目标操作数)按位逻辑

异或(源操作数)变异功能:任何位与1相异或,其相应位取反;任何位与0相异或,其相应位维持不变。该指令有如下5种形式:XORR,R;通用寄存器之间按位相或XORR,Imm;通用寄存器与立即数之间按位相或XORM,Imm;内存数与立即数按位相或X

ORM,R;通用寄存器与内存数之间按位相或XORR,M;内存数与通用寄存器之间按位相或退出3.6.2例如,设(BL)=46H,要求把其1、3、4、和6位取反,其指令为:XORBL,01011010B;其计算过程如下所示:01000110XOR010110100001

1100退出3.6.25)TEST—测试指令形式:TEST目标操作数,源操作数功能:(目标操作数)按位逻辑与(源操作数),结果影响标志位该指令有如下5种形式:TESTR,R;通用寄存器之间按位相与TESTR,Imm;通用寄存器与立即数之间按位相与TESTM,Imm;内存数与立即数按位相与

TESTM,R;通用寄存器与内存数之间按位相与TESTR,M;内存数与通用寄存器之间按位相与例如,设(AL)=76H,要求测试AL的第0、1和5位是否都为0,其指令为:TESTAL,00100011语句执行后AL仍为76H。同时,可测试ZF位,若ZF=1,表示3位都为0;若ZF=0,表示3位不

全为0。退出3.6.2四、移位类指令(1)移位类指令分为以下几种,如图3.14所示:1.左右移指令1)逻辑移位指令(1)SHL—逻辑左移指令形式1:SHL操作数,1功能:操作数操作数的内容连同CF的内容一起左移1位,尾部空位补“0

”,CF中的原有的内容丢弃。如图3.15所示变异功能:操作数左移1位,具有乘2的功能。退出3.6.2该指令有如下2种形式:SHLR,1;把通用寄存器的内容左移1位SHLM,1;把内存数的内容左移1位形式2:SH

L操作数,CL功能:操作数操作数的内容连同CF的内容一起左移的次数,为CL寄存的数。变异功能:操作数左移N位,具有乘2N的功能。(2)SHR—逻辑右移指令形式1:SHR操作数,1形式2:SHR操作数,CL退出3.6.2功能:操作数操作数的内容连同CF的内容一起右移1位或(CL)位。高位移空的位

补“0”。如图3.16所示:变异功能:操作数右移N位,具有无符号数除以2N的功能。该指令有如下2种形式:SHRR,1/CL;把通用寄存器的内容右移1位或(CL)位SHRM,1/CL;把内存数的内容左移1位或(CL)

位2)算术移位指令(1)SAL—算术左移指令形式1:SAL操作数,1形式2:SAL操作数,CL功能:完全与逻辑左移指令一样。退出3.6.2(2)SAR—算术右移指令形式1:SHR操作数,1形式2:SHR操作数,CL功能:操作数操作数的内容连同CF的内容一起右移1位或(CL)位。高位移空的位

补“符号位”。如图3.17所示:变异功能:操作数右移N位,具有带符号数除以2N的功能。该指令有如下2种形式:SARR,1/CL;把通用寄存器的内容右移1位或(CL)位SARM,1/CL;把内存数的内容右移1位或(CL)位退出3.6.2例3-5编程序实

现一个字节无符号数乘64。分析:实现此功能的算法有很多,但是最巧妙的方法是通过该字节数2564来实现。例3-6编写一程序实现将字变量W中的无符号数除以8,商和余数分别放入字变量wQuot和字节变量bRema将字变量。分析:我们可以通过取字变量低

3位来得到余数,将字变量右移3位,实现除以8,得到商的结果。退出3.6.22.循环移位类指令1)小循环移位指令(1)ROL—不带进位循环左移形式1:ROL操作数,1功能:把操作数的内容首尾连接起来循环左移1位。CF的内容为操作数最高位的原值,CF原值丢失。如图3.18所示:

形式2:ROL操作数,CL功能:把操作数的内容首位连接起来进行循环左移,移位的次数为CL寄存的值。该指令有如下2种形式:ROLR,1/CL;把通用寄存器的内容循环左移1位或(CL)位ROLM,1/CL;把内存数的内容循环左移1位

或(CL)位退出3.6.2(2)ROR—不带进位的循环右移形式1:ROR操作数,1形式2:ROR操作数,CL功能:把操作数的内容首尾连接起来循环右移1位或(CL)位。如图3.19所示。该指令有如下2种形式:RORR,1/CL;把通用寄存

器的内容循环右移1位或(CL)位RORM,1/CL;把内存数的内容循环右移1位或(CL)位退出3.6.22)大循环移位指令(1)RCL—带进位的循环左移形式1:RCL操作数,1功能:把操作数的内容与CF位一

起循环左移1位。如图3.20所示:形式2:RCL操作数,CL功能:把操作数的内容与CF位一起进行循环左移,移位的次数为CL寄存的值。该指令有如下2种形式:RCLR,1/CL;把通用寄存器的内容循环左移1位或(CL)位RC

LM,1/CL;把内存数的内容与CF位一起循环左移1位或(CL)位退出3.6.2(2)RCR—带进位的循环右移形式1:RCR操作数,1形式2:RCR操作数,CL功能:把操作数的内容与CF位一起循环右移1位或(CL)位。如图3.21所示:该指令有如下2种形

式:RCRR,1/CL;把通用寄存器的内容与CF位一起循环右移1位或(CL)位RCRM,1/CL;把内存单元的内容与CF位一起循环右移1位或(CL)位退出3.6.2例3-7字变量wNum中有一无符号数,编写计算(wNum)1630,并将

结果送入wNum和wNum2种的程序。分析:我们知道(wNum)16的结果不会超过32位,所以应用两个字来存放结果,而实际上,结果的高位字就是wNum中的高4位,结果的低位字就是把wNum左移4位,然后再加30,即为最终结果。退出3.6.2五、标志位操作指令及处理

器指令1.标志位操作指令标志位操作指令是一组对标志位置位、复位、保存和恢复等操作的指令。1)进位CF操作指令形式1:CLC功能:CF0形式2:STC功能:CF1形式3:CMC功能:CFCF退出3.6.22)方向位DF操作指令形式1:CLD功能:DF0形式2:STD功能:D

F13)中断允许位IF操作指令形式1:CLI功能:IF0形式2:STI功能:IF1退出3.6.24)存、取标志位操作指令形式1:LAHF功能:AHRFlag的低8位形式2:SAHF功能:RFlag的低8位AH5)标志寄存器的保

护操作形式1:PUSHF功能:将RFlag入栈形式1:POPF功能:将RFlag出栈退出3.6.22.处理器指令处理器指令是一组控制CPU工作方式的指令。这组指令的使用频率不高。1)NOP—空操作指令形式:NOP功能:CPU执行该指令是不完成任何具体功能

,只占用3个时钟周期。2)WAIT—等待指令形式:WAIT功能:CPU执行该指令时,测试CPU的引线。当线为高电平,CPU进入等待状态,且每隔3个时钟对的状态进行一次测试,直到引线出现低电平时,CPU退出等待,顺序执行下一条指令。退出3.6.23)

HLT—暂停指令该指令使CPU进入暂停状态。只有当下面三种情况之一发生时,CPU才退出暂停状态。这三种情况是:CPU的复位输入端RESET有效;非屏蔽中断产生请求;可屏蔽中断产生请求,且标志寄存器的IF=1。4)LOCK——封锁总线前缀指令它是一条前缀指令,可放在任何指令的前面,使得相应指令的执行

时,总线被锁定,使别的主设备不能使用总线。退出3.6.2六、串指令(2)字符串操作指令的实质是对一片连续存储单元进行处理,这片存储单元是由DS:SI或ES:DI来指定的。字符串操作指令可对内存单元按字节

、字进行处理,并能根据操作对象的规定使SI(或DI)增减。具体规定如下:当DF=0时,变址寄存器SI(或DI)增加1或2;当DF=1时,变址寄存器SI(或DI)减少1或2;在使用串指令前,须先进行以下设置:使用串操作语句必须事先设置隐含的寄存器。设置方向标志位D

F。如果使用重复前缀,还必须把重复次数置CX中。退出3.6.21.串指令的形式及功能1)LODS——取字符串数据指令形式:LODS地址表达式功能:AL/AX(DS:SI),调整SI该指令还有如下2种形式:LODSB;AL(DS:SI)

,SISI1LODSW;AX(DS:SI),SISI22)STOS——置字符串数据指令形式:STOS地址表达式功能:(ES:DI)AL/AX,调整SI该指令还有如下2种形式:STOSB;(ES:DI)

AL,DIDI1STOSW;(ES:DI)AX,DIDI2退出3.6.23)MOVS——传送字符串指令形式:MOVS地址表达式功能:(ES:DI)(DS:SI),调整SI、DI该指令还有如下2种形式:MOVSB;(ES:DI)(DS:SI),SISI1,DIDI1MOVSW

;(ES:DI)(DS:SI),SISI2,DIDI24)CMPS——比较字符串指令形式:CMPS地址表达式功能:(ES:DI)(DS:SI),结果影响标志位,调整SI、DI该指令还有如下2种形式:退出3.6.2CMPSB;(ES:DI)(DS:SI)

,结果影响标志位,;SISI1,DIDI1CMPSW;(ES:DI)(DS:SI),结果影响标志位,;SISI2,DIDI25)SCAS——扫描字符串指令形式:SCAS地址表达功能:(ES:DI)AL/AX,结果影响标志位,调整DI该指令还有如下2种形式:SCA

SB;(ES:DI)AL,结果影响标志位,DIDI1SCASW;(ES:DI)AX,结果影响标志位,DIDI2例3-8编写一段程序,计算数字字符串123456789中的数值之和。退出3.6.22.重复前缀重

复前缀只能用在串操作指令的前面,重复次数应事先设置在CX中。有3种形式的重复前缀:1)REP—重复前缀形式:REP传送字符串指令或置字符串指令功能:步骤1,如果(CX)=0,则退出循环,执行下面的语句。步骤2,如果(CX

)0,则执行所写串操作指令一次且CX=(CX)-1,转步骤1。例如:REPMOVSBREPMOVSWREPSTOSBREPSTOSW退出3.6.22)REPE/REPZ—相等重复前缀形式:REPE/RE

PZ扫描字符串指令或比较字符串指令功能:步骤1,如果(CX)=0或(ZF)=1,则退出循环。步骤2,如果(CX)0且(ZF)=0,则执行所写串操作指令一次且CX=(CX)-1,转步骤1。例如:REPE/R

EPZSCASBREPE/REPZSCASWREPE/REPZCMPSBREPE/REPZCMPSW退出3.6.23)REPNE/REPNZ—不相等重复前缀形式:REPNE/REPNZ扫描字符串指令或比较字符串指令功能:步骤1,如果(CX)=0或(ZF)=0,则退出循环。步骤

2,如果(CX)0且(ZF)=1,则执行所写串操作指令一次且CX=(CX)-1,转步骤1。例如:REPNE/REPNZSCASBREPNE/REPNZSCASWREPNE/REPNZCMPSBREPNE/REPNZCMPSW例3-9将显示器缓冲区的内容传送到dBuf变量中,长度为2000字

,然后将显示器缓冲区写入空格,完成清屏功能。分析:我们知道,显示器缓冲区的首地址为0B800:0000H,我们可通过传送字符串指令,完成传送,通过置字符串指令完成清屏功能。退出3.6.2七、程序控制类指令(8)程序控制类就是指改变了程序执行顺序的指令,也就是通过改变IP或CS

、IP的值,以达到控制程序执行顺序的目的。控制类转移指令包括五类指令,即:无条件转移条件转移指令循环控制指令子程序调用与返回指令中断指令退出3.6.21.无条件转移和条件转移指令形式:JMPOPRD功能:若OPRD为16位数,则IPOPRD,实现段内转

移;若OPRD为32位数,则IPOPRD低16,CSOPRD高16,实现段间转移。该指令有如下3种形式:JMP标号;若标号为近标号,则IPOFFSET标号,实现段内的转移;若为远标号,则IPOFFSET标号,CSSEG标号,实现段间的转移JMPR1

6;IP(R16),实现段内的转移JMPM;若M为字单元,则IP(M),实现段内转移;若M为双字单元,则IP(M低16),CS(M高16),实现段间转移退出3.6.22.条件转移指令条件转移语句实现段内的短转移,即转移语句

与转向语句之间最大距离为+127或-128字节。条件转移指令是一组极其重要的转移指令,它根据标志寄存器中的一个或多个标志位来决定是否需要转移。条件转移指令分为三大类:基于无符号数的条件转移指令基于有符号数的条件转移指令基于算术标志位的的条件转移指令。1)无符号数

关系的判断的条件转移(1)JA/JNAE—大于转移指令形式:JA/JNAE标号功能:若大于(CFORZF=0)转移到标号处执行,否则顺序执行。退出3.6.2(2)JAE/JNA—大于等于转移指令形式:JAE/JNB标号功能:若大于等于(CF=0)

转移到标号处执行,否则顺序执行。(3)JB/JNAE—小于转移指令形式:JB/JNAE标号功能:若小于(CF=1)转移到标号处执行,否则顺序执行。(4)JBE/JNA—小于等于转移指令形式:JBE/JNA标号功能:若小

于(CFORZF=1)转移到标号处执行,否则顺序执行。(5)JE/JZ—等于转移指令形式:JE/JZ标号功能:若等于(ZF=1)转移到标号处执行,否则顺序执行。退出3.6.2(6)JNE/JNZ—不等于转移指令形式:JNE/JNZ标号功能:若不等于(ZF=0)转移到标号处执行,否则

顺序执行。2)符号数关系的判断的条件转移(1)JG/JNLE—大于转移指令形式:JG/JNLE标号功能:若大于((SFXOROF)ORZF=0)转移到标号处执行,否则顺序执行。(2)JGE/JNL—大

于等于转移指令形式:JGE/JNL标号功能:若大于等于((SFXOROF)=0)转移到标号处执行,否则顺序执行。退出3.6.2(3)JL—小于转移指令形式:JL/JNGE标号功能:若小于((SFXOROF

)=1)转移到标号处执行,否则顺序执行。(4)JLE—小于等于转移指令形式:JLE/JNG标号功能:若小于等于((SFXOROF)=1ORZF=1)转移到标号处执行,否则顺序执行。带符号数的等于及不等于转移指令与无符号数的等于及不等于转移指令一样。3)标志位的判断的条件转移(1)

JC—有进位转移指令形式:JC标号功能:有进位(CF=1)转移到标号处执行,否则顺序执行。退出3.6.2(2)JNC—无进位转移指令形式:JNC标号功能:无进位(CF=0)转移到标号处执行,否则顺序执行。(3)JO—溢出转移指令形式:JO标号功能:溢出(OF=1)转移到标号处执

行,否则顺序执行。(4)JNO—无溢出转移指令形式:JNO标号功能:溢出(OF=0)转移到标号处执行,否则顺序执行。(5)JP/JPE—偶性转移指令形式:JP/JPE标号功能:若结果的低8位有偶数个“1”(PF=1)转移到标号处执行,否则顺序执行。退出3

.6.2(6)JNP/JPO—奇性转移指令形式:JNP/JPO标号功能:若结果的低8位有奇数个“1”(PF=0)转移到标号处执行,否则顺序执行。(7)JS—负符号转移指令形式:JS标号功能:若结果为负(SF=1)转移到标号

处执行,否则顺序执行。(8)JNS—正符号转移指令形式:JNS标号功能:若结果为正(SF=0)转移到标号处执行,否则顺序执行。(9)JCXZ—计数零转移指令形式:JCXZ标号功能:若CX=0转移到标号处执行,否则顺序执行。退出3.6.2例3-

10判断从键盘输入的ASCII码是字母还是数字,若是字母显示“C‖,若是数字显示“D‖。假设输入的字符只可能是字母或数字。分析:通过查看ASCII码表可以看出,若是字母,则其ASCII码的D6位为“1‖,若为数字,则其ASCII码的D6位为“0‖。例3-11某工厂的产品共有8种加工处理程序P0~P

7,而某产品应根据不同情况,作不同处理,其选择由键入的值0~7来决定。若键入0~7以外的健,则退出该产品的加工处理程序。作为举例,假设每个处理程序的功能就是显示一个字母,P0显示“A”,P1显示“B”,P2显示“C”,。退出3.6.2

分析:我们可以用跳转表法实现分支,具体做法是,在数据区开辟一片连续存储单元作为跳转表,表中顺序存放各分支处理程序的跳转地址。跳转地址在跳转表中的位置,即它们在表中的偏移始地址等于跳转标的首地址加上它们各自的序号与所占字节数的乘积。为了改

善汇编语言源程序的结构,减少显式转移语句所带来混乱,在宏汇编MASM6.11系统中,增加了表达分支结构的伪指令。退出3.6.23.循环控制指令1)LOOP—计数循环语句形式:LOOP短标号功能:CX=(CX)-1;若(CX)0,则(IP

)=OFFSET段标号,否则继续执行下一句。2)LOOPNZ/LOOPNE—非零计数循环形式:LOOPNZ/NE短标号功能:CX=(CX)-1;若(CX)0且ZF=0,则(IP)=OFFSET标号,否则

继续执行下一个语句。3)LOOPZ/LOOPE—零计数循环形式:LOOPZ/E短标号退出3.6.2功能:CX=(CX)-1若(CX)0且ZF=1,则(IP)=OFFSET标号,否则继续执行下一个语句。例3-13求出前20个斐波那契数,斐波那契数的定义为:F0=0F1=1F(N+2)

=F(N)+(N+1)分析:我们用循环来完成求出前20个斐波那契数,每次循环需求出2个斐波那契数,那么后18个斐波那契数需循环9次。同样,在宏汇编MASM6.11系统中,还增加了表达循环结构的伪指令。退出3.6.24.子程序调用与返回指令定义子程序的一般格式如下:子程序名PR

OC[NEAR/FAR];子程序体子程序名ENDP对子程序定义的具体规定如下:“子程序名”必须是一个合法的标识符,并且二者要前后一致;PROC和ENDP必须是成对出现的关键字,它们分别表示子程序定义开始和结束;子程序的类型有NEAR、FAR

之分,其缺省的类型是近调用NEAR型;退出3.6.2子程序名有3个属性:段值、偏移量和类型。其段值和偏移量对应于子程序的入口地址,其类型就是该子程序的类型。在编写子程序时,除了要考虑实现子程序程序功能的方法,还要养成编制相应的说明文件的好习惯。其说明信息一般包括以下几个方面内容

:功能描述;入口参数和出口参数;所用寄存器;所采用的算法;退出3.6.21)CALL—调用指令形式:CALL操作数功能:若OPRD为16位数,保留返回地址IP于栈中:SP(SP)-2,(SS:SP)(IP);实现段内转移:IPOPRD。若OPRD为32位数,保

留返回地址CS:IP于栈中:SP(SP)-2,(SS:SP)(CS),SP(SP)-2,(SS:SP)(IP);实现段间转移:IPOPRD低16,CSOPRD高16。该指令有如下3种形式:CALL标号;若标号为近标号,;则

SP(SP)-2,(SS:SP)(IP),IPOFFSET标号退出3.6.2;若为远标号,;则SP(SP)-2,(SS:SP)(CS),SP(SP)-2,;(SS:SP)(IP),IPOF

FSET标号CSSEG标号JMPR16;SP(SP)-2,(SS:SP)(IP),IP(R16)JMPM;若M为字单元,SP(SP)-2,(SS:SP)(IP),IP(M);若M为双字单元,;SP(SP)-2,(SS:SP)(CS),S

P(SP)-2,;(SS:SP)(IP),则IP(M低16),CS(M高16)退出3.6.22)RET—返回指令形式:RET[Imm]功能:从栈取返回地址于指令指针中。若为近过程返回指令,则IP(SS:SP),S

P(SP)+2或SP(SP)+2+Imm;若为远过程返回指令,则IP(SS:SP),SP(SP)+2,CS(SS:SP),SP(SP)用户可以利用以上指令来设计包含子程序的程序,但还解决以下3个问题:第一,主程序与子程序间的参数传递。其基本方法有寄存器法、堆栈法和约定内

存单元法。第二,主程序和子程序公用寄存器问题。第三,子程序所处位置。退出3.6.2例3-16编写程序,按5位十进制的形式显示寄存器BX中的内容,如果BX的值小于0,则应在显示数值之前显示“-”。假设该子程序与调用程序在同一段,要求用子程序完成BX数值的十进制显示。分析:从题目

要求中可以看出,该子程序的入口参数是通过寄存器传递,无出口参数,该子程序应定义为NEAR型。我们可先判断BX的值的正负,若为负,则显示“-”,求其绝对值,采用除10取余数的方法,从低位向高位求出每位十进制数。退出

3.6.2例3-17编写程序,分类统计出一个字符串中数字字符、字母和其它字符的个数。要求用子程序完成分类统计,假设调用程序与子程序不在同一段。分析:从题目要求可以看出,子程序要完成分类统计,应把字符串作为入口参数,因为字符串可能很长,所以,须用内存单元作为入口参数的传递,这时用DS:

DX来指定字符串的首地址。这是子程序应定义为FAR型。退出3.6.2递归调用的实现过程,这在高级语言的学习中都是一个很难理解过程,我们用汇编语言编程实现,通过单步执行,我们能够很清晰看到CPU递归调用的实现过程及原理。例3-18编写子程序实现求n!。分析:按照阶乘的定义:1n=0n!=n(

n-1)!n≥1这是一个递归定义,可采用子程序实现阶乘的计算。退出3.6.24.中断指令1)INT—软件中断指令形式:INTImm8功能:把标志寄存器压栈,SP(SP)-2,(SS:SP)FR,清除标志位

IF和TF;把CS压栈,SP(SP)-2,(SS:SP)CS,CS(0000:Imm84+2);把IP压栈,SP(SP)-2,(SS:SP)IP,IP(0000:Imm84),2)IRET—中断返回指令形式:IRET功能:IP(SS:SP),SP(SP)+2,CS(

SS:SP),SP(SP)+2,FR(SS:SP),SP(SP)+2退出3.6.2这里,Imm8称为8位的中断号。中断和子程序的调用在实现方面的主要差异是什么?子程序的调用直接通过CALL指令来实现,但中断的调用只用INT是不够的,须事先把中断服务程序的

逻辑地址存入0000:Imm84起始的4个内存单元,才能保证程序的正确调用。子程序的返回指令是RET,而中断服务程序的返回指令是IRET。在通常情况下,子程序是由应用程序的开发者编写的,而中断服务程序是由系统软件设计者编写的。如主板上的ROMBIOS内的程序及DOS系统中的功能程

序,这些程序都是系统人员设计的程序,用户调用时,都是通过INT指令来实现,具体的方法我们在4.2中介绍。子程序是在执行时,才调入内存,而中断服务程序是常驻内存的。退出3.6.2例如,前面出现的显示字符串程序,DOS系统提供有这样的

程序,用户可直接调用,其参数要求如下:功能号:AH09H入口参数:DS:DX指向需显示的字符串,该字符串需用$为结束标志。出口参数:无中断指令:INT21H退出第七节COM文件的编程COM文件和EXE文

件都是可执行文件,COM文件的主要特点如下:COM文件只有一个段,其字节数不会超过64K;当操作系统装入COM文件时,四个段寄存器(CS、DS、ES和SS)都用PSP的段值来初始化;必须用伪指令ORG100H来说明空出前256个字节。退出第七节例3-19编写一个显示字符串

“Hello,com‖的COM类型的程序。分析:本程序的实现算法很简单,只是注意按COM类型文件要求编程即可。在PWB编程环境下,设置菜单Option→ProjectTemplates→SetProjectTemplate→在列表框中选DOSCOM,然后汇编、连接即可指定生成CO

M文件。退出第八节宏宏:是把一段程序代码用一个特定标识符(即:宏指令名)来表示。退出3.8.1宏的定义及调用一、宏定义定义宏指令的一般格式如下:宏指令名MACRO[形参1,形参2,];宏体ENDM对宏指令定义的具体规定如下:MACRO和END

M是二个必须成对出现的关键字,它们分别表示宏定义的开始和结束;MACRO和ENDM之间的部分是宏的定义体,它是由指令、伪指令或引用其它宏所组成的程序片段,是宏所包含的具体内容;退出3.8.1―宏指令名”是为所定义的宏指令起的名称,由程序员指定的一个合法的标识符,它供宏调用时

使用;宏指令名可以与指令助忆符、伪指令名相同。在这种情况下,宏指令优先,而同名的指令或伪指令都失效;在ENDM的前面不要再写一次宏名,这与段或子程序定义的结束方式有所不同;在宏定义的首部可以列举若干个形式参数,每个参数之间要用逗号分隔。退出3.8.1例如,定义一条宏指令,实现两

个字变量相加。wAddMACROwVar1,wVar2MOVAX,wVar2ADDwVar1,AXENDM上述宏定义虽然能满足题目的要求,但由于在定义体中改变了寄存器AX的值,这就使宏的调用破坏了AX的值。为了

保护寄存器的现场,也像子程序设计那样,在宏体的开始对所用寄存器保护,在宏结束恢复寄存器的值,可把该宏定义改成如下形式:退出3.8.1wAddMACROwVar1,wVar2PUSHAXMOVAX,wVar2ADDwVar1,AXPOPAXENDM宏定义

中的参数也可出现在操作助记符中。例如,若希望定义的宏指令可以实现左移,也可以实现右移,具体使用时由实际参数来指定其移位方向,于是我们可以有下面宏定义:退出3.8.1ShiftMACROn,Reg,cDirPUSHCXMOVCL,nSH&cDirReg,CLPOPC

XENDM形式参数出现在助记符中时,若不在助记符的开头,那么,形参前面必须加字符&。必须指出的是,在调用时所提供的实际参数应使宏体中的对应指令成为一条合法的指令,这样例中所用的形参对应的实参只能是R或L。退出3.8.1二、宏调用及宏展开1.宏调用

形式:宏指令名[实参1,实参2,]其中:实参的位置要与形参的位置要对应,但实参的个数可以与形参的个数不相等;当实参的个数多于形参的个数时,多出的实参被忽略;当实参的个数少于形参的个数时,没有实参对应的形参用“空”来对应。但在宏展开时,所得到的指令必须是合法的汇编指令,否则,汇编程

序将会给出出错信息。在调用宏时,参数是通过“实参”替换“形参”的方式来实现传递的。参数的形式灵活多样,参数可以是常数、寄存器、存储单元和表达式,还可以是指令的操作码。退出3.8.1例如有了上面的宏定义wAdd和Shift后,程序中就可以有下面的宏调用:wADW1234HwB

DW5678HwAddwA,wBShiift4,AX,R2.宏展开宏展开是指在汇编过程中,当汇编遇到宏调用语句时,它将用宏体中的一段程序来代替这条宏调用语句,并且语句中的形式参数被实际参数取代。退出3.8.1例如上面程序片段汇编后的宏展

开形式:wADW1234HwADW1234HwBDW5678HwBDW5678HPUSHAXwAddwA,wBMOVAX,wBADDwA,AXPOPAXPUSHCXShiift4,AX,RA,wBMOVCL,n

SHRAX,CLPOPCX退出3.8.1三、宏定义中的标号与变量局部标号或变量由LOCAL伪指令定义。形式:LOCAL标号1,标号2,伪指令LOCAL必须是伪指令MACRO后的第一条语句,并且在MACRO和LOCAL之间也不允许有注释和分号标志。例如,定义一个求绝对值的宏:A

bsMACRONumLOCALnextCMPNum,0JGEnextNEGNumnext:ENDM退出3.8.1四、重复宏在编写源程序时,有时会出现连续相同或相似的语句(组)。当出现这种情况时,可利用重复伪指令来重复

语句,从而达到简化程序的目的。重复汇编伪指令有如下3种。1.伪指令REPT其一般使用格式如下:REPT数值表达式;宏体ENDM功能:重复地执行宏体中的语句,重复次数由数值表达式的值确定。退出3.8.1例如,定义100个初值分别为1,2,…,100的字节单元,该存储单元的起始符号地址为Table

。这样的定义要求,按照前面所学的语句时难以实现的,有了重复宏伪指令,实现如下:TableEQUTHISBYTECOUNT=1REPT100DBCOUNTCOUNT=COUNT+1ENDM退出3.8.12.伪指令IRP形式:IRP形参,<实参1,实参2,>;宏体EN

DM功能:将宏体重复汇编,重复汇编次数由尖括号括起来的实参个数所决定。每次重复汇编语句序列时,用一个实参替代形参。第一次用第一个实参,第二次用第二个实参,直到实参用完为止。退出3.8.1PopRegMACROStringIRPCReg,

StringPOPReg&XENDMENDM对上述宏定义的宏调用:PopRegDCBA退出3.8.1五、宏与子程序的区别宏和子程序都是为了简化源程序的编写,提高程序的可维护性,但是它们二者之间存在着以下本质的区别:汇编程序对宏通过宏展开来加入其定义体,宏调用多

少次,就相应展开多少次,所以,调用宏不会缩短目标程序;而子程序代码不论调用多少次,其在目标程序中只出现一次,因此,可简化相应的目标程序,从而节省存储空间。宏引用时,参数是通过“实参”替换“形参”的方式来

实现传递的,参数形式灵活多样,而子程序调用时,参数是通过寄存器、堆栈或约定存储单元进行传递的;利用宏调用语句执行重复语句,不会有额外的时间开销,而用子程序执行重复语句,子程序的调用和返回均需要时间;退出3.8.2条件汇编伪指令条件汇编指汇编程序

根据条件的不同汇编不同的程序段。形式:IFnnnn条件表达式语句组1[ELSE语句组2]ENDIF其中:IFnnnn是表3.3中的伪指令。功能:若条件汇编伪指令后面的“条件表达式”为真,那么,语句组1将被汇编;否则,语句组2将被汇编(如果含有ELSE伪指令)。语句组1或语句组2内还可以包有条件汇编

伪指令,这时,就形成了嵌套的条件汇编伪指令。每条条件汇编伪指令的具体含义如表3.3所示。退出3.8.3宏程序库对于程序编制人员,常常希望编得较好的宏定义能为较多的程序采用,且希望减少重复编写时的错误。这时,可把若干个宏定义以文件的形式组成一个宏库,供其它源程序使用。当需要宏库文件中

的宏定义时,可在新编制的源程序中使用INCLUDE伪指令。宏汇编程序在汇编源程序时,如果遇到INCLUD伪指令,把有关“宏库”文件包含在用户的源程序中,如同这个程序中自己定义的宏一样,在后面的程序中就可以对宏库

中的宏定义直接进行宏调用。MASM6.11系统定义了大量的标准宏,程序员能很方便地使用它们。主要的系统宏库文件有:DOS.INC和BIOS.INC,它们存放在系统的include子目录中。退出第九节算术协处理器对于各种协处理器,指令系统和编程几乎完全相同,主要区别是每种协处理器被设

计成与Intel的不同型号的微处理器共同工作。标识为8087的协处理器系列可以实现乘法、除法、加法、减法、求平方根以及超越函数的运算。退出3.9.1算术协处理器的数据格式一、整数8087CPU处理的整数有三种:字型整数、短型整数及

长型整数。它们都是有符号数二进制数,用补码表示。1.字型整数150形式:S数码其数值范围:-32768(-215)~+32767(+(215-1))在汇编语言环境下,其数据定义语句为:wData1DW3;定义16位字型变量wData1,赋初值为3退出3.9.12.短型整

数310形式:S数码其数值范围:-2147483648(-231)~+2147483647(+(231-1))在汇编语言环境下,其数据定义语句为:dData2DD-65532;定义32位短整型变量dData2,赋初值为-65532退出3.9.13.长型整数630形式

:S数码其数值范围:-91018(-263)~+91018(+(263-1))在汇编语言环境下,其数据定义语句为:qData3DQ-9945;定义64位长整型变量qData3,赋初值为-9945用户常用的是

字型整数和短型整数,有时也用长型整数。退出3.9.1二、实数在计算机中,实数就是规格化的二进制浮点数表示,规格化的二进制浮点数由三部分组成:数值的符号位、阶码和有效数字(简称尾数),其形式为:±2K(1+a1+a2++)二进制浮点数在计算机中的表现形式采用的是I

EEE标准,其格式为:SJa1a2a3……退出3.9.1S为浮点数的符号位;J为阶码,它时K的移码表示方式,即J=K+2N-1,其中N是阶码的位数,这样,J就是一个无符号数;a1a2a3为尾数,用原

码表示。实数的具体形式有以下三种:1.短实数313023220形式:SJ尾数一个数占32位,J=28-1-1+K,K的范围为-127~+127,对应J范围为0~254。短实数表示数值的范围为:-3.410

38~3.41038退出3.9.12.长实数636252510形式:SJ尾数一个数占64位,J=211-1-1+K,长实数表示数值的范围为:-1.710308~+1.7103083.暂时实数797864630形式:SJ尾数一个数占80位,J=215-1-1+

K,其表示数值的范围为:-1.1104932~+1.1104932退出3.9.1三、BCD码一个BCD码数据在内存中占80位,共10个字节。其最高字节用来表示正负号,其余9个字节,每个字节内含两个BCD码,所以,一个BCD码数据可表示18位十进制数

。关于BCD码的正负数,有如下规定:若最高位字节的值为00H,则表示该BCD码为正数;若最高位字节的值为80H,则表示该BCD码为负数。退出3.9.17972711615870形式:符号字节……BCDBCDBCDBCD一个数占80位,其表示数值的范围为:-9.9991017~

+9.999101717个17个在用汇编语言存储BCD码时,可使用伪指令DT来存储。退出3.9.2算术协处理器的内部结构一、8087的内部结构图3.24给出了算术协处理器的内部结构,它可分为两个主要部分:控制单元和数字执行单元。控制单元:定点微处

理器和协处理器均监视指令流,如果是ESC指令,则由协处理器予以执行,否则由定点微处理器执行。数字执行单元:负责执行所有协处理器指令。退出3.9.2二、8087程序设计模型8087种的寄存器分别为8寄存器的堆栈、状态寄存器、控制寄存器及标记寄存器。1.8寄存器堆栈协处理器中的堆栈包含

8个寄存器,每个为80位宽。这些堆栈寄存器中总包含一个80位的扩展精度浮点数。2.状态寄存器状态寄存器是用来标识协处理器中指令执行情况的,它相当于CPU中的标志位寄存器。80x87协处理器的状态寄存器如图3.24所示。退出3.9.2状态

寄存器各标志位(或组合位)的含义如下:忙位B(Busy):忙标志位用来表明协处理器是否正在执行协处理器指令,它可用FWAIT指令来测试。条件编码位C3-C0(ConditionCode):表明了协处理器的条件(参见表3.4)栈顶位TOP(Top-Of-Stack,ST):该三位二进制000

111用来表明当前作为栈顶的寄存器,通常是寄存器0(其值为000)。错误汇总位ES(ErrorSummary):ES=PE+UE+OE+ZE+DE+IE(逻辑或运算),在8087协处理器中,当ES为1时,将发出一个协处理器中断请求,但在其后的协处理器

中,不再产生这样的协处理器中断申请。精度错误位PE(PrecisionError):该状态位用来表明运算结果或操作数是否超过设定的精度范围。退出3.9.2下溢错误UE(UnderflowError):该状态位用来表明一个非0的结果太小,不能用控制字节所选定的当前精度来表示。上溢

错误OE(Overflow):该状态位用来表明一个非0的结果太大,不能用控制字节所选定的当前精度来表示。被零除错误ZE(ZeroError):该状态位用来表明当前执行了“0作除数”的除法运算。非规格化错误DE(DenormalizedError)

:该状态位用来表明当前参与运算的操作数中至少有一个操作数是没有规格化的。非法操作错误IE(InvalidError):该状态位用来表明执行了一个错误的操作,如:求负数的平方根,也可用来表明堆栈的溢出错误、不确定的

格式(0/0,∞,-∞等)错误,或用NAN作为操作数。退出3.9.23.控制寄存器控制寄存器如图3.25所示。无穷大控制IC(InfinityControl):选择是仿射无穷大还是投射无穷大。0—投影,假定是无符号无穷;1—仿射,允许正、负无穷。舍入控制RC(RoundingC

ontrol):确定舍入的类型。00—最接近或偶数,01—舍入成负无穷,10—舍入成正无穷,11—忽略小数部分。精度控制PC(PrecisionControl):设置结果的精度。00—单精度,01—保留,11—双精度,10—扩展精度。异常

屏蔽EM(exceptionmasks):决定异常错误是否影响状态寄存器的错误位。若屏蔽位的值为1,则状态寄存器的对应位被屏蔽;反之,不屏蔽。控制寄存器设置了精度错误屏蔽位PM、下溢出屏蔽位UM、上溢

出屏蔽位OM、除数为0屏蔽位ZM、非规格化操作数屏蔽位DM及非法操作屏蔽位IM。退出3.9.24.标记寄存器标记寄存器用来表明协处理器堆栈中各存储单元内容的状态,也就是说,该寄存器可表明堆栈中的数据是合法的,还是非法的,是无穷,还是0或空等

。该标记寄存器的结构如图3.26所示。其中:TAG(i)的取值含义:00—合法,01—0,10—非法或无穷,11—空退出3.9.3协处理器基本指令集协处理器可以执行超过68条不同的指令,汇编程序在遇到协处理器指令助忆符时,都会将其转换成机

器语言的ESC指令,ESC指令代表了协处理器的操作码。一、指令操作符的命名规则协处理器指令的操作符在命名设计时,遵循了下列规则:在操作符后面加上字母P:表示该指令执行完后,还进行一次堆栈弹出操作。如:FADD和FADDP等;在操作符后面加上字母R:表示该操作是反模式,它仅限于减法、除法指令。如

:FSUB和FSUBR等;正模式:栈顶数据=栈顶数据op指令操作数,或OPN1=OPN1–OPN2反模式:栈顶数据=指令操作数op栈顶数据,或OPN1=OPN2–OPN1退出3.9.3假设:栈顶数据为20,内存变量data的

值为5,分别执行下列指令将有不同的结果。FSUBdata;指令执行后,栈顶数据为15FSUBRdata;指令执行后,栈顶数据为-15操作符的第2个字母是I,表示内存中数据是整数。它对加、减、乘除指令都有效。例如:FADDdata;浮点数加法;FIADDdata;整数加法,它表

示内存单元data是一个整数,把该整数加到;栈顶的浮点数上。操作符的第2个字母是N,表示在指令执行之前是否插入一个等待。如:FSAVE和FNSAVE等,前者称为等待形式(WaitVersion),后者称为非等待形式(No-WaitVersion)

。退出3.9.3二、语句的一般形式8087语句的一般形式和8086语句的一般形式相同,其形式如下:[标号:]操作符[OPRD]OPRD的形式比较简单,有三种:1.省略该地址隐含操作数在浮点栈ST或ST与ST(1)中。2.浮点栈变量ST(I)或ST,ST(I)或ST(I),ST3.存储器

变量M8087存储器变量的形式和相应8086存储器变量一致。退出3.9.3三、8087指令系统1.数据传送指令数据传送指令主要是实现浮点栈与存储器之间的数据传送,以及浮点栈之间的数据传送。1)浮点数据传送FLD—装入实数指令形式:FLDOPRD功能:STOPRD该指令有如下两种形

式:FLDM;ST(M)FLDST(I);STST(I)退出3.9.3FST—存储实数形式:FSTOPRD功能:OPRDST该指令有如下两种形式:FSTM;MSTFSTST(I);ST(I)STFSTP—实数存储和弹出

形式:FSTPOPRD功能:OPRDST,然后从栈顶弹出该数据该指令有如下两种形式:FSTPM;MST,然后从栈顶弹出该数据FSTPST(I);ST(I)ST,然后从栈顶弹出该数据退出3.9.3可将FST指令理解为复制指令,而将FSTP理解为移动指令。

FXCH—交换指令形式:FXCHOPRD功能:STOPRD该指令有如下两种形式:FXCHM;MSTFXCHST(I);ST(I)ST2)整数传送指令装入整数指令FILD、存储整数指令FIST和存储并弹出整数指令FISTP。这3条指令功能与FLD、FST和FSTP一样,只不过传送的数据

类型为整数而不是浮点数。退出3.9.33)BCD数据传送指令装入BCD数据指令FBLD和存储并弹出整数指令FBSTP。这两条指令的功能也同FLD和FSTP一样,只不过传送的数据类型为BCD数据而不是浮点数。例3-20把8087所能处理的7种数据送入7个堆栈寄存器,然后再传入内存。分析:本程序的

编程很简单,就是用相应的装载、存储指令来就完成。主要目的是了解8087堆栈寄存器的使用方法。退出3.9.32.算术运算指令1)整数算术运算指令(1)FIADD—整数加指令形式:FIADDM功能:ST(ST)+(M)(2)FISUB—整s数减指令形式:FISUBM功能:ST(ST)

-(M)(3)FISUBR—整数反减指令形式:FISUBRM功能:ST(M)-(ST)退出3.9.3(4)FIMUL—整数乘指令形式:FIMULM功能:ST(ST)(M)(5)FIDIV—整数除指令形式:FIDIVM功能:ST(ST)(M)(6)FIDIV—整数反除指令形式:FI

DIVM功能:ST(M)(ST)2)实数算术运算指令(1)FADD—实数加指令形式1:FADD退出3.9.3功能:从堆栈中弹出这两个操作数,然后将结果压入堆栈ST(ST(1))+(ST)形式2:FADDM功能:ST(ST)+(M)形式3:FADDST,ST(I)功能:ST(ST)+

ST(I)形式4:FADDST(I),ST功能:ST(I)ST(I)+(ST),并弹出栈顶数据(2)FSUB—实数减指令(3)FSUBR—实数反减指令(4)FMUL—实数乘指令(5)FDIV—实数除指令退出3.9.3(6)FDIVR—实数反除指令实数以上指令都同加法

指令一样有四种形式。3)实数算术运算及弹出指令FADDP、FSUBP、FSUBRP、FMULP、FDIVP及FDIVRP指令功能同相应的实数算术运算指令,不同之处在于,运算完成后,ST的内容被弹出。4)其它算术运算指令(1)FABS—取绝对值指令,ST(ST)(2)FRNDINT—取整

指令,ST[(ST)](3)FSZRT—求平方根,ST退出)(ST3.9.33.比较指令比较指令有实数比较指令及实数测试指令、整数比较指令。1)实数比较指令形式1:FCOM功能:(ST)-(ST(1)),置条件码形式2:FC

OMM功能:(ST)-(M),置条件码形式3:FCOMPST(I)功能:(ST)-(ST(I)),置条件码,ST弹出形式4:FCOMPP功能:(ST)-(ST(1)),置条件码,ST与ST(1)全部弹出2)实数

测试指令形式:FTST功能:ST(ST)-0.0,置条件码退出3.9.33)整数比较指令形式1:FICOMM功能:(ST)-(M),置条件码形式2:FICOMPM功能:(ST)-(M),置条件码,ST弹出4.初等函数指令1)FPTAN—计算部分正切形式:FPT

AN功能:求部分Y/X=tanθ,其中ST=X,ST(1)=Y,角度θ存于栈顶。2)FPATAN—计算部分反正切形式:FPATAN功能:θ=ARCTANX/Y,其中X在栈顶,而Y在ST(1)中,指令将数据弹出堆栈而将结果θ值存于堆栈。退出3.9.33)FYL2X—计算YLog2X形式:FYL

2X功能:计算Ylog2X的值,其中X=ST(X>0),Y=ST(1),结果存入有一个弹出操作后的栈顶。4)FYL2XP1—计算Y(X+1)形式:FYL2XP1功能:(ST(1))=(ST(1)Log2((ST)+1)

,ST弹出5)F2XM1—计算2X-1形式:F2XM1功能:ST2(ST)-1,其中(ST)=X6)FCOS/FSIN——计算余弦或正弦形式:FCOS/FSIN功能:求栈顶ST中角度的正弦或余弦值,ST中存放的是弧度,运算结果也存于ST。

退出3.9.37)FSINCOS—计算正弦和余弦形式:FSINCOS功能:求栈顶ST中角度的正弦和余弦值,ST中存放的是弧度。运算结果:ST正弦值,ST(1)余弦值。5.置实常数指令8087设置了7个置

实常数指令,所置的7个常数是实数运算中较常出现的,这些指令可节省内存空间,提高计算的精度和速度,它们也方便了程序设计。1)FLDZ—置实数0指令形式:FLDZ功能:ST+0.02)FLD1—置实数1

指令形式:FLD1功能:ST+1.0退出3.9.33)FLDPI—置π指令形式:FLDPI功能:STπ4)FLDL2E—置log2E指令形式:FLDL2E功能:ST=Log2E5)FLDLN2—置logE2指令形式:FLDLN2功能:STloge26)FLDLG2

—置log102指令形式:FLDLG2功能:STLog1027)FLDL2T——置log210指令形式:FLDL2T功能:STlog210退出3.9.4算术协处理器的编程例3-21编写下列求Y的程序:Y=(x2+xF(x))F(x2)其中,F(x)

=Ax3+Bx2+Ex+D,X=2.5432,A=6.0,B=4.0,E=2.0,D=5.0分析:通过编写子程序,完成F(x)的计算,通过x2F(x2)+xF(x)F(x2)计算Y值。例3-22求LC电路谐振频率,公式为:F=分析:首先求出LC,然后对其开平方根

,再乘以2,求其倒数。退出LC21第十节CPU扩展指令集(2)CPU的指令集分为基本指令集和扩展指令集。从现阶段的主流体系结构讲,基本指令集可分为复杂指令集和精简指令集两部分。扩展指令集可分为多媒体指令集、单指令多数据流扩展指

令集、SSE2和AMD的3DNow!等,它们分别增强了CPU的多媒体、图形图像和Internet等的处理能力。退出3.10.1复杂指令集与精简指令集CISC即复杂指令系统计算机,从PC诞生以来,人们一直沿用CISC指令集方式,它的指令不等长,指令的条数比较多,编程和设计处理器时都较为麻烦。RI

SC体系结构的基本思路是:抓住CISC指令系统指令种类太多、指令格式不规范、寻址方式太多的缺点,通过减少指令种类、规范指令格式和简化寻址方式,方便处理器内部的并行处理,让计算机的结构更为简单,提高VLSI器件的使用效率,从而大幅度地提高处

理器的性能。退出3.10.2CPU的扩展指令集对于CPU来说,在基本功能方面,它们的差别并不太大,基本的指令集也都差不多,但是许多厂家为了提升某一方面性能,又开发了扩展指令集,扩展指令集定义了新的数据和指令,能够大大提高某方面数据处理能力.。1.MM

X指令集MMX是Intel公司在1996年为增强PentiumCPU在音像、图形和通信应用方面而采取的新技术,为CPU增加了57条MMX指令。退出3.10.2浮点部件寄存器堆主要由8个80位的寄存器组成,每个寄存器

还附加了两个目标位。MMX实际上只是使用了它们的64位尾数段,所以每个MMX寄存器都是64位宽,并标记为MM7MM0。MMX所能处理的数据类型是:8个连续的8字节,4个连续的16位字,以及2个连续的32位双字。MMX技

术的指令包括算术运算、比较、转换、逻辑运算、移位以及数据传送等指令。它们与传统指令的最大不同是:一条指令的操作数中实际上包含有多个经组合的数据。例如64位寄存器中存放的一般不是一个真正的64位二进制数据,可能是8个字节数据

,或者4个字数据,或者2个双字数据。这样,一条指令就可以实现处理多个数据的目的。退出3.10.2例3-23将两幅视频图像相加而合成另一幅新的视频图像。传统的SISD设计的程序流程分为以下几个步骤:步骤1,从内存中读取第1幅图

像的第X数据;步骤2,与内存中第二幅图像的第X数据进行运算;步骤3,将运算结果保存到内存中,作为新图像的第X个数据;步骤4,将指针X指向下一个数据。重复前3步,直至生成完整的新图像为止。当现实的图像分辨率为1024768的24位真彩色时,每屏

有786432个像素点,需要2359296(7864323)字节的显存。也就是说上述过程要重复2359296次。再者,倘若还要求显示器以85Hz的刷新率(场频)显示合成图像,也就是每秒要重复上述过程200,540,160(235929685)次。可以估算出,

上述这种处理办法对CPU该有多重的负担退出3.10.2MMX的SIMD处理不仅成倍地提高了处理的速率,而且使处理过程更贴近目标对象的实际情况。采用单指令多数据处理技术后,上述过程的操作可改进为:步骤1,从内存中读取第1幅图像的8个字节数据到一个MXX寄存器;步骤2,从内存中读取第2幅

图像的8个字节数据到另一个MXX寄存器;步骤3,将这两个MMX寄存器中的8个字节对应相加,结果存入其中的一个MXX寄存器;步骤4,将MMX寄存器的结果写入内存的8个单元,形成新图像的8个数据。步骤5,将指针指向下一组的8个

单元。重复前4步,直至生成完整的新图像为止。退出3.10.22.SSE指令集SSE指令集是Intel在PentiumIII处理器中率先推出的。SSE指令集包括了70条指令,其中包含提高3D图形运算效率的50条SIMD浮点运算指令、12条MMX整数运算增强指令、8条优化内存中连续

数据块传输指令。在后来Intel为了应对AMD的3Dnow!指令集,又在SSE的基础上开发了SSE2,增加了一些指令,使得其P4处理器性能有大幅度提高。到P4设计结束为止,Intel增加了一套包括144条新建指令的SSE2指令集。3.3DNow!指令集

由AMD公司提出的3DNow!指令集应该说出现在SSE指令集之前,并被AMD广泛应用于其K6-2、K6-3以及Athlon(K7)处理器上。3DNow!指令集技术其实就是21条机器码的扩展指令集。3DNow

!指令集主要针对三维建模、坐标变换和效果渲染等三维应用场合,在软件的配合下,可以大幅度提高3D处理性能。退出第十一节Win32汇编语言的编程退出3.11.1Win32可执行文件的开发过程以使用MASM32软件包为例,通过如图3.27所示的Win32汇编开发软件的流程,程序员

要做的工作分创建代码和创建资源两部分。3.11.2Win32汇编源程序的结构任何种类的语言,总是有基本的源程序结构规范,下面我们通过一个简单的程序来说明Win32汇编程序的结构。例3-24编程序实现弹出一个消息框,在上面显示了一句“

Hello,Win32汇编!”,并在文字的下面显示了一个“确定”按钮,就停在那里了,当用户按下“确定”按钮,程序就退出了,同时消息框消失。退出3.11.2一、模式定义程序的第一部分是模式和源程序格式的定义语句:.386.modelflat,stdcalloptioncasem

ap:none这些指令定义了程序使用的指令集、工作模式和格式。二、段的定义.data<一些字符串、变量定义>.code<代码><开始标号><其它语句>end开始标号退出伪指令分支结构的伪指令书写格式与高级语

言的书写方式相类似,汇编程序在汇编时会自动增加转移指令和相应的标号。分支伪指令的具体形式如下:形式1:.IFcondition指令序列;条件“condition”成立时所执行的指令序列.ENDIF形式2:.IFcondition;

条件“condition”成立时所执行的指令序列指令序列1;条件“condition”成立时所执行的指令序列.ELSE指令序列2;条件“condition”不成立时所执行的指令序列.ENDIF退出伪指令形式3:.IFcondition1指令序列1;条件“condition1”成立时所执行的指令

序列.ELSEIFcondition2指令序列2;条件“condition2”成立时所执行的指令序列.ENDIF其中:条件表达式“condition”的书写方式与C语言中条件表达式的书写方式相似,也可用括号来组成复杂的条件表达式。条件表

达式中可用的操作符有:==(等于)、!=(不等)、>(大于)、>=(大于等于)、<(小于)、<=(小于等于)、&(位操作与)、!(逻辑非)、&&(逻辑与)、||(逻辑或)等。若在条件表达式中检测标志位的信息,则可以使用的符号名有:CARRY?(相

当于CF==1)、OVERFLOW?(OF==1)、PARITY?(PF==1)、SIGN?(SF==1)、ZERO?(ZF==1)等。退出伪指令例3-12利用分支伪指令改写例3-10。分析:我们只需用分支伪指令取代测试指令

及判断指令即可。返回Masm6.11在宏汇编MASM6.11系统中,还增加了表达循环结构的伪指令,以便更清晰地表达WHILE循环、REPEAT-UNTIL循环。另外,还增加两个辅助循环的伪指令。这些伪指令的书写格式和含义与高

级语言中相应语句的书写格式和含义相一致,所以,这些伪指令是很容易掌握的,也是非常有用的形式1:.WHILEcondition循环体的指令序列;条件“condition‖成立时所执行的指令序列.ENDW形式2:.REPEAT

.REPEAT循环体的指令序列循环体的指令序列.UNTILcondition.UNTILCXZ[condition]退出Masm6.11REPEAT型循环在执行完循环体后,才判定逻辑表达式condition的值。若该表达式的值为真,则终止该循环,并将执行伪指令.UNTIL或.UNTIL[CXZ]后

面的指令,否则,将向上跳转到伪指令.REPEAT之后的指令,为继续执行其循环体作准备。如果.UNTILCXZ后面没有写逻辑表达式,那么,由.REPEAT-.UNTILCXZ所构成的循环与用LOOP指令所过程的循环是一致的,它们都是以“CX=0”为循环终止条

件。如果.UNTILCXZ后面书写了逻辑表达式,那么,该逻辑表达式的形式只能是:“EXP1==EXP2”或“EXP1!=EXP2”。所以,这时由“.REPEAT-.UNTILCXZcondition”所构成的循

环就与用LOOPNE/LOOPE指令所过程的循环是一致的,它们都是以“condition||CX=0”为循环终止条件。和高级语言的REPEAT型的循环一样,.REPEAT-.UNTIL[CXZ]的循环体也会至少被执行一次。退出Masm6.11.WHILE-.ENDW和.REPEAT-.UNT

IL[CXZ]的循环体内还可再含有循环伪指令,这样就构成了循环结构的嵌套。例3-14利用循环伪指令改写例3-12。分析:我们只需用伪指令取代loop指令即可,这样可以取消显式的标号。另外,像C语言一样与还设置了两条辅助的循环伪指令:终止循环伪指令,其形式如下:.BR

EAK.BREAK.IFcondition该伪指令用来终止包含它的最内层循环。前者是无条件终止循环,后者是仅当逻辑表达式condition为真时,才终止循环。其使用场合如下:退出Masm6.11.WHILE1.REPEAT…….BREA

K.IFcondition.BREAK.IFcondition…….ENDW.UNTIL0对于以上二个循环,如果没有指令来终止循环的话,它们都将进入死循环状态,但如果在该层循环体内,存在伪指令“.BREAK.IFcondition‖的话,那么,当逻辑表达式cond

ition为真时,该循环就会被终止了。循环继续伪指令,其形式如下:.CONTINUE.CONTINUE.IFcondition退出Masm6.11该伪指令用于直接跳转到包含它的最内层循环的判断循环条件表达式的代码处。前者是无条件转移到判断循环条件表达式的代码处,后者是仅当条件表达式c

ondition为真时,才进行这样的跳转。辅助循环伪指令.BREAK和.CONTINUE只能在伪指令.WHILE-.ENDW和.REPEAT-.UNTIL的循环体内使用。例3-15显示9个数字字母'1'~'9',26个大写字母,和显

示任意输入的数字字符,并用按“回车”键来结束本程序的运行分析:利用第一个循环伪指令完成'1'~'9'显示;利用第二个循环完成大写字母的显示;利用第三个循环完成任意数字的显示,并监视“回车”键结束循环。返回图3.1编译语言指令翻译为机器指令的示意图退出„„„MOVAL,16ADDAL,4

MOVADD6,AL„„„汇编程序„„B010H0404HA20600H„„汇编语言源程序机器指令序列图3.1汇编语言指令翻译为机器指令的示意图图3.2图3.3需存放的数据内存单元ADRR内存单元AD

RR+1内存单元ADRR+2内存单元ADRR+3退出3124231615870图3.2Big-Endian格式的存储格式3124231615870需存放的数据内存单元ADRR+3内存单元ADRR+2内存单元ADRR+1内存单元ADRR图3.3Little-Endian格式的存储格式

表3.2二进制数码的不同含义退出含义十六进制(二进制)无符号二进制数有符号二进制数分离式BCD码组合式BCD码ASCII码53(01010011)83+83353S07(00001001)7+7707BELC6(00110110)198-589//AB(10101011)171-85///内存分

配图退出图3.4退出EnglishNOCNAMESCORE图3.4结构类型COURSE的字段分布示意图图3.5退出bVarwVardVar图3.5共用体类型的字段分布图图3.6图3.7退出23代码段数据段堆栈段ABAL300002000BPSS32000AB3200023代码段数

据段堆栈段23AL200001000SIDS2100021000图3.6用SI寄存器间接寻址图3.7用BP寄存器间接寻址图3.8图3.9退出23代码段数据段堆栈段20AL300002000BPSS33000330015F代码段数据段堆栈段5FAL200001000SIDS211002110

0图3.8寄存器相对寻址方式图3.9基址加变址寻址方式503300020501000SIcount0100图3.10相对基址加变址寻址方式退出89代码段数据段堆栈段53BX200002000BXDS2325023251图3.10相对基

址加变址寻址方式892325020501000SI530250MASK图3.11图3.12图3.13退出xx0606xxxx0606xx堆栈区SS:01FFHSP=0200HSS:0000HSP=01FEHSS:01FFHSS:00

00HSS:01FFHSP=0200HSS:0000H图3.11堆栈的定义图3.12PUSHAX进栈操作图3.13POPAX出栈操作SS:0200HSS:01FEHAXAX图3.14图3.15退出逻辑移位算术移位小循环移

位大循环移位左右移指令循环移位指令移位类指令图3.14移位类指令分类CF高位操作数低位图3.15左移指令示意图图3.16退出CF高位操作数低位图3.16右移指令示意图图3.17退出CF高位操作数低位图3.17算术右移示意图图3.18退出高位操作数低位CF图3.18不带进位循环左移示

意图图3.19退出高位操作数低位CF图3.19不带进位循环右移示意图图3.20退出高位操作数低位CF图3.20带进位循环左移示意图图3.21退出高位操作数低位CF图3.21带进位循环右移示意图表3.3条件汇编伪指令退出伪指令汇编条件IF1在第一遍扫

描时IF2在第二遍扫描时IF表达式表达式不等于0IFE表达式表达式等于0IFDEF符号符号已定义IFNDEF符号符号未定义IF变量变量是空格IFNB变量变量不是空格IFIDN变量1,变量2变量1和变量2

相同IFNIDN变量1,变量2变量1和变量2不相同图3.2480x87算数协处理器的内部结构退出控制寄存器状态寄存器总线跟踪异常指示数据缓冲区数据状态地址指令译码器操作数队列阶码模块临时寄存器阶码模块移位器标记寄存器(

1)(2)(3)(4)(5)(6)(7)(8)图3.2480X87算术协处理器的内部结构控制单元(CU)数值执行部件(NEU)图3.2480x87协处理器的状态寄存器示意图退出15131211870BC3TOPC2C1C0ESSFPEUEOEZEDEIE图3.2480x87协

处理器的状态寄存器示意图图3.25退出1514131211109876543210ICRCPCPMUMOMZMDMIM图3.2580x87协处理器的状态寄存器示意图图3.26退出15131197531TAG(7)TAG

(6)TAG(5)TAG(4)TAG(3)TAG(2)TAG(1)TAG(0)图3.26标记寄存器结构示意图表3.4状态寄存器中条件编码位的组合含义退出指令C3C2C1C0功能FTST、FCOM000ST>操作数或(0FTS

T)001ST<操作数或(0FTST)100ST=操作数或(0FTST)111ST不可比较FPREMQ10Q0Q2Q2Q1Q0是商的右边3位?1??未完成FXAM0000+unnormal0001+NAN0010-un

normal0011-NAN0100+normal0101+∞0110-unnormal0111-∞1000+01001空1010-01011空1100+denormal1101空1110-denormal1111

空图3.27Win32可执行文件的开发过程退出文本编辑器输入源程序预定义头文件Windows.inc汇编源文件*.asmAPI声明头文件Windows.inc汇编编译器M1.exe目标文件*.obj资源编译器Rc.exe资源文件*.res汇编编译器M1.exe导入库文

件*.lib代码创建资源创建预定义头文件Windows.inc汇编源文件*.asm位图*.bmp图标*.ico光标*.cur声音*.wab图3.27Win32可执行文件的开发过程知识概述•基本概念:机器指令,数据在内存中的存储格式,汇编程序,操作符,伪操作符,名字,常数,表达式•重点

:汇编语言及高级语言的特点,Intel芯片的存储惯例,汇编语言的上机步骤,汇编语言的符号•难点:属性常数,合法的表达式退出

小橙橙
小橙橙
文档分享,欢迎浏览!
  • 文档 25747
  • 被下载 7
  • 被收藏 0
相关资源
广告代码123
若发现您的权益受到侵害,请立即联系客服,我们会尽快为您处理。侵权客服QQ:395972555 (支持时间:9:00-21:00) 公众号
Powered by 太赞文库
×
确认删除?