微型计算机原理与接口技术-第4章_汇编语言程序设计_第1页
微型计算机原理与接口技术-第4章_汇编语言程序设计_第2页
微型计算机原理与接口技术-第4章_汇编语言程序设计_第3页
微型计算机原理与接口技术-第4章_汇编语言程序设计_第4页
微型计算机原理与接口技术-第4章_汇编语言程序设计_第5页
已阅读5页,还剩122页未读 继续免费阅读

下载本文档

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

文档简介

1,第4章 汇编语言程序设计,2,第4章 节 目 录,4.1 汇编语言源程序4.2 伪指令4.3 DOS功能调用4.4 汇编语言程序设计基础,章,3,第4章作业(P188): 2、7、12、15、16、17,章,4,机器语言用二进制来表示指令和数据。 B0 64 ;既不直观,又不易理解和记忆。 助记符反映指令的功能和主要特征,便于人们理解和记忆。 MOV AL,64H ; 存储器操作数及转移或调用指令,采用标号或符号来代替地址。 汇编语言用助记符、符号地址以及标号等书写程序汇编语言源程序。,4.1汇编语言源程序,5,主要的汇编程序:MASM、TASM,汇编语言源程序需翻译成机器语言,变成可执行文件,机器才能执行,这个翻译过程叫汇编。,6,汇编语言是面向具体计算机硬件的语言,和机器密切相关。它最大缺点是可读性差,编程效率低。,高级语言编程时不需要对机器指令系统有深入了解。可读性强,功能强。 为什么要用汇编语言? 节省内存,执行速度快,并为用户直接控制对象提供了手段。故实时性要求很高的程序多采用汇编语言程序。,7,4.1.1 汇编语言源程序的结构,源程序通常由一个或几个程序模块组成,每个模块包括数据段、堆栈段和若干代码段。代码段可有若干个过程,过程中的语句分为两类:,指令性语句,格式: 标号:(前缀)指令助记符 操作数;注释 指示性语句(伪指令),格式: 名字 伪指令 操作数;注释,8,这两种语句的差别: 在形式上:带不带冒号,是否可转向它。 在本质上:汇编时能否形成对应的机器码。,指令性语句是计算机可执行的,而指示性语句不能执行,用来定义变量,分配存储单元,指示程序开始和结束等。,9,汇编语言的一个实例 DATASEGMENTBLOCKDB43H, 0ABH, PDATADB20DUP(?)NDATADB20DUP(?)DATAENDSCODESEGMENTASSUME CS:CODE, DS:DATAEXP1PROCFARSTART:PUSHDSMOV AX, 0PUSHAX,4.1.2 汇编语言语句类型及格式,10,MOV AX, DATA MOV DS, AX MOV ES, AX LEA SI, BLOCK LEA DI, PDATA LEA BX, NDATA CLD MOV CX, PDATA-BLOCK GOON: LODSB TEST AL, 80H JNZ MINUS STOSB (下接右边),JMP AGAINMINUS: XCHGBX,DI STOSB XCHGBX,DIAGAIN: LOOPGOON RETEXP1 ENDPCODE ENDS END START,11,例如:MINUS: XCHG BX, DI ;交换数据 BLOCKDB43H, 0ABH ;定义数据 各部分之间至少要用一个空格作为间隔。1)名字是一个符号,它可以是标号或变量, 由英文字母、数字及专用字符组成,最大长度不能超过31个,且不能由数字打头,不能用保留字(如寄存器名,指令助记符,伪指令)。,由以上实例可知,每一语句行由4部分组成:名字 操作码操作数;注释,12,3)操作数由寄存器、存储单元、数据项或其表达式构成。汇编时一个表达式得到一个值。 4)注释用来说明程序或语句的功能,用分号“;”作为注释开始。 其中名字和注释视情况而定,可有可无。,2)操作码是一个助记符,它可以是指令、伪指令(又叫伪操作)或宏指令。,13,4.1.3 数据项及表达式,数据项包括常量、变量、标号及表达式。1、常量(1)数字常量二进制常量,以B结尾十进制常量,以D结尾或省略(汇编语言中默认无标记数为十进制数)十六进制常量,以H结尾,如0A8C6H。,14,(2)字符串常量 用单引号引起来的字符或字符串也代表常数。 例:A, BCDE,汇编时被翻译成对应的ASCII码41H和42H,43H,44H,45H。,15,变量是内存中的数据区,在程序中作为存储器操作数来使用(符号地址)。如BLOCK(在数据段中定义) 变量有三种属性: 段 值变量定义所在段的段地址 偏移量变量单元地址与段起始地址之间的位移量。 类 型字节、字和双字。,2、变量,16,3、标号: 指令语句的符号地址。,标号有三种属性:段 值这条指令代码所在段的段地址。偏移量这条指令代码地址与段起始地址之间的位移量。距 离本标号可作为段内或段间的转移特性。有两种情况:NEAR:段内转移,默认类型FAR: 段间转移,LOP1: LOOP LOP1,LOP2: JMP LOP2,17,DATA SEGMENTBLOCKDB43H,0ABH,PDATADB20DUP(?)NDATADB20DUP(?)DATA ENDS,GOON: MINUS: XCHGBX,DI STOSB JMP MINUSAGAIN: LOOPGOON,变量,标号,18,表达式是常数、寄存器、标号、变量与一些运算符组合的序列,分为数字表达式和地址表达式两种。汇编时按一定的优先规则对表达式进行计算后可得到一个数值或一个地址。下面介绍五种运算符。,4、表达式和运算符,19,(1)算术运算符+、-、*、/、MOD,MOD为求余运算符。 SHR、SHL为右移、左移运算符,算术运算符可以用于数字表达式。例: 19/7=2,19 MOD 7=5MOV AL, 2*7汇编后为B00E 算术运算符也可以用于地址表达式, 对地址运算的结果应有明确的物理意义, 例两个地址的乘或除无意义, 而加或减则可以。例: LEA SI, SUM+3,20,(2)逻辑运算符:AND、OR、XOR和NOT,只能用于数字表达式中:例:MOVCL, 36H AND 0FH 经汇编后:MOV CL, 06H,这些逻辑运算符也是8086/8088的指令助记符, 会不会造成混乱呢?例:AND DX, PORT_VAR AND 0FEH 不会的, 前者在指令执行时进行, 而后者在汇编时进行的。,21,EQ(相等),NE(不等),LT(小于),GT(大于),LE(小于或等于),GE(大于或等于)。,(3)关系运算符,关系运算符的两个操作数必须都是数字或者是同一段内的两个存储器地址。 关系为真,结果为0FFFFH; 关系为假,结果为0。,例:MOV BX, PORT_VAL GE 5 若PORT_VAL的值大于等于5,则汇编后为: MOV BX, 0FFFFH 若PORT_VAL的值小于5,则汇编后为: MOV BX, 0,22,分析和规定存储器的属性。,(4)取值运算符和属性运算符:,1)例:MOV SI,OFFSET STRI;将变量STRI1处的地址偏移量取到SI中. 注意与 MOV SI, STRI1的差别。 但它与 LEA SI, STRI1类似。,2)SEG运算符用来取存储单元的段值,例:MOVAX, SEG STRI1;将变量STRI1所MOVDS, AX;在段值取到DS中,23,若BUFFER1存储区是用如下伪指令定义的:BUFFER1 DB 100 DUP(?)则 TYPEBUFFER1等于1。,3)TYPE运算符用来取存储器单元类型,各单元类型对应值如下:,24,注意LENGTH返回的存储区必须是用复制操作符DUP( )定义的,否则返回值为1。 例:FEES DW 4, 5, 6 则 MOV CX, LENGTH FEES 汇编后, MOV CX, 1,4)LENGTH运算符用来计算一个存储区的单元数目(单元可以是字节,字或双字)的。,25,例: 若BUFFER2存储区是用如下伪指令定义的: BUFFER2 DW 200 DUP(0) 则:TYPEBUFFER2等于2LENGTHBUFFER2等于200SIZEBUFFER2等于400,5)SIZE运算符用来计算一个存储区的字节总数。SIZE(符号名) = LENGTH(符号名) * TYPE(符号名),26,6)属性运算符PTR:用来对存储单元规定类型, 通常和伪指令BYTE,WORD等连起来使用。,例:MOVBYTE PTRDI, 0 MOVWORD PTRDI, 0 而 MOVDI, 0 ;类型不定PTR也可用来对已经规定了类型进行更改。,27,(5) 其它运算符,1)方括号 :存储器操作数的偏移地址。例如:MOV AX,BX;将(BX)和(BX+1)指向的存储器两个单元的内容送AX。,2)段超越运算符“:”跟在某个段寄存器名(DS、ES、SS或CS)之后,用来指定一个存储器操作数的段属性。例如:MOV AX,ES:DI ;把ES段中由DI指向的字操作数送(AX)。,节,28,4.2 伪指令,常用的伪指令有: 数据定义伪指令 符号定义伪指令 段定义伪指令 过程定义伪指令 结束伪指令,29,4.2.1 数据定义伪指令,变量是内存中数据区的名字,故这类伪指令又可叫数据定义伪指令。这类伪指令格式为:变量名 伪指令助记符 操作数 ;注释其中变量名用符号地址表示,后面不能跟冒号,它可有可无。,30,操作数可以是常数或表达式,数据项之间用“,” 隔开,每个数据项占用伪指令规定的字节数。 注释用来说明伪指令的功能,它亦可有可无。,例1:DATA_BYTE DB 10, 5, 10H DATA_WORD DW 100H, 100, -4 DATA_DW DD 2*30, 0FFFBH,伪指令助记符有如下几种:,DB用来定义字节DW用来定义字DD用来定义双字,31,汇编后如下图所示:,DATA_BYTE DB 10, 5, 10H DATA_WORD DW 100H, 100, -4 DATA_DW DD 2*30, 0FFFBH,32,例2:操作数可以是字符串MASTERLIDBHELLO汇编后如下:,MASTERLI,H,E,L,L,O,33,操作数?用来保留存储空间,但不存入数据.例3:ABCDB0, 1, ?, ?, ? LPIDW?, 54, ?汇编后如下图示:,34,操作数字段还可以用复制操作符DUP来缩写, 如:ABCDB0, 1, ?, ?, ?ABC DB0, 1, 3 DUP(?)又如: DO-2 DB2 DUP(0, 1, 2, ?) 与DO-2 DB0, 1, 2, ?, 0, 1, 2, ? 等价,35,例:BUFFER DW 3, 4, $+3设BUFFER的偏移地址为0088H,则汇编后如下图:,在伪操作的操作数字段中若使用$,表示的是地址计数器的当前值。,36,4.2.2 符号定义伪指令,1、等值伪指令EQU格式为:符号名EQU表达式 或:新符号名 EQU 老符号名例:CONSTANT EQU 100NEW_PORT EQU PORT_VAL+1EQU伪指令在未解除前,不能重新定义。,37,2、等号(=)伪指令与EQU类似,但允许重新定义例:EMP = 7;值为7EMP = EMP+1;值为8,38,已用EQU定义的符号,可用PURGE解除,再重新定义。例:PURGENEW_PORT NEW_PORT EQU POTR_VAL+8,3、解除伪指令PURGE,39,4.2.3 段定义伪指令,与段有关的伪指令有: SEGMENT、ENDS、ASSUME、ORG 段定义伪指令的格式如下:段名 SEGMENT 定位类型 组合类型 类别段名 ENDS,方括号中为可选项,规定了逻辑段的一些其他特性。,40,1、定位类型(Align),说明如何确定逻辑段的边界。定位类型有四种:,1)PARA(Paragraph)(默认),从一个节的边界开始。16个字节称为一个节,即段的起始地址应能被16整除,2)BYTE,从字节边界开始,即可以从任何地址开始。,3)WORD,从字边界开始。即本段的起始地址必须是偶数。,4)PAGE,从页边界开始。256字节称为一页,故本段的起始物理地址应为00H。,41,这两个伪指令总是成对出现,二者前面的段名一致。二者之间的部分,对数据段、附加段及堆栈段,一般是符号、变量定义等伪指令。对于代码段则是指令及伪指令。 此外,还必须明确段和段寄存器的关系,这可由ASSUME语句来实现。,SEGMENT 和 ENDS,42,2、 连接方式(组合类型 ),在多模块程序中,告诉汇编程序本段与其它段之间如何连接。有六种:, PUBLIC,本段与其它同名同类的段连接起来,公用一个段的起点地址,形成一个物理段。, STACK,表示本段为堆栈段,连接方式为PUBLIC,连接后的起始地址在SS中。, NONE,表示本段不与任何段连接,为系统默认方式。,43, COMMON,表示本段与同名同类的段共用同一段起始地址,即相重叠,段的长度为最长段的长度。, MEMORY,表示本段在连接时定位在所有段之上,即高地址处。, AT,表示本段定位在表达式指定的段地址处。,3、 类别名,为自定义名,必须用单引号括起来。凡是类别名相同的段在连接时按先后顺序连接起来。,44,4.2.4 设定段寄存器伪指令ASSUME,ASSUME 段寄存器名:段名,段寄存器名:段名,.,告诉汇编程序用SEGMENT伪操作定义过的段的段地址将要存放在哪个段寄存器中。,把段地址装入段寄存器(称为段初始化)的操作需要由程序自己完成,45,ASSUME伪指令告知汇编程序有关段寄存器与段的关系,但并没有给段寄存器赋予实际的初值。故在下例中 MOVAX, DATA;DATA为数据段名称 MOVDS, AX MOVES, AX这些语句实现了将段基址装入段寄存器。 如程序中用到堆栈段,也需装入实际的初值。而代码段不需要用户装入,由初始化程序自动装入。,46,汇编语言的一个实例 DATASEGMENT BLOCK DB43H,0ABH, PDATA DB20DUP(?) NDATA DB20DUP(?)DATAENDSCODESEGMENTASSUME CS:CODE,DS:DATAEXP1PROCFARSTART:PUSHDSMOVAX,0PUSHAX MOV AX, DATAMOV DS, AXMOV ES, AX;装入段值LEA SI, BLOCK 。,47,4.2.5 过程定义伪指令,过程的含义和子程序是一样的,一个过程可以被其它程序所调用,过程的最后一条指令是返回指令RET。,过程定义伪指令的格式为:过程名 PROC NEAR (或:过程名PROCFAR) RET 过程名 ENDP,48,过程属性NEAR(若不指明,则默认为NEAR)表示在段内被调用。FAR属性表示可以被其它段调用。 返回指令都是RET,但两种情况下汇编时产生的代码不同,前者代码为C3H,后者代码为CBH。 调用过程的格式为: CALL 过程名,49,DELAY PROCPUSH BXPUSH CXMOV BL,2NEXT: MOV CX, 2801W10MS:LOOP W10MSDEC BLJNZ NEXTPOP CXPOP BXRETDELAY ENDP,MAIN PROCMOV BX,11HMOV CX,33HCALL DELAY NOP RETMAIN ENDP,CALL DELAY执行后,BX,CX的值是多少?,50,NAME1 PROC FAR 。 CALL NAME2 。 RETNAME2 PROC 。 RETNAME2 ENDPNAME1 ENDP,过程可以嵌套定义,51,4.2.6 宏命令伪指令,如果需要多次使用同一个程序段,可以将这个程序段定义为一个宏指令,然后在需要时,简单地用宏指令名来代替。,指令的格式为:宏命令名 MACRO 形式参数,.(宏定义体)ENDM,与C语言中的宏定义类似,52,例两个数之和的宏定义和宏调用。宏定义为:DADD MACRO X,Y,Z MOV AX,X ADD AX,Y MOV Z,AXENDM,X、Y、Z是形式参数。调用宏DADD时可写为:,DADD DATA1,DATA2,SUM,DATA1,DATA2,SUM是实际参数,由它们替换定义中的X、Y、Z。,53,此宏命令经汇编后展开的指令相当于源程序: MOV AX,DATA1 ADD AX,DATA2 MOV SUM,AX,宏调用与过程(子程序)调用有类似的地方。差别:, 宏命令伪指令由宏汇编程序MASM在汇编过程中进行处理,而调用指令CALL和返回指令RET则是运行时执行。, 宏指令简化了源程序,但不能简化目标程序,并不节省内存单元。,54,4.2.7 模块定义伪指令,模块:独立的源程序单位,在编制较大的汇编程序时,一般分成几个模块生成各自的目标程序,最后链接在一起。,模块的开始,常用伪指令NAME或TITLE为该模块定义一个名字。,模块的结尾,要加结束伪指令END,以使汇编程序结束汇编。,55,1NAME 伪指令(汇编后目标程序的名称)指令格式:NAME 模块名NAME伪指令的前面不允许再加标号,2TITLE伪指令(为程序清单指定的页标题)其格式为:TITLE 标题名,标题名最多允许60个字符。,56,3. 结束伪指令END,当汇编程序对源程序进行汇编过程中,如遇到END,得知源程序到此结束。格式为: END 标号 标号表示程序的起始地址,通常就是程序第一条指令的标号。 如果有多个模块连接在一起,则只有主模块的END语句允许使用标号。,57,汇编语言的一个实例 DATASEGMENT BLOCK DB43H,0ABH, PDATA DB20DUP(?) NDATA DB20DUP(?)DATAENDSCODESEGMENTASSUME CS:CODE,DS:DATAEXP1PROC FARSTART:PUSH DSMOV AX, 0PUSH AX,58,MOV AX, DATA MOV DS, AX MOV ES, AX;装入段值 LEA SI, BLOCK LEA DI, PDATA LEA BX, NDATA CLD MOV CX, PDATA-BLOCKGOON: LODSB ;(AL)SI TEST AL, 80H JNZ MINUS STOSB ;DI (AL) ;DI (DI)+1,JMP AGAINMINUS: XCHG BX,DI STOSB XCHG BX,DIAGAIN: LOOP GOON RETEXP1 ENDPCODE ENDS END START,59,汇编语言程序设计步骤,1、分析问题、建立数学模型 2、确定数据结构及算法3、绘制程序流程图4、内存空间、寄存器分配5、编写源程序,扩展名为ASM6、用汇编程序编译,形成目标文件, 扩展名为OBJ。7、进行连接,形成EXE可执行文件。8、对程序进行调试。,60,61,第一步:编写和输入程序 将程序输入到计算机,此程序称为源文件,为文本文件,扩展名为.ASM。因此可以用任何编辑软件输入和修改源程序。,可以使用EDIT、PE、SK等任何编辑软件将程序输入到计算机。,62,第二步:编译源程序 将源程序编译生成目标文件,扩展名为.OBJ。如源程序有错,则不能生成目标程序,根据错误提示,用编辑软件修改源程序。然后再次编译,直至生成目标文件。 可根据需要,同时产生列表文件.LST和交叉索引文件.CRF。,汇编软件有MASM、TASM、ASM等。,63,第三步:连接 将目标文件进行连接,生成可执行文件,扩展名为. EXE。,连接软件为LINK。,64,第四步:运行 运行可执行文件,查看结果是否正确,如结果不对,则需修改源程序,然后再编译、连接、运行,重复以上步骤,直到得出正确结果。可在命令行下执行,也可在调试软件环境下执行。 可以进行调试,如单步运行、设置断点、监视表达式等。,调试软件有DEBUG、TURBO DEBUGGER、CODEVIEW等。,65,一、MASM的使用(ex:tt1.asm) 1、提问方式 2、命令方式,二、LINK的使用 1、提问方式 2、命令方式,三、程序的执行 在提示符下输入可执行文件名,然后回车。,四、程序的调试 DEBUG软件的使用。,66,IDE86集成环境的使用 1、EDIT编辑软件的使用 2、COMPILE的使用 为TASM3.1汇编软件 3、LINK的使用 为Turbo Link2.0连接软件 4、DEBUG的使用,67,68,编辑软件不能改变,输入用户源文件名,扩展名ASM,69,控制参数:/zi不能改变!,输入用户源文件名,扩展名ASM,如编译产生错误,会在“error messages”显示错误指令的行号及错误类型,只有没有错误后才能产生OBJ文件,才能进行下一步“Link”的操作。,70,控制参数:/v不能改变!,输入用户文件名,扩展名OBJ,只有连接没有错误后才能产生EXE文件,才能进行下一步“Debug”的操作。,71,控制参数:/v不能改变!,输入用户文件名,扩展名EXE,72,选择“View”“CPU”,可观察寄存器和标志位。,73,寄存器,标志寄存器,存储器内容,程序及代码,74,观看存储区内容方法: 1、在“View”菜单中选“Dump” 2、右键单击存储区,在弹出菜单中,点击“Goto”。,75,在对话框中输入要查看的存储区的段寄存器及偏移地址。如es:0,见下图所示。,76,77,程序的调试方法,1、全速执行(F9,“RUN”菜单中) 2、单步执行(F7、F8 ,“RUN”菜单中) 3、设置断点(F2 ,“Breakpoints”菜单中 ) 4、观察寄存器、标志位的内容( “View”菜单中) 5、查看存储器的内容( DUMP,“View”菜单中) 6、查看运行结果(Alt+F5, “Window”菜单中),节,78,4.3 DOS系统功能调用介绍,系统软件中提供的功能调用有两种:DOS(Disk Opration System)功能调用(也称高级调用),与操作系统有关。BIOS(Basic Input and Output System)功能调用(也叫低级调用),与ROM-BIOS有关。见附录D、E用户程序在调用这些系统服务程序时,不是用CALL 命令,而是采用软中断指令INT n来实现。,DOS系统功能调用都是用软中断指令INT 21H来实现的。,79,INT 2lH功能大致可以分为四个方面:设备管理、目录管理、文件管理和其它。,DOS系统功能调用的使用方法如下:AH功能号;在其它寄存器中放入该功能所要求的入口参数;执行INT 21H指令;分析出口参数(取结果)。,以下介绍INT 21H的几个最常用的功能。,80,数据输入和输出只介绍键盘输入和显示输出,调用系统功能需要提供入口参数及所调用的功能号,调用结束返回结果。,1. DOS键盘输入功能调用,(1) 单字符输入并回显在屏幕上入口参数:AH=01;功能调用号返回参数:AL=输入字符的ASCII码中断: INT 21H,81,例:在交互式程序中需用户对一个提示做出应答。 GET_KEY:MOVAH, 1;等待键入字符 INT21H;结果在AL中CMPAL,Y ;是Y? JZ YES ;是,转YES CMPAL,N ;是N? JZ NO ;是,转NO JNZGET_KEY;其它键返回,继续 ;等待输入 YES: NO: ,82,(2) 输入字符串 此功能调用能从键盘输入一串字符并把它 存入用户定义的缓冲区。 入口参数:AH=0AH DS:DX=输入字符串在内存中的首地址 中断号:21H,83,若用户键入的字符数(包括回车符)大于定义的N1,机器铃响,且光标不再向右移动, N2由中断调用程序自动填入。例:设在数据段定义: STR1 DB 10,?,10 DUP(?) 调用DOS功能的0AH号功能的程序段: LEA DX,STR1 MOV AH,0AH INT 21H,84,2. DOS显示功能调用,(1) 显示一个字符入口参数:AH=02(或06) DL=字符(用ASCII码表示)中断号: 21H例:有如下程序段MOV AH, 02MOV DL, 41H ;代表显示字母AINT21H,85,入口参数:AH=09 DS:DX=字符串地址 中断号: 21H 被显示的字符串必须以$结束,且所显示的内容不应出现非可见的ASCII码,否则产生不可预料的结果。,(2)显示字符串,86,例: 显示字符串。DATA SEGMENTMESS1 DB Input String: , 0DH, 0AH, $DATA ENDS MOVAH, 09 MOVDX, OFFSET MESS1 INT21H,87,入口参数:AH=4CH 中断号: 21H MOV AH,4CH ; 或 MOV AX,4C00H INT 21H,(3)返回DOS,节,88,4.4 汇编语言程序设计基础,一、程序设计步骤,二、汇编程序基本结构:,89,三、顺序结构程序设计,例4-14 对于三个无符号数86H、34H、21H,编写86H * 34H - 21H的程序。,解决问题的关键: 1、定义字节型变量 2、定义存放结果的内存单元,为字单元 3、无符号数、乘法指令,90,DATA SEGMENT NUM DB 86H,34H,21H RESULT DW ?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX LEA SI,NUM LEA DI,RESULT MOV AL,SI MOV BL,SI+1 MUL BL,MOV BL,SI+2 MOV BH,0 SUB AX,BX MOV DI,AX MOV AH,4CH INT 21HCODE ENDSEND START,数据区定义,无符号乘法,做减法,存结果,86H * 34H - 21H,91,例4-15 内存自TABLE开始的连续16个单元中存放着015的平方值,查表求DATA中任意数X的平方值,将结果放在RESULT中。,DSEG SEGMENT TABLE1 DB 0,1,4,9,16, 25,36,49,64,81,100,121,144,169,196,225 DATA DB ? RESULT DB ?DSEG ENDSSSEG SEGMENT STACK STACK DB 100 DUP(?)SSEG ENDS,CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG, SS:SSEGBEGIN:MOV AX,DATA MOV DS,AX MOV AX,SSEG MOV SS,AX LEA BX,TABLE1 MOV AH,0 MOV AL,DATA ADD BX,AX MOV AL,BX MOV RESULT,ALCSEG ENDSEND BEGIN,数据区定义,查表、存结果,92,四、分支程序设计,根据上条指令的运算结果,利用条件转移指令改变程序执行的顺序。,例4-16 将数据区中以字节变量BUFFER为首地址的100 个单元清0。,93,DATA SEGMENT BUFFER DB 100 DUP(?) COUNT DB 100DATA ENDSSTACK SEGMENT DW 32 DUP(?)STACK ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX,MOV CL,COUNT LEA BX,BUFFERAGAIN:MOV BX,0 INC BX CMP BX,COUNT JB AGAINCODE ENDSEND START,?,数据区定义,指定存储区清0,94,例4-17 在DATA1开始的80个单元中,存放80位同学的成绩(0100),试统计=90、80-89、 70-79、60-69以及60的人数。结果存放在DATA2开始的单元中。,4.4 汇编语言程序设计基础,95,DATA SEGMENT DATA1 DB 80 DUP(?) DATA2 DB 5 DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV CX,80 LEA SI,DATA1 LEA DI,DATA2AGAIN:MOV AL,SI CMP AL,90 JC NEXT1 INC BYTE PTRDI JMP STO,NEXT1:CMP AL,80 JC NEXT2 INC BYTE PTRDI+1 JMP STONEXT2:CMP AL,70 JC NEXT3 INC BYTE PTRDI+2 JMP STONEXT3:CMP AL,60 JC NEXT4 INC BYTE PTRDI+3 JMP STONEXT4:INC BYTE PTRDI+4 STO:INC SI LOOP AGAIN MOV AH,4CH INT 21H CODE ENDS END START,不及格加1,96,五、 循环程序,循环程序为重复执行某一指令段,它可以简化程序,减少占用内存空间,但不会减少执行时间。,97,(1)初始化:循环计数器初值设置,设定变量初值和存放数据的内存地址初值等; (2)循环体:这是程序的处理部分; (3)循环控制:包括修改变量和修改指针,为下一次循环做准备,修改计数器值,判断循环次数到了没有 (4)结束处理:用来分析和存放程序的结果。,循环程序包括初始化、循环体、循环控制和循环结束处理4部分。,98,例4-18 把MEM单元开始的100个16位无符号数按从大到小的顺序排列。,分析: 1、了解排序的两种方法:冒泡法、选择法 2、二重循环,99,DSEG SEGMENT MEM DW 100 DUP(?)DSEG ENDSCODE SEGMENTASSUME CS:CODE,DS:DSEGSTART:MOV AX,DSEG MOV DS,AX LEA DI,MEM MOV BL,99NEXT1:MOV SI,DI MOV CL,BLNEXT2:MOV AX,SI ADD SI,2 CMP AX,SI JNC NEXT3,MOV DX,SI MOV SI-2,DX MOV SI,AXNEXT3:DEC CL JNZ NEXT2 DEC BL JNZ NEXT1 MOV AH,4CH INT 21HCODE ENDSEND START,100,六、子程序,101,1、子程序的调用与返回,子程序的调用指令:CALL子程序的返回指令:RET,2、子程序设计中应注意的问题,(1)现场保护与恢复:堆栈指令的使用。,(2)参数传递:主程序与子程序之间数据的传递。,(3)子程序说明。,3、子程序的调用技巧,(1)子程序嵌套 (2)子程序递归调用,102,从一个字符串中删去一个字符(用堆栈传递参数),DATA SEGMENT STRING DB EXXPERIENCE LENGTH1 DW $ - STRING KEY DB XDATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATAMAIN PROC FARSTART:MOV AX,DATA MOV DS,AX MOV ES,AX LEA BX,STRING LEA CX,LENGTH1 PUSH BX PUSH CX MOV AL,KEY CALL DELCHAR MOV AH,4CH INT 21HMAIN ENDP,DELCHAR PROC PUSH BP MOV BP,SP PUSH SI PUSH DI PUSH CX CLD MOV SI,BP+4 MOV CX,SI MOV DI,BP+6 REPNE SCASB JNE DONE MOV SI,BP+4 DEC WORD PTRSI MOV SI,DI DEC DI REP MOVSBDONE:POP CX,103,POP DI POP SI POP BP RET 4 ;恢复到原来栈底DELCHAR ENDPCODE ENDSEND START,104,设一个字符串长度不超过255,试确定该字符串的长度,并显示长度值。 判断字符串结束的方法: 1、有无回车符号(0DH) 2、$符号,DATA SEGMENT STRING DB This is a string,0DH LENG DW ? CR DB 13 MESSAGE DB The string is too long,0Dh,0Ah,$DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATAMAIN PROC FARSTART:MOV AX,DATA MOV DS,AX CALL STRLEN;返回字符串长度 MOV DX, LENG CMP DX,100H JB NEXT1 LEA DX,MESSAGE MOV AH,9 INT 21H,JMP NEXT2NEXT1:MOV DH,DL MOV CL,4 SHR DL,CL CMP DL,9 JBE LP ADD DL,7 LP: ADD DL,30H MOV AH, 2; INT 21H MOV DL,DH AND DL,0FH CMP DL,9 JBE LP1 ADD DL,7 LP1: ADD DL,30H MOV AH, 2 ; INT 21H MOV DL,H MOV AH,2 ; INT 21H,105,NEXT2: MOV AH,4CH INT 21HMAIN ENDPSTRL

温馨提示

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

评论

0/150

提交评论