微机原理课件-第4章汇编语言程序设计_第1页
 微机原理课件-第4章汇编语言程序设计_第2页
 微机原理课件-第4章汇编语言程序设计_第3页
 微机原理课件-第4章汇编语言程序设计_第4页
 微机原理课件-第4章汇编语言程序设计_第5页
已阅读5页,还剩102页未读 继续免费阅读

下载本文档

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

文档简介

第4章汇编语言程序设计12概述汇编语言的程序格式和语句分类与格式伪指令宏指令汇编语言程序设计DOS和BIOS系统功能调用汇编语言与C++语言混合编程第4章

汇编语言程序设计34.1概述4.1.1计算机语言的分类机器语言:优点:可以直接被计算机识别,执行速度快,占用内存空间少。缺点:不直观,编写、阅读和修改都很繁琐。高级语言:优点:编写、阅读和修改比较方便,通用性好。缺点:执行速度慢,占用内存空间大,汇编语言:优点:执行速度较快,占用内存空间较少,编写、阅读和修改比较方便。缺点:面向机器的语言,通用性差。44.1.2汇编语言程序的格式DATASEGMENT……DATAENDSSTACKSEGMENT……STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AX

……MOVAH,4CHINT21HCODEENDSENDSTART5例

将字符串STR中的大写字母转换为小写字母。程序代码如下:DATASEGMENTSTRDB'HELLOWORLD!$';待处理字符串LENEQU$-STR;字符串中包含的字符个数DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA;告诉汇编程序内存物理段和逻辑段之间的关系MAINPROCFAR;定义过程START:MOVAX,DATAMOVDS,AX;初始化DSMOVBX,OFFSETSTR;设置地址指针MOVCX,LEN;设置循环次数6CHECK:MOVAL,[BX];检查当前字符是否为大写字母CMPAL,'A'JBNEXTCMPAL,'Z'JANEXTADDAL,20H;大写字母转小写字母MOV[BX],AL;存储转换后的数据NEXT:INCBX;修改地址指针DECCX;修改循环次数JNZCHECKMOVDX,OFFSETSTR;字符串输出MOVAH,9INT21HMOVAH,4CH;返回DOSINT21HMAINENDPCODEENDS;代码段结束ENDSTART;程序结束7汇编语言程序具有如下特点:分段结构汇编语言程序采用分段组织的方式,示例中包含两个段,DATA和CODE,以段定义伪指令SEGMENT表示段的开始,以段定义伪指令ENDS表示段的结束。汇编语句汇编语言程序由汇编语句构成,汇编语句分为指令性语句和指示性语句,指示性语句用于告诉汇编程序如何汇编,在可执行程序中,无可执行指令与其对应,指令性语句是执行语句,汇编语言程序对应的可执行程序,有可执行指令与其对应。8汇编语言和DOS的接口为了保证程序执行后正确返回DOS,汇编语言程序提供了两种汇编语言程序和DOS的接口方法。方法一:将主程序定义成一个属性为FAR的过程,在程序的开始将INT20H指令段地址(DS的值)和偏移地址(0)压入堆栈,在程序结束时用RET(将压入堆栈的值弹出到IP和CS)结束,相当于执行INT20H指令,使程序正常结束,返回DOS方法二:用DOS功能调用。DOS功能调用中的4CH号调用,其功能是结束当前程序,返回DOS。其调用方法是在程序结束前加入以下两条指令。MOVAH,4CHINT21H9例:将键盘输入的一个小写字母用大写字母形式在屏幕上显示出来。程序代码如下:CODESEGMENTASSUMECS:CODEMAINPROCFARSTART:PUSHDSMOVAX,0PUSHAXMOVAH,1INT21HCMPAL,'a'JBOVERFLOWCMPAL,'z'JAOVERFLOWSUBAL,20HMOVDL,ALMOVAH,06HINT21HOVERFLOW:RETMAINENDPCODEENDSENDSTART104.2汇编语言的程序格式和语句分类4.2.1汇编语言的程序格式例:用汇编语言编程实现C=A+B。程序代码如下:DATASEGMENT ADB? BDB? CDB?DATAENDSSTACKSEGMENT STDB200DUP(?)STACKENDS11CODESEGMENT MAINPROCFAR ASSUMECS:CODE,DS:DATA START:PUSHDS XORAX,AX PUSHAX MOVAX,DATA MOVDS,AX MOVA,78 MOVB,-65 MOVAL,A ADDAL,B MOVC,AL RET MAINENDPCODEENDSENDSTART12对汇编语言程序结构的几点说明:汇编语言源程序采用分段结构,一个程序可以包含若干个逻辑段,最多4种类型,分别为数据段、代码段、堆栈段和附加段。程序中必须包含一个代码段,其他逻辑段可有可无,根据设计需要确定。2.对于变量的定义,即对于原始数据的设置,处理结果存储空间的预留,通常在数据段和附加段完成。3.堆栈段主要用于存放需要保护的数据,用户可以自己设置堆栈段,也可以由系统自动分配堆栈空间使用。4.在代码段中,用ASSUME伪指令指明程序逻辑段和存储器物理段之间的对应关系,在代码段的程序部分通过设置段寄存器的值,建立程序逻辑段和存储器物理段之间的对应关系。5.用END伪指令结束整个源程序。134.2.2汇编语句的分类与格式1.汇编语句的分类与格式1)指令性语句指令性语句是可执行语句,指令性语句主要是指令系统中的指令。指令性语句的格式是:[名字][指令前缀]指令助记符[操作数][;注释]2)指示性语句伪指令是指示性语句,指示性语句不是可执行语句,其功能主要是在汇编过程中告诉汇编程序如何汇编,例如如何给变量分配存储空间,程序的逻辑段与存储器物理段之间的对应关系等。指示性语句的格式是:[名字]助记符[操作数][;注释]142.格式说明1)名字指令性语句中的名字是标号,与指令前缀或者助记符以“:”间隔。指示性语句中的名字可以是变量名、段名、过程名等,与助记符之间以空格间隔。2)指令前缀对于8086/8088系统中用到的前缀主要有段超越前缀,锁定前缀和重复前缀。153)助记符指令性语句中的助记符是语句的关键字,用于指出指令的功能和操作,是指令中不能省略的部分。指示性语句中的助记符是伪指令的关键字,用于规定汇编程序完成的操作,4)操作数(1)常数在指令的地址码字段直接给出,不需要访问寄存器,也不涉及到存储器数据段的操作,在指令中只能作为源操作数。常见的常数形式有:数字型常数、字符型常数。16数字型常数:数字型常数可以是二进制数,十进制数,八进制数和十六进制数。字符型常数:是由单引号引起的一个或一串字符,如'C','ABC'等。在汇编时字符在存储器中以ASCII码存放。2)标号和变量标号可以作为转移指令、过程调用指令等的操作数,标号表征的是关联指令的地址,具有段属性、偏移属性和类型属性。变量可以作为大部分指令的操作数,变量具有段属性、偏移属性和类型属性。17例:DS1DB35H,6FHMOVAL,DS1;变量DS1的值35H送至ALMOVBX,OFFSETDS1;将变量DS1的偏移地址送至BX,;即数据35H的偏移地址送至BX3)由寻址方式给出的寄存器操作数或存储器操作数184)表达式表达式是由常数、标号、变量及各种寻址方式表示的操作数经运算符组合而成的,表达式的求值是在汇编过程中进行的。运算符算术运算符关系运算符逻辑运算符分析运算符属性运算符。19算术运算符有“+”,“-”,“*”,“/”,MOD(求余),SHL(左移)和SHR(右移)七种。算术运算执行的是整数运算,运算的结果为整数。数值表达式中7种算术运算符都可以使用地址表达式只能使用加法运算和减法运算,实现同一逻辑段的地址进行加法或减法运算。例:MOVAL,26MOD4;汇编后变为MOVAL,2MOVBH,(35*2+10)/7;汇编后变为MOVBH,1120关系运算符有“EQ”(相等),“NE”(不相等),“LT”(小于),“GT”(大于),“LE”(小于等于),“GE”(大于等于)六种。关系运算的操作对象为数值或者同一逻辑段的地址,关系运算的结果为布尔值,关系成立时,其结果为全1(8位为0FFH,16位为0FFFFH),关系不成立时,其结果为全0(0)。例:MOVBX,4EQ3;汇编后变为MOVBX,0MOVBX,4NE3;汇编后变为MOVBX,0FFFFH21逻辑运算符有逻辑非NOT,逻辑与AND,逻辑或OR,逻辑异或XOR。逻辑运算的操作对象为数值,不能对地址进行逻辑运算。例:MOVAL,0D0HAND55H;汇编后变为MOVAL,50HMOVAL,0AEHOR0AAH;汇编后变为MOVAL,0AEH22分析运算符主要用于分析操作对象的属性,操作对象可以是变量或者标号。运算符操作对象功能OFFSET变量或标号分析变量或者标号所在逻辑段的偏移地址SEG变量或标号分析变量或者标号所在逻辑段的段地址TYPE变量或标号分析变量或者标号的类型属性LENGTH变量分析变量的长度SIZE变量分析变量的大小23类型BYTE(字节)WORD(字)DWORD(双字)QWORD(8字节)TBYTE(10字节)NEARFAR类型值124810-1-2例:DATASEGMENTVARDW1234H,5678HARRAYDD12345678HSTRDB12H,34H,56H,78HDATAENDSCODESEGMENT…MOVDX,OFFSETARRAY;将ARRAY的偏移地址0004H送至DXOVAX,TYPEVAR;2(AX)MOVBX,TYPEARRAY;4(BX)MOVCX,TYPESTR;1(CX)…CODEENDS24例:DATASEGMENTFEESDW100DUP(0);LENGTHFEES=100ARRAYDW1,2,3;LENGTHARRAY=1DATAENDSCODESEGMENT…MOVAX,LENGTHFEES;100(AX)MOVBX,LENGTHARRAY;1(BX)…CODEENDS25例:已知变量上例中定义的变量,利用SIZE运算符分析变量的大小。MOVAX,SIZEFEES;200(AX)MOVBX,SIZEARRAY;2(BX)5)注释汇编语言中”;”后的内容为注释部分,注释部分可有可无,在程序设计中,清晰有序的注释可大大增加程序可读性。264.3伪指令4.3.1处理器定义伪指令格式:.微处理器名称功能:用于设定指令系统所属的CPU类型。.8086只汇编8086/8088的指令系统,可缺省.286/.286C可汇编8086/8088的指令系统和286非保护方式的指令.286P可汇编8086/8088的指令系统和286的指令系统(保护方式和非保护方式).386/.386C可汇编8086/8088的指令系统和286,386非保护方式的指令.386P可汇编8086/8088的指令系统和286,386的指令系统(保护方式和非保护方式).486/.486C可汇编8086/8088的指令系统和286,386,486非保护方式的指令.486P可汇编8086/8088的指令系统和286,386,486的指令系统(保护方式和非保护方式).586/.586C可汇编8086/8088的指令系统和286,386,486,Pentium非保护方式的指令.586P可汇编8086/8088的指令系统和286,386,486,Pentium的指令系统(保护方式和非保护方式)274.3.2模式定义伪指令格式:.MODEL存储模式[,语言类型][,操作系统类型][,堆栈类型]功能:定义程序的存储模式。TINY(微型模式)只有一个逻辑段,不大于64KBSMALL(小型模式)可以有一个代码段和一个程序段,每段不大于64KBCOMPACT(紧凑模式)可以有一个代码段(不大于64KB),多个数据段(超过64KB)MEDIUM(中型模式)可以有多个代码段(大于64KB),一个数据段(不大于64KB)LARGE(大型模式)可以有多个代码段(大于64KB)和多个数据段(大于64KB)静态数据限制在64KB内HUGE(巨型模式)可以有多个代码段(大于64KB)和多个数据段(大于64KB)静态数据不再局限于64KB内FLAT(平展模式)用于创建一个32位的程序,只能运行在32位X86CPU上。284.3.3段定义伪指令1.SEGMENT/ENDS格式:段名SEGMENT[定位类型][,组合类型][,字长选择][,类别]

…段名ENDS功能:用于定义程序中的一个逻辑段,给该逻辑段赋予一个段名,通过定位类型,组合类型,字长选择,类别等规定逻辑段的特性。292.ASSUME格式:ASSUME段寄存器:段名[,段寄存器:段名[,段寄存器:段名…]]功能:用于指明程序中的逻辑段和物理段之间的关系。ASSUME指令通常放在代码段的开始,即所有指令性指令的前面。需要注意的是ASSUME伪指令仅仅指明了程序中的逻辑段和物理段之间的关系,但是并未建立二者之间的真正联系,即没有给段寄存器赋值。304.3.3数据定义伪指令数据定义伪指令的格式:[变量名]助记符操作数,[操作数…];[注释]助记符:即数据定义伪指令,用于指明变量的类型。有下面5种字节数据定义伪指令DB(DefineByte)用于定义字节类型的变量,其后的每一个操作数分配一个存储单元,即一个字节。字数据定义伪指令DW(DefineWord)用于定义字类型的变量,其后的每一个操作数分配两个存储单元,即两个字节。双字数据定义伪指令DD(DefineDoubleWord)用于定义双字类型的变量,其后的每一个操作数分配四个存储单元,即四个字节。318字节数据定义伪指令DQ(DefineQuadword)用于定义8字节类型的变量,其后的每一个操作数分配8个存储单元,即8个字节。数据存放时,高位双字占大地址的4个存储单元,低位双字占小地址的4个存储单元,高位双字和低位双字按照双字存放原则存放。10字节数据定义伪指令DT(DefineTenbytes)用于定义10字节类型的变量,其后的每一个操作数分配10个存储单元,即10个字节。数据存放时低位字节占小地址存储单元,高位字节占大地址存储单元。32操作数:操作数是变量定义时分配的存储空间中赋予的初值,可以是常数、字符串、表达式、变量和标号等。1.操作数是一个或多个数值常量如果是多个操作数时,操作数之间用,间隔。例:D1DB12H,25H

;定义字节类型变量D1,分配两个存储单元,初值为12H,25HD2DW1234H;定义字节类型变量D2,分配两个存储单元,初值为34H,12HD3DD1A2B3C4DH;定义双字类型变量D3,分配四个存储单元,初值为4DH,3CH;2BH,1AH332.操作数是一个或者多个可求值的数值表达式例:DADB3*4,5+6*2;定义字节类型变量DA,分配两个存储单元,初值为12和173.操作数是字符串常量例:D4DB‘12’;定义字节类型变量D4,分配两个存储单元,初值为31H,32HD5DW‘12’;定义字节类型变量D5,分配两个存储单元,初值为32H,31H344.操作数部分为??可以用于DB、DW、DD类型的变量定义中,其作用是给定义的变量分配存储空间,但是不赋予初值,一般用于定义存放结果的变量。例:DA1DB?;定义字节类型变量DA1,分配1个存储单元,不赋初值DA2DD?;定义字节类型变量DA2,分配4个存储单元,不赋初值355.操作数部分为带DUP的表达式DUP表达式格式:

重复次数DUP(表达式)DUP表达式功能:

表达式重复预置,预置次数由重复次数确定例:TTADB50DUP(0);分配50个存储单元,预置初值为0TTBDW100DUP(?);分配200个存储单元,未预置初值TTCDB10DUP(‘ABC‘,0BH);分配40个存储单元,重复预置初值41H;42H,43H,0BH,重复预置10次366.操作数是地址表达式当操作数是地址表达式时,只能用DW或DD定义变量。操作数可以是变量或者标号加减常数。例:ZERODB0ONEDW1234H,5678HTWODWZERO;将变量ZERO的偏移地址赋给变量TWOTHREEDDTWO;将变量TWO的段地址和偏移地址赋给变量THREE;其中段地址为高字,偏移地址为低字FOURDBTWO-ONE;将TWO和ONE变量偏移地址的差值赋给变量FOUR374.3.5符号定义伪指令等值语句EQU格式:符号名EQU表达式功能:给EQU后的表达式赋予EQU前的符号名,在其后的编程中可以使用符号代替对应的表达式,提高程序的可读性和可维护性。例:XXEQU2010H;给常数2010H赋予一个符号名XXADSEQU[BX+80H];给地址表达式[BX+80H]赋予一个符号名ADSLODEQUMOV;给指令MOV赋予一个符号名LOD注意:利用EQU定义的符号,在未经解除前不能重复定义。382.等号语句=格式:符号名=表达式功能:等号语句的功能与EQU语句的功能完全相同,=语句与EQU语句的差别在于使用=语句定义的符号可以重复定义。例:AA=15;定义AA,AA的值为15AA=25+AA;重新定义AA,AA的值为40393.LABEL格式:名字LABEL类型功能:定义变量或标号的类型。例:DBUFFER1LABELWORDDBUFFER2DB20DUP(0)例:XX_FARLABELFARXX:MOVAX,1234H404.3.6过程定义伪指令格式:过程名PROC[NEAR/FAR]

…RET过程名ENDP41例:过程XX的定义示例,过程XX与主调程序在同一个逻辑段MYCODE。MYCODE SEGMENTXX PROCNEAR DECCX RETXX ENDPSTART: MOVCX,0FFAH

┆ CALLXX

┆MYCODE ENDS42例:过程XX的定义示例,过程XX与主调程序在不在同一个逻辑段。MYCODE1SEGMENT

…XXPROCFAR…RETXXENDP…MYCODE1ENDSMYCODE2SEGMENTCALLXX…MYCODE2ENDS434.3.8程序计数器与定位伪指令1.程序计数器$“$”表示当前位置的偏移地址。例:DATASEGMENT ADB10H,20H,30H,40H,50H;A的偏移地址为0000H,占用了5个存储单元LENGTHAEQU$-A;LENGTHA的值为0005H-0000H=0005HDATA ENDS44

2.ORG格式:ORG表达式功能:将表达式的值作为后续数据或者指令的偏移地址例:DATASEGMENT ORG200HST1 DB10H,20H,30HLENGTHEQU$-ST1ST2 DW? ORG400HST3 DW123H,456H;给变量ST3在偏移地址为400H的位置分配存储单元DATA ENDS453.EVEN格式:EVEN功能:规定后续程序或数据从偶地址开始存放。当默认地址为偶数时,不做调整,默认地址为奇数时,则偏移地址加1,指向后续的偶地址单元。例:DATASEGMENT DADB‘A’ EVEN;当前偏移地址为0001H,调整,偏移地址为0002H DBDW1234HDATAENDS464.3.9模块定义与结束伪指令1.NAME格式:NAME模块名功能:用于给源程序代码赋予一个模块名。源代码文件经汇编后的目标程序将使用NAME定义的模块名,链接时使用,如果源代码文件没有定义模块名,将使用源代码文件名进行链接。2.END格式:END[标号]功能:表示源程序到此结束。473.PUBLIC格式:PUBLIC符号[,符号…]用于说明源代码中的某个符号(标号,变量,过程名等)是公共的,PUBLIC伪指令说明的符号可以被其他模块引用。4.EXTRN格式:EXTRN符号名:类型[,符号名:类型…]EXTRN用于说明当前源代码中的某些符号是其他模块中已经用PUBLIC声明的符号。484.4宏指令1.宏指令定义格式:宏指令名MACRO[形参,…]…;宏定义体ENDM可以在源程序中调用经过定义的宏指令,调用格式:宏指令名[实参1],[实参2],…49例:试编写一个宏定义,对两个带符号字数据进行交换。EXCHANGEMACROOPRD1,OPRD2 PUSHAXPUSHDXMOVAX,OPRD1MOVDX,OPRD2 MOVOPRD2,AXMOVOPRD1,DXPOPDXPOPAXENDM50EXCHANGESI,DI在汇编时进行宏扩展,可得如下指令代码MAX_TWOSI,DI+PUSHAX+PUSHDX+MOVAX,SI+MOVDX,DI+MOVDI,AX+MOVSI,DX+POPDX+POPAX51例:将内存数据区自1000H开始的10个字节数据传送至2000H开始的存储单元。DATAMOVMACROSRC,DST,COUNT,WIDTHMOVAX,DSMOVES,AXMOVSI,SRCMOVDI,DSTMOVCX,COUNTCLDREPMOVS&WIDTHENDM52DATAMOV1000H,2000H,10,B进行宏扩展后,指令代码如下DATAMOV1000H,2000H,10,B+MOVAX,DS+MOVES,AX+MOVSI,1000H+MOVDI,2000H+MOVCX,10+CLD+REPMOVSB532.取消宏定义宏定义清除伪指令PURGE可以取消用MACRO定义的宏指令或者用EQU定义的符号。格式:PURGE宏指令名1[,宏指令名2…]544.3汇编语言程序设计4.5.1汇编语言程序设计步骤分析问题。根据实际问题抽象出其数学模型。确定算法。根据算法绘制流程图分配存储空间和工作单元编写程序并进行静态检查上机调试554.5.2顺序结构程序设计例:在内存数据区2100H单元存有2位组合BCD码,将其变成分离BCD码,低位存于2100H单元,高位存于2101H单元。分析:2100H单元存放的2位BCD码,首先将2位数分离,分离出低4位的方法,就是数据与0FH进行逻辑与运算,分离出高4位的方法,是将数据右移4位。56程序代码如下:DATASEGMENTORG2100HZBCDDB56HFBCDDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAMAINPROCFARSTART:MOVAX,DATAMOVDS,AXLEABX,ZBCDMOVAL,[BX]ANDZBCD,0FHMOVCL,4SHRAL,CLMOV[BX+1],ALMOVAH,4CHINT21HMAINENDPCODEENDSENDSTART57例:已知某班微机原理课程的成绩按照学号从小到大的顺序排列在SCOCE表格中,要查的学生学号存放在变量NO中,查找学生的成绩,将成绩存放到RESULT单元。程序代码如下:DATASEGMENTSCOREDB85,76,67,57,82,74,92,95,83,68NODB7RESULTDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAMAINPROCFARSTART:MOVAX,DATAMOVDS,AXLEABX,SCOREMOVAL,NODECALXLATMOVRESULT,ALMOVAH,4CHINT21HCODEENDSENDSTART584.5.3分支结构程序设计例:将键盘输入的一个小写字母用大写字母形式在屏幕上显示出来。程序代码如下:CODESEGMENTASSUMECS:CODEMAINPROCFARSTART:PUSHDSMOVAX,0PUSHAXMOVAH,1INT21H

CMPAL,'a'JBOVERFLOWCMPAL,'z'JAOVERFLOWSUBAL,20HMOVDL,ALMOVAH,06HINT21HOVERFLOW:RETMAINENDPENDSTART59例:内存数据区自1000H开始存放了3个带符号字节数据,将其中的最大值送至其后的RESULT单元。程序代码如下:DATASEGMENTORG1000HBUFDB13H,89H,76HRESULTDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAMAINPROCFARSTART:MOVAX,DATAMOVDS,AX60MOVBX,[1000H]MOVAL,[BX]INCBXCMPAL,[BX]JGENEXTMOVAL,[BX]NEXT:INCBXCMPAL,[BX]JGEEXITMOVAL,[BX]MOVRESULT,ALEXIT:MOVAH,4CHINT21HMAINENDPCODEENDSENDSTART61例4-34:编写程序实现符号函数的功能。1X>00X=0-1X<0Y=符号函数:程序代码如下:DATASEGMENTXDB-8YDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAMAINPROCFARSTART:MOVAX,DATAMOVDS,AX62MOVAL,XANDAL,ALJSNEGAJZZEROMOVY,1JMPEXITNEGA:MOVY,-1JMPEXITZERO:MOVY,0EXIT:MOVAH,4CHINT21HMAINENDPCODEENDSENDSTART634.5.4循环结构程序设计循环结构程序通常包含3部分:循环初始条件,循环体,循环结束条件。循环初始条件:是指循环体执行前的初始状态,通常通过初始化寄存器和存储单元来完成。循环体:循环体是循环程序的核心部分,包括循环工作部分和循环控制部分。循环结束条件:在循环程序设计中必须给出循环结束条件,控制循环的结束,不能结束的循环为死循环。64初始化循环体循环计数计数次数完成?结束YESNOLOOP型循环执行过程65初始化化始化循环条件满足?循环体结束化始化YESNOWHILE型循环执行过程66初始化化始化循环条件满足?循环体结束化始化YESNOUNTIL型循环执行过程6767例:内存数据去自1000H单元开始的10个存储单元存储的10个带符号字节数据,编程统计其中正数、负数和零的个数,并存放在其后的POSINUM,NEGNUM和ZERONUM单元中。程序代码如下:DATASEGMENTORG1000HBUFDB10H,23H,97H,0F3H,78H,94H,48H,0A0H,98H,54HCOUNTEQU$-BUFPOSINUMDB?NEGNUMDB?ZERONUMDB?DATAENDSCODESEGMENTASSUMEDS:DATA,CS:CODEMAINPROCFARSTART:PUSHDSMOVAX,0PUSHAX68MOVAX,DATAMOVDS,AXMOVBX,OFFSETBUFMOVCX,COUNTMOVAH,0MOVDX,0AGAIN:MOVAL,[BX]ANDAL,ALJZZEROJSNEGTIVEINCAHJMPNEXTNEGTIVE:INCDLJMPNEXTZERO:INCDHNEXT:INCBXLOOPAGAINMOVPOSINUM,AHMOVNEGNUM,DLMOVZERONUM,DHRETMAINENDPCODEENDSENDSTART69例:在一串给定个数的带符号字数据中寻找最大值,将最大值和最大值地址分别存放至MAX和MAXADDR存储单元。DATASEGMENTBUFDW12H,253AH,9036H,548AH,8778H,503BH,9388H,318CH,0FA43H,655BHLENEQU$-BUFMAXDW?MAXADDRDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAMAINPROCFARSTART:MOVAX,DATAMOVDS,AX70LEABX,BUFMOVCX,LENSHRCX,1MOVAX,[BX]MOVSI,BXINCBXINCBXDECCXAGAIN:CMPAX,[BX]JGENEXTMOVAX,[BX]MOVSI,BXNEXT:INCBXINCBXLOOPAGAINMOVMAX,AXMOVMAXADDR,SIMOVAH,4CHINT21HMAINENDPCODEENDSENDSTART71例:假设内存数据区自3000H开始存有一串以’$’结束的字符串,编程统计其中的'#'的个数并显示。程序代码如下:DATASEGMENT ORG3000HSTRDB'INV0&FAL2V#J76LH###TT$'DATAENDSCODESEGMENT ASSUMEDS:DATA,CS:CODE MOVAX,DATA MOVDS,AX LEASI,STR MOVBX,0

72CHECK:CMPBYTEPTR[SI],'$' JNENEXTJMPOUTPUTNEXT:CMPBYTEPTR[SI],'#'JNENEINCBXNE:INCSIJMPCHECKOUTPUT:CMPBX,10JBOP_DIGITMOVAX,BXMOVCL,10DIVCL73MOVBX,AXADDAL,30HMOVAH,6INT21HADDBH,30HMOVDL,BHMOVAH,6INT21HJMPEXITOP_DIGIT:ADDBL,30HMOVDL,BLMOVAH,6INT21HEXIT:MOVAH,4CHINT21HCODEENDS ENDSTART744.5.5过程设计与调用1.用寄存器传递参数用寄存器进行参数传递就是把参数存放于约定的寄存器中,对于带有出口参数的寄存器不能进行保护。用寄存器传递参数的方法使用方便,是一种常用的参数传递方法。75例:将上例中显示数字字符显示部分设计为过程。程序代码如下:DATASEGMENT ORG3000HSTRDB'INV0&FAL2V#J76LH###TT$'DATAENDSCODESEGMENT ASSUMEDS:DATA,CS:CODE MOVAX,DATA MOVDS,AX LEASI,STR MOVBX,0

76CHECK:CMPBYTEPTR[SI],'$' JNENEXTJMPOUTPUTNEXT:CMPBYTEPTR[SI],'#'JNENEINCBXNE:INCSIJMPCHECKOUTPUT:MOVAX,BXCMPAX,10JBONENUMMOVAX,BXMOVCL,10DIVCLMOVBX,AXCALLOP_DIGITMOVAL,BHCALLOP_DIGIT77JMPEXITONENUM:CALLOP_DIGITOP_DIGITPROCNEARADDAL,30HMOVDL,ALMOVAH,6INT21HRETOP_DIGITENDPEXIT:MOVAH,4CHINT21HCODEENDS ENDSTART782.用变量传递参数对于处在同一个源文件中的主调程序和过程可以共享一个变量,实现参数的传递;对于不在一个源文件中的主调程序和过程,利用PUBLIC/EXTERN声明后,也可以利用变量传递参数。例:已知某小组10个同学的成绩,计算10个同学的平均成绩,并将其存入AVER单元。程序代码如下:DATASEGMENT SCOREDB75,87,68,93,84,79,65,77,92,83 COUNTEQU$-SCORE AVERDB?DATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATA START:MOVAX,DATA MOVDS,AX

79CALLAVER_FUNC MOVAH,4CH INT21H AVER_FUNCPROCNEAR PUSHAX PUSHBX PUSHCX LEABX,SCORE MOVCL,COUNT MOVCH,0 XORAX,AX SCORE_ADD:ADDAL,[BX] ADCAH,0 INCBX LOOPSCORE_ADD MOVCL,COUNT DIVCL

80MOVAVER,AL POPCX POPBX POPAX RET AVER_FUNCENDPCODEENDS ENDSTART813.用堆栈传递参数由主调程序将入口参数压入堆栈,在过程中将数据从堆栈弹出,实现入口参数的传递;过程将出口参数压入堆栈,在主调程序中将数据从堆栈弹出,实现出口参数的传递。82例:已知某小组10个同学的成绩,计算10个同学的平均成绩,并将其存入AVER单元。要求参数利用堆栈传递。DATASEGMENT SCOREDB75,87,68,93,84,79,65,77,92,83 COUNTEQU$-SCORE AVERDB?DATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATA START:MOVAX,DATA MOVDS,AX MOVAX,OFFSETSCORE PUSHAX MOVAX,COUNT PUSHAX

83CALLSCORE_AVER SCORE_AVERPROCNEAR PUSHBP MOVBP,SP MOVBX,[BP+6] MOVCX,[BP+4] XORAX,AX SCORE_ADD:ADDAL,[BX] ADCAH,0 INCBX LOOPSCORE_ADD MOVCL,COUNT DIVCL MOVAVER,AL POPBP RET SCORE_AVERENDP

MOVAH,4CH INT21HCODEENDS ENDSTART844.6.1

DOS系统功能调用4.6DOS和BIOS系统功能调用设备管理类目录管理类文件管理类其他类85DOS系统功能调用一般遵循如下3个步骤:1按照DOS系统功能调用的入口参数要求送入口参数,无入口参数的忽略该步骤。2将DOS系统功能调用的子程序编号送至AH。3给出DOS子程序请求中断指令,即INT21H。861.从键盘输入一个字符并回显(1号调用)功能:等待从键盘输入一个字符,直到有键按下,有键按下后,在显示器上显示该字符,同时将该键的ASCII码送至AL。入口参数:无出口参数:键盘上按下键的ASCII码送至AL,并在显示器上显示该字符。例:MOVAH,1;功能号送AHINT21H;DOS功能调用872.从键盘输入一个字符不回显(7号调用)功能:等待从键盘输入一个字符,直到有键按下,有键按下后,将该键的ASCII码送至AL。入口参数:无出口参数:键盘上按下键的ASCII码送至AL,不在显示器上显示该字符。例:MOVAH,7;功能号送AHINT21H;DOS功能调用883.从键盘输入一个字符串(10号调用)功能:将从键盘输入的以回车结束的一串字符送至指定的存储区域。入口参数:DS:DX指向接收字符串的存储区的首存储单元,接收字符串的存储区的第一个字节存入用户设置的接收存储区可接收的最大字符数(含回车)。出口参数:将实际输入的字符串的字符个数(不含回车)存放到接收字符串存储区的第二个字节存储单元,实际输入的字符串从接收字符串存储区的第三个存储单元开始存放。89例:DATASEGMENT BUFDB20;用户设置的接收字符数DB?;预留单元,接收实际输入的字符数DB20DUP(?);预留单元,接收输入的字符串DATAENDSCODESEGMENT

… MOVAX,DATA MOVDS,AX;DS指向接收字符串存储区的首存储单元 MOVDX,OFFSETBUF MOVAH,10;子程序编号送至AH INT21H;DOS功能调用

…CODEENDS904.在显示器上显示一个字符(2号调用)功能:在显示器上显示一个字符。入口参数:将要显示的字符的ASCII码送至DL。出口参数:无。例:MOVDL,'$';入口参数设置,'$'的ASCII码送至DLMOVAH,2;子程序编号送至AHINT21H;DOS功能调用915.在显示器上显示一个字符串(9号调用)功能:在显示器上显示一个字符串(字符串必须以'$'结束,'$'不显示)。入口参数:DS:DX指向以'$'结尾的字符串的首字符对应的存储单元。出口参数:无。92例:DATASEGMENT STRDB'HelloWorld!$';以'$'结束的字符串DATAENDSCODESEGMENT…MOVAX,DATAMOVDS,AX;DS指向字符串首字符对应的存储单元MOVDX,OFFSETSTR;DX指向字符串首字符对应的存储单元MOVAH,9;子程序编号送至AHINT21H;DOS功能调用…CODEENDS936.键盘输入字符/显示器输出字符(6号调用)功能:从键盘输入一个字符或者在显示器上输出一个字符。输入功能时:入口参数:将0FFH送至DL,表示从键盘输入一个字符。出口参数:如果有键按下,ZF=0,按下字符的ASCII码送至AL寄存器;如果没有键按下,ZF=1。输出功能时:入口参数:将要输出字符的ASCII码送至DL(不能为0FFH)。出口参数:无。94例:6号调用从键盘输入一个字符MOVDL,0FFH;入口参数0FFH送至DL,表示输入功能MOVAH,6;子程序编号送AHINT21H;DOS功能调用例:6号调用在显示器上输出一个字符MOVDL,'A';入口参数设置,'A'的ASCII码送至DLMOVAH,6;子程序编号送至AHINT21H;DOS功能调用95例:从键盘输入一串小写字母,将其改为大写字母后输出。程序代码如下:DATASSEGMENTSTRING1DB'Pleaseinputsomesmallletters$'STRINGDB'THECONVERTEDLETTER:$'BUFFDB100DB?DB100DUP(?)DATASENDSCODESSEGMENTASSUMECS:CODES,DS:DATASSTART:MOVAX,DATASMOVDS,AXMOVDX,OFFSETSTRING1MOVAH,09HINT21H96MOVDX,OFFSETBUFFMOVAH,0AHINT21HMOVDX,OFFSETSTRINGMOVAH,09HINT21HMOVAH,06HXORSI,SI MOVCL,BUFF[1]L1:MOVDL,BUFF[SI+2]CMPDL,'a'JBL2CMPDL,'z'JAL2SUBDL,20HL2:INT21HINCSIDECCLJNZL1MOVAH,4CHINT21HCODESENDSENDSTART974.7.1嵌入汇编4.7汇编语言与C++语言混合编程格式如下:……/*C或C++代码*/__asm{……/*汇编语言代码*/}……/*C或C++代码*/98例:利用嵌入汇编计算十个同学高等数学成绩的最高成绩。方法一:汇编语言方案,代码如下DATASEGMENT SCOREDB87,65,78,77,84,56,93,90,66,85 COUNTEQU$-SCORE MAXDB?DATAENDSCODESEGMENT ASSUMECS:CODE,DS:D

温馨提示

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

评论

0/150

提交评论