第五章 汇编语言程序设计_第1页
第五章 汇编语言程序设计_第2页
第五章 汇编语言程序设计_第3页
第五章 汇编语言程序设计_第4页
第五章 汇编语言程序设计_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

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

文档简介

第五章汇编语言程序设计汇编语言是机器语言的符号表示,是用指令的助记符、符号地址、标号等书写程序的语言。用汇编语言编写的程序,叫汇编语言源程序,或简称源程序。只有将源程序翻译成目标程序,才能在机器上运行,这种把汇编语言程序翻译成机器语言程序的过程称为汇编。

计算机完成汇编任务是由汇编程序〔MASM-MacroAssembler〕这样一个软件工具实现的,汇编程序加工的对象是汇编语言源程序,加工的结果是目标程序。汇编语言的一个实例

DATA SEGMENTA DW 123B DW 456SUM DW ?DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AXMOVAX,AADDAX,B MOVSUM,AXMOVAH,4CHINT21H CODE ENDSENDSTART 5.1汇编语言语法5.1.1汇编语言语句

指令性语句是能产生目标代码,CPU可以执行的能完成特定功能的语句。其格式为:

[标号:][前缀]指令助记符操作数[;注释]

指示性语句,又叫伪指令是没有对应的机器指令,不能执行,只给汇编程序提供一种信息,用来定义变量,分配存储单元,指示程序开始和结束等。其格式为:

[名字]伪指令 操作数 [;注释]

名字是给伪指令取的名称,通常是变量名、段名、过程名、符号名等。两种语句的区别:

在形式上:带不带冒号,是否可转向它。

在本质上:汇编时能否形成对应的机器码。操作数〔数据项〕汇编语言中使用的操作数可以是常数、存放器、名字〔变量〕、标号或表达式1、常数1)数字常量用于伪指令中给变量赋值,或作为指令语句中的立即数、直接地址。2)字符串常量用单引号引起来的字符或字符串也代表常数。例:’A’,’BCDE’,汇编时被翻译成对应的ASCII码41H和42H,43H,44H,45H。3〕符号常量PORTEQU20HINAL,PORT

变量是内存中的数据区,在程序中作为存储器操作数来使用。在除代码段以外的其它段中定义。变量主要有三种属性:①段地址—变量所在段的段地址②偏移地址—变量单元地址与段起始地址之间的位移量。③类型—有字节、字和双字三种。2.变量3.标号标号是可执行指令语句所存放单元的符号地址,可作为转移指令的转移地址。标号也有三种属性:段地址总是在CS段存放器中,偏移地址概念与变量同,类型分NEAR和FAR两种。NEAR—表示标号所在语句与转移指令或调用指令在同一代码段内,只需改变IP即可。FAR—标号所在语句与转移指令或调用指令不在同一代码段内。4、存放器8位:AH,AL,BH,BL,CH,CL,DH,DL16位:AX,BX,CX,DX,SI,DI,BP,SP,DS,SS,ES,CS5、表达式数值表达式地址表达式5.1.2表达式中的各类运算符有+、-、*、/,以及MOD,其中MOD表示除法运算后得到的余数。例:19/7的商是2,19MOD7那么为5(余数)算术运算符可以用于数字表达式,例:MOV AL,2*7 汇编时计算表达式形成指令为:MOV AL,0EH算术运算符也可以用于地址表达式,对地址运算的结果应有明确的物理意义,例两个地址的乘或除无意义,而加或减那么可以,例:LEASI,SUM+3表示变量SUM的地址加上3得到的和作为新存储器地址。(1)算术运算符逻辑运算符有AND、OR、XOR和NOT,它们只能用于数字表达式中。例:MOVCL,36HAND0FH汇编时形成指令:MOVCL,06H这些逻辑运算符也是8086/8088的指令助记符,但不会造成混乱,前者在汇编时进行,而后者在指令执行时进行的。

例:ANDDX,PORTAND0FEH后一个逻辑运算符AND在汇编时进行,假设PORT为81H,那么汇编后表达式算出为80H。执行前一个指令助记符AND时,将(DX)与80H相与,结果在DX中。(2)逻辑运算符PORTEQU81H共有6个,它们为:EQ(相等),NE(不等),LT(小于),GT(大于),LE(小于或等于),GE(大于或等于)关系运算符的两个操作数必须都是数字或者是同一段内的两个存储器地址。关系为真,结果为0FFH或0FFFFH关系为假,结果为0例:MOVBX,PORTGE5假设PORT的值大于等于5,那么汇编后为:MOVBX,0FFFFH假设PORT的值小于5,那么汇编后为:MOVBX,0(3)关系运算符它可以把存储器一些特征作为数值送回。这些操作符有OFFSET,SEG,TYPE,SIZE及LENGTH。OFFSET运算符用来取存储单元的偏移量。例:MOVSI,OFFSETSTRI1;将变量STRI1的地址偏移量取到SI中。注意与MOVSI,STRI1的差异。但它与LEASI,STRI1等价。SEG运算符用来取存储单元的段值。例: MOV AX,SEGSTRI1 ;将变量STRI1所 MOV DS,AX ;在段值取到DS中(4)数值返回运算符TYPE运算符用来取变量或标号的类型值存储器单元类型对应值

DB(字节)

1

DW(字)

2

DD(双字)

4DQ(四字)8

DT(10字节)10NEAR-1FAR-2LENGTH运算符返回DUP定义的数据占据的元素个数,其它返回1。SIZE运算符返回DUP定义的数据占据的字节数,其它返回TYPE值。(5)属性运算符用来建立或改变已定义变量、内存操作数或标号的类型属性。运算符有:段操作符“:〞、PTR、SHORTMOV AX,ES:STRI1INCBYTEPTR[BX]

在源程序中使用一些约定的符号,这些符号用来告诉汇编程序应如何工作,这就是汇编控制指令,也称伪指令。伪指令语句包含在源程序中,由汇编程序对源程序进行汇编时解释执行。伪指令语句除了本身可以申请分配一局部存储空间用作数据区和堆栈区外,不产生任何目标代码。在将源程序翻译成目标程序后,伪指令语句就不存在了。5.2.1符号定义伪指令符号定义伪指令有EQU、=、LABEL几种。1.EQU伪指令使用格式为:名字EQU数值或字符序列EQU伪指令的功能是将数值或字符序列与一个指定的名字等价。如此能增加汇编程序可读性。给程序的设计与维护带来方便。下面的例子列举了EQU伪指令的常见用法:5.28086汇编语言的伪指令语句 THREEEQU3 ;名字THREE与数值3等价SIXTHEQUTHREE*(17+THREE);SIXTH等价于3*(17+3)

PEQUES:[BX] ;P与ES:[BX]等价YEQUP[SI] ;Y与ES:[BX][SI]等价2.“=〞伪指令“=〞伪指令与EQU伪指令具有相同的功能,区别仅在于“=〞伪指令定义的符号允许重新定义,使用更灵活方便。例如: EMP=60 ;定义EMP等于常数60 EMP=79 ;重定义EMP等于常数79 EMP=EMP+1 ;又定义EMP等于常数805.2.2变量定义伪指令常用的变量定义伪指令有DB、DW、DD、DQ、DT,分别用来定义字节,单字、双字、四字及十字节类型变量。它们的根本应用格式如下:[变量名]{DB|DW|DD|DQ|DT}〈表达式〉其中,变量名是可选的,{}表示其中的伪操作命令必须选用一种,表达式有如下几种应用形式:1.数值表达式这种形式定义的变量具有表达式给定的数值初值。例如:BETADW4*10H;变量BETA为字类型,初值为642.ASCII字符串

字符串必须用单引号括起来。DB伪指令为串中每一个字符分配一个字节单元,且自左至右按地址递增的顺序依次存放,字符个数不得超过255个。例如

MSG1DB'msgtest'对于DW伪指令,可以给两个字符组成的字符串分配两个字节存储单元,而且这两个字符的存储顺序是前一个字符在高字节,后一个字符在低字节,每一个数据项不能多于两个字符。例如:

MSG2DW'AB','cd','ef'3.地址表达式地址表达式的运算结果是一个地址,因此只能用DW或DD来定义。如果用DW定义,那么将原变量或标号的偏移地址定义为新变量;如果用DD来定义,那么将原变量或标号的偏移地址和段地址分别置入新变量的低位和高位字中。例如:AD1DDBETA1;变量的初值为BETA1的段地址和偏移地址AD2DWBETA2;变量的初值为BETA2的偏移地址4.?

问号表示所定义的变量未指定初值。例如:

BUFDW?;定义一个字变量BUF,初值为一随机数5.〔n〕DUP〔表达式〕这种情况用于定义重复变量,DUP〔Duplication〕是重复数据操作符,n表示重复次数,圆括号内的表达式表示要重复的内容。例如:TABDB100DUP〔0〕;从变量TAB开始有100个初值为零的字节元素

DUP操作符可以嵌套使用,即圆括号中的表达式又是一个带DUP的表达式。例如:TABDW2DUP〔5DUP〔4〕,7〕表示变量TAB开始有12个字元素,这12个元素的初值构成的数据序列为: 4,4,4,4,4,7,4,4,4,4,4,7共占24个字节单元。5.2.3程序分段定义伪指令1.SEGMENT和ENDS伪指令1〕语句格式利用SEGMENT和ENDS可把源程序模块划分成假设干个源程序段,它的格式为:〈段名〉SEGMENT[定位方式][组合方式][分类名] ;段内所有语句〈段名〉ENDS其中,段名是为该段起的名字;定位方式、组合方式和分类名是可选的,选两个以上时,书写顺序必须与格式中的顺序一致。这三个可选操作数都是通过汇编给链接程序提供控制信息的。链接时,先处理组合方式,再处理定位方式,最后处理分类名。2〕组合方式源程序可以分成假设干个模块单独编制与汇编,每个模块又可划分假设干段,如果这些段都不太大却又分别定义了不同的段名,那么当这些模块链接起来并装入机器运行时,由于程序段数可能大大超过当前立即可用的由段存放器确定的逻辑段数〔仅四个〕,使程序运行极为不便。为此,如果将不同模块中相同性质的段使用同样的段名,那么连接这些模块时就可以把同名的段按照指定的方式组合起来,既便于程序运行,又可以到达有效使用存储空间之目的。可供选择的组合方式有PUBLIC、STACK、AT、COMMON、MEMORY以及NONE共六种。①PUBLIC该段与其它模块的同名段按先后出现的顺序依次连接起来形成一个源程序段,共用一个段基址,运行时装入同一个逻辑段。STACK与PUBLIC类型同样处理,只是组合后的这个段专门用作堆栈段,并自动初始化SS和SP。注意,被链接的所有模块中至少应该有一个STACK段,否那么LINK时会提示出错。COMMON表示该段与其他模块中被说明成COMMON的同名段共享相同的存储区,采用覆盖方式存放,连接长度为各分段中最大长度。AT〈数值表达式〉表示该段应按绝对地址定位,段地址为数值表达式的值,偏移地址为0。MEMORY表示该段定位在所有其他段之上,即地址较大区域。NONE即不指定方式,表示该段与其它模块中的段,不管段名是否相同,都不发生任何组合关系,链接时它将是一个独立的段。〔缺省〕3〕定位方式定位方式通过汇编告知LINK程序如何将经组合后的新段定位到存储器中。定位方式有四种,即PARA、BYTE、WORD和PAGE方式。①PARA方式:规定段从16的整数倍地址〔指物理地址〕开始,它使得段间可能留有1到15个字节的间隙。这也是一种缺省方式。②BYTE方式:规定段可以从任何地址开始,它使本段与前面段间不留任何间隙。③WORD方式:规定段只能从偶地址开始,它使得段间可能留一个字节的间隙。④PAGE方式:规定段从256的整数倍地址开始,它使得段间可能留有1到255个字节的间隙。4〕分类名假设SEGMENT语句书写了“分类名〞,那么进行链接装配时,LINK程序把分类名相同的所有段(段名未必相同)放在连续的存储区域内,但仍然是不同的段。分类名相同的各个段在链接时,先出现的在前,后出现的在后。2.ASSUME伪指令8086利用CS存放器为代码段寻址,DS存放器为数据段寻址,SS存放器为堆栈段寻址…。然而SEGMENT和ENDS两个伪指令并未告诉汇编程序,其所定义的段是哪一种段,而ASSUME伪指令可到达此种功能,它告诉汇编一种匹配假设,即哪个段存放器将为哪个段名寻址。 ASSUME<段存放器>:<段名>[,<段存放器>:<段名>]其中段名是程序中定义过的任何段名或组名。3.ORG伪指令该指令可用来设置段内偏移地址。汇编程序开始对源程序的某段进行汇编时,其地址计数器的初值相对于段地址总是零。接着依次累计段内语句汇编后生成目的代码的字节数。ORG伪指令可修改计数器的内容。格式为: ORG〈表达式〉它告知汇编,该指令后生成的目标代码,从表达式提供的偏移地址开始存放。该指令的实际工作是把当前段的汇编程序地址计数器置成表达式所确定的值。下面是使用ORG伪指令的例子:DATASEGMENTORG100 XXDW10DUP〔?〕 ORG$+5

ORGOFFSETXX+256ARRAYBDB100DUP(1,-1)它表示该段的目的代码从偏移地址100的位置开始产生,这是第一个ORG的功能。第二个ORG是为变量XX产生十个未初始化的字后,又跳过五个字节,再继续生成目的代码。第三个ORG告知汇编字节变量ARRAYB从偏移地址356的位置开始存放。过程定义伪指令在程序设计中,常把具有一定功能的程序设计成一个子程序,子程序的使用不仅减少了目标代码的生成数量。而且便于实现程序的模块化。汇编语言中,子程序通常以过程的形式编写,通过使用过程定义伪指令PROC和ENDP来定义一个过程,然后再通过CALL指令实现调用。过程定义伪指令的格式如下: 〈过程名〉PROC[类型]

RET 〈过程名〉ENDP过程名是为该过程起的名字,具有与语句标号相同的属性,即具有段地址、偏移地址和类型〔NEAR和FAR〕三个属性。程序模块的开始与结束伪指令NAME和END伪指令定义一个模块需使用NAME和END两条伪指令。指令格式如下:

[NAME<模块名>]

END[标号]其中,模块名是为该模块起的名字,NAME语句行可缺省,缺省时该模块的源程序文件名就是模块名。汇编时,一个模块就是一个汇编单位。汇编处理只进行到模块结束语句END为止。如果该模块是主模块,END语句可以指出一个标号,它表示该程序的启动地址。一次被连接的各模块中只能有一个是主模块,即程序只能有一个启动地址。BIOS中断调用:在存储器系统中,内存高端8KB的ROM中存放有根本输入/输出系统(BasicInput/OutputSystem,BIOS)例行程序。主要提供系统自检及初始化、系统效劳和硬件中断处理等功能模块。可以通过软中断指令INTn访问。DOS系统功能调用:是微机的磁盘操作系统DOS(DiskOperatingSystem)为用户提供的一组例行子程序,它与BIOS中断执行同样的功能,而且操作更简易,对硬件的依赖更少一些,使用软中断指令INT21H软中断所完成的各项功能。5.3BIOS和DOS系统功能调用主要功能:1〕磁盘的读/写以及控制管理2〕内存管理3〕根本的输入输出管理〔键盘、显示器、打印机等〕另外还有时间、日期管理调用方法:1)系统功能号送到AH存放器中2)入口参数送到指定存放器中3)用INT21H指令执行功能调用有些系统功能调用比较简单,不需要设置入口参数或者没有出口参数,那么只需安排后两个语句,调用返回完成时,系统将出口参数送到指定的存放器中,或送屏幕显示出来。一、键盘功能调用例:交互程序需用户对一个提示做应答时,需单字符输入。GET_KEY:MOVAH,1CMPAL,‘N’INT21HJENOCMPAL,‘Y’JNEGET_KEYJEYES

AH功能返回参数

01H从键盘输入一个字符并回显在屏幕上AL=字符07H从键盘输入一个字符不回显AL=字符0AH输入字符到缓冲区DS:DX=缓冲区首地址

从键盘输入字符串。这是0AH号系统功能调用,要求预先定义一个输入缓冲区,将DS:DX指向缓冲区,该区的第一个字节指出能容纳的最大字符个数;第二个字节存放实际输入的字符个数,由系统最后填入;从第三个字节开始存放从键盘接受的字符,直到ENTER键结束。定义缓冲区:

BUFFDB100;存放100字节的缓冲区 DB?;系统输入实际输入字节数 DB100DUP(?);存放输入字符系统功能调用:MOVDX,OFFSETBUFFMOVAH,0AHINT21H二、显示功能调用AH功能调用参数02H显示一个字符DL=字符09H显示字符串DS:DX=字符串首地址例:显示一个单字符MOVDL,ALMOV AH,2INT 21H

字符串输出。9号功能调用,将指定的内存缓冲区中的字符串从屏幕显示输出。要求DS:DX指向串地址首址,并且字符串必须以‘$’字符为结束符。例:在屏幕上显示‘HOWDOYOUDO?’字符串,且光标换行。DATASEGMENT CR EQUODH LF EQU0AH MES DB'HOWDOYOUDO?',CR,LF,'$'DATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATAMAIN:MOV AX,DATA MOVDS,AX MOV DX,OFFSETMES;DS:DX指向字符串MES MOV AH,9 ;9号功能调用 INT 21H MOV AH,4CH ;返DOS INT 21HCODEENDS ENDMAIN

三、打印功能例:打印一个字符串TEXTDB‘HELLO!’……MOVCX,6MOVBX,0NEXT:MOVAH,5MOVDL,TEXT[BX]INT21HINCBXLOOPNEXT……AH功能调用参数05H打印一个字符DL=字符5.4汇编语言程序设计方法汇编语言程序设计的根本方法一个好的程序,不仅应满足设计要求,实现预定功能,还应满足:①结构模块化、简明、易读、易调试、易维护〔指修改与扩充〕;②执行速度快;③占用存储空间少。执行速度和占用存储空间两者有时是相矛盾的,这两个指标往往不能同时满足,在许多情况下要加以权衡,看哪一个指标对于我们的程序要求更重要。对于较大的程序,如何使程序模块化,易读、易调试和易维护,那么显得更加重要。在开发大型程序方面,保证代码正确性,有时比追求代码技巧性显得更为实用。汇编语言程序设计的根本步骤如下:①分析问题,抽象出描述问题的数学模型,确定解决问题的适宜算法;②绘制抽象流程图或写出抽象步骤,可以从粗到细把算法逐步地具体化;③分配存储空间及工作单元,根据框图编写程序;④静态检查源程序;⑤上机调试程序,按设计要求对程序运行正确性作全面测试。汇编语言程序与DOS操作系统的接口1〕标准方法EXP1PROC FARSTART:PUSHDS MOVAX,0 PUSH AX

RETEXP1ENDP2〕非标准方法MOVAH,4CHINT21H

从START标号开始的三句为返回DOS设置返回地址,它相当于把DS:0000H压栈.连接程序为每一个用户程序建立了一个程序段前缀区,在前缀区开始处安排了一条INT20H,在过程结束时通过RET返回DOS。

在程序结尾处执行功能号为4CH的DOS系统功能调用一、顺序程序设计顺序程序,又叫直线运行程序。这种程序的形式最简单,计算机执行程序的方式是指令逐条依次被执行,不进行判断和跳转,直到程序结束。例:编程计算Z=(x2-3y)/2。设x、y为单字节正整数,结果Z用两个字节来存放。

计算X﹡X开始结束计算3﹡Y计算(X2-3Y)/2→ZDATA SEGMENTXDB25YDB32ZDW?DATA ENDSCODESEGMENT

ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA;初始化DS MOVDS,AX MOVAL,X MULAL;X^2 MOVBL,Y ADD BL,BL ADD BL,Y;3Y SUBAX,BX;X^2-3Y SHR AX,1;(X^2-3Y)/2 MOVZ,AX;存结果MOVAH,4CH;返回DOSINT21HCODEENDS

END

STATR;汇编结束顺序程序的设计和运行都是比较简单的,但是实际应用中往往需要根据不同的情况和条件作出不同的处理,顺序程序是无法实现的,因此可以采用分支程序来完成。分支程序就是根据不同的情况或条件执行不同功能的程序,它具有判断和转移功能,在程序中利用条件转移指令对运算结果的状态标志进行判断,以实现转移功能。分支程序常用的结构形式有两种:一种是简单分支结构,另一种是多分支结构。二、分支程序设计1、简单分支程序设计双分支条件?YN单分支条件?YN条件1?条件2?三个分支YYNN例:在内存中,有一个字节单元NUM存有带符号数据,计算出它的绝对值后并放入RESULT单元中。分析:根据数学中绝对值的概念可知,一个正数的绝对值是它本身,而一个负数的绝对值是它的相反数。如要计算一个数的相反数,就要完成减法运算,即用零减去这个数。而8086系统有专用的求反指令NEG。X→ALAL≥0?YN开始结束将AL中的内容求补AL→RESULTDATASEGMENTXDB-25RESULTDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX ;初始化MOVAL,X ;X取到AL中TESTAL,80H ;测试AL正负JZ NEXT ;为正转NEXTNEG AL ;否那么AL求补NEXT:MOVRESULT,AL ;送结果MOVAH,4CHINT 21H ;返回DOSCODE ENDSEND START ;汇编结束例:VAR单元内有一自变量X,请按如下条件编出求函数值Y并将它存入FUNC单元的程序。Y=X>00X=0-1X<0算法:这是一个三分支归一的条件转移问题。由题意可知,自变量X是个带符号数,故可采用与零比较和条件转移指令来做。DATASEGMENTVARDB-25FUNCDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,VARCMPAL,0

JGE

LOOP1MOVAL,0FFHJMPEXITLOOP1:JELOOP2MOVAL,01H

JMPEXIT

LOOP2:MOVAL,00HEXIT:MOVFUNC,ALMOVAH,4CHINT21HCODEENDSENDSTART

ALXAL≥0?AL=0?AL-1AL1AL0FUNCALYYNN开始结束结论:不管哪一种分支形式,它的运行方向是向前的,在某一种确定条件下,只能执行多个分支中的一个分支。程序的控制流向不能再回到进入此结构的入口,因此也把这样的程序结构称之为“开式结构〞。问题:在实际应用中还经常会遇到一些具有相同或类似的操作需要重复执行屡次的问题,对于这样的问题该如何解决?在程序中,往往要求某一段程序重复执行屡次,这时候就可以利用循环程序结构。这里把能按一定规律,屡次重复执行的一串语句,叫作循环程序。1、循环程序的组成一个循环结构由以下几局部组成:(1)循环初始化局部:这是为了保证循环程序能正常进行循环操作而必须做的准备工作。循环初值分两类:一类是循环工作局部的初值,另一类是控制循环结束条件的初值。(2)循环工作局部:即需要重复执行的程序段,这是循环的中心,即循环体。(3)循环参数修改局部:按一定规律修改操作数地址及控制变量,以便每次执行循环体时得到新的数据。(4)循环控制局部:用来保证循环程序按规定的次数或特定条件正常循环。(5)循环结束局部:主要用来分析和存放程序的结果。三、循环程序设计2、循环结构处理部分未结束直到型循环(先执行后判断结构)控制部分结束处理初始化部分修改部分处理部分未结束当型循环(先判断后执行结构)控制部分结束处理初始化部分修改部分例:编写程序完成求1+2+3+…N的累加和,直到累加和超过1000为止。统计被累加的自然数个数送CN单元,并把累加和送SUM单元。

初始化0→AX,0→BXAX≤1000?BX→CN,AX→SUMYNN开始结束BX+1→BXAX+BX→AXDATASEGMENT SUMDW? CNDW?DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX ;初始化 MOVAX,0 ;0送AXMOV BX,0 ;0送BXLP:INC BX ;BX加1 ADD AX,BX ;求累加和 CMP AX,1000;比较 JBE LP ;≤1000转 MOV SUM,AX MOV CN,BX ;送结果 MOV AH,4CH INT 21H ;返回DOSCODEENDS END START ;汇编结束例:在ADDR开始的单元中存放着一个字,将字中1的个数存入COUNT单元中。算法:要测出1的个数就应逐位比较,可根据最高有效位是否为1来计数,然后用移位的方法把各位数逐次移到最高位去。可以用测试字是否为0来作为结束条件,这样可缩短程序的执行时间,对不同的字循环次数不同,因此采用当型循环结构。CX=0字=0?字为负?CX←CX+1COUNT←CX字逻辑左移1位NYN开始YN结束DATASEGMENTADDRDW76A3HCOUNTDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA

START:

MOVAX,DATAMOVDS,AXMOVCX,0MOVAX,ADDRREPEAT:TESTAX,0FFFFHJZEXITJNSSHIFTINCCXSHIFT:SHLAX,1JMPREPEAT

EXIT:MOVCOUNT,CX

MOVAH,4CHINC21HCODEENDSENDSSTART例:软件延时。利用每一条指令的执行时间(用n个T表示)来构成规定时间的延时。本例通过适当设置BL的内容,来实现1s的延时。分析:采用双重循环实现延时,内循环构成根本延时单元10ms,外循环完成100*10ms的操作。SOFTDLYPROC MOVBL,100;延时100*10ms=1s,4TDELAY:MOVCX,2801;4TWAIT:LOOPWAIT;延时10ms,内循环,(17/5)T DECBL;2T JNZDELAY

温馨提示

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

评论

0/150

提交评论