汇编语言程序设计---3.ppt

上传人:asd****56 文档编号:87679422 上传时间:2023-04-16 格式:PPT 页数:98 大小:748KB
返回 下载 相关 举报
汇编语言程序设计---3.ppt_第1页
第1页 / 共98页
汇编语言程序设计---3.ppt_第2页
第2页 / 共98页
点击查看更多>>
资源描述

《汇编语言程序设计---3.ppt》由会员分享,可在线阅读,更多相关《汇编语言程序设计---3.ppt(98页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、1 主要内容1 1 MASMMASM宏汇编语言结构宏汇编语言结构2 2 MASMMASM汇编语言数据、表达式和运算符汇编语言数据、表达式和运算符3 3 伪指令伪指令 4 4 程序设计程序设计 5 5 DOSDOS功能调用功能调用 6 6 实用程序设计举例实用程序设计举例 第第4章章 汇编语言程序设计汇编语言程序设计 2一、一、MASM MASM 汇编语句结构汇编语句结构 MASM 有两种基本语句。n n指令语句(Instruction statements)l指令语句又称可执行语句,要求CPU执行某种操作。l 指令语句的格式为:标号:指令助记符 操作数 ;注释标号是该指令的符号地址,表示该指令

2、的第一个字节地址。3n n指示语句(pseude instruction statements)pseude instruction statements)l 指示词句又称伪指令,它不要求CPU执行某种操作,汇编时也不产生对应的机器代码,而仅仅告诉汇编程序,对它后面的指令语句和操作数应该如何产生机器目标代码。l伪指令的格式为:名字 伪指令定义符号 操作数 ;注释区别:伪指令名字后无冒号4二、二、MASM MASM 汇编语言数据、表达式和运算符汇编语言数据、表达式和运算符n常数l 常数是没有任何属性的纯数值。l常数分为两种类型:数值型常数字符串型常数 5数值型常数数值型常数1.二进制数:以字母B

3、结尾,如01011101B2.八进制数:以字母Q或O结尾,如723Q,211Q。3.十进制数:以字母D(或省略)结尾,如1995D,3508。4.十六进制数:以字母H结尾,如3A40H,8BH。字符型常数字符型常数用单引号括起来的字符串。如ABCD,$123456等。每个字符在机内以ASCII码存放,例如A,在内存中为41H。6n变量 变量用来定义存放在存储器单元中的数据。其三重属性为:段属性(SEG)偏移地址属性(OFFSET)类型属性(TYPE)例:例:DATA SEGMENTDATA SEGMENTFIRST DB 5AHFIRST DB 5AH SECOND DW 1122H SECO

4、ND DW 1122H DATA ENDS DATA ENDS对变量的操作:LEA AX,FIRSTMOV AL,FIRSTMOV AX,SECOND变量名:存放数据存储单元的符号地址。7n标号:给指令语句所在地址取的名字给指令语句所在地址取的名字 段段属性(属性(SEGSEG)偏移地址偏移地址属性(属性(OFFSETOFFSET)距离距离属性(属性(DistanceDistance)例:例:(隐含为隐含为NEARNEAR,可以用,可以用LABELLABEL伪指令修改。)伪指令修改。)LOPLOP:MOV AXMOV AX,00000000 JMP LOP JMP LOP8n表达式 MASM

5、MASM 允许使用的表达式分为两类:允许使用的表达式分为两类:数字数字表达式表达式 数字表达式的结果是一个数字。数字表达式的结果是一个数字。例:例:MOV DXMOV DX,(,(6*A-B6*A-B)/2 ;/2 ;(A A、B B为变量)为变量)地址表达式地址表达式 地址表达式的结果是一个存储单元的地址。地址表达式的结果是一个存储单元的地址。例:例:MOV AXMOV AX,ES:BX+SI+1000HES:BX+SI+1000H 9n运算符 MASMMASM的运算符分为六大类:的运算符分为六大类:算数运算符算数运算符 逻辑运算符逻辑运算符 关系运算符关系运算符 分析运算符分析运算符 合成

6、运算符合成运算符 其它运算符其它运算符10MASM支持的运算符运算符类型符号名称运算结果实例算术运算符+加法和减法差*乘法乘积/除法商MOD模除余数SHL左移左移后二进制数SHR右移右移后二进制数2+6=88-2=68*5=4022/5=412 MOD 3=032 MOD 6=2 0010B SHL 2=1000B1100B SHR 1=0101B11例:A1 EQU 1020+3300MOV BX,A1-1000MOV AX,35*5MOV DX,A1/100MOV CX,A1 MOD 100MOV AL,00001010B SHL 4等效于:A1 EQU 4320 MOV BX,3320

7、MOV AX,175 MOV DX,43 MOV CX,20 MOV AL,10100000B12运算符类型符号名称运算结果实例逻辑运算符NOT非运算逻辑非结果AND与运算逻辑与结果OR或运算逻辑或结果XOR异或运算 逻辑异或结果NOT 1010B=0101B1011B AND1100B=1000B1011B OR 1100B=1111B1011B XOR 1100B=0110B13运算符类型符号名称运算结果实例关系运算符EQ相等NE不等LT小于LE不大于GT大于GE不小于 6EQ11B=全06NE11B=全15LT8=全17LE101B=全06GT100B=全16GE111B=全0结果为真输

8、出全1结果为假输出全014例2:MOV AX,5 EQ 101B ADD BL,10H GT 16等效于:MOV AX,0FFFFH ADD BL,00H例1:MOV AL,NOT 10101010B MOV AL,11110000B AND 10111101B等效于:MOV AL,01010101B MOV AL,10110000B15运算符类型符号名称运算结果实例分析运算符SEG返回段基址OFFSET返回偏移地址LENGTH返回变量单元数TYPE返回元素字节数SIZE返回变量总字节数段基址偏移地址单元数字节数总字节数SEG N1=N1所在段段基址OFFSET N1=N1的偏移地址LENGT

9、H N2=N2单元数TYPE N2=N2元素字节数SIZE N2=N2总字节数16 MOV AX,SEG FIRST MOV DI,OFFSET FIRST MOV AL,TYPE FIRST ;(AL)=1 字节 MOV AL,TYPE SECOND ;(AL)=2 字 MOV BX,SEG LOP MOV SI,OFFSET LOP MOV AL,LENGTH FIRST ;(AL)=1 MOV AL,SIZE SECOND ;(AL)=2例:DATA SEGMENT LOPDATA SEGMENT LOP:MOV AXMOV AX,00000000 FIRST DB 5AH FIRST

10、DB 5AH,6BH 6BH SECOND DW 1122H JMP LOP SECOND DW 1122H JMP LOP DATA ENDS DATA ENDS 17ES:BX;DS:BLOCK运算符类型符号名称运算结果实例合成运算符PTR修改类型属性修改后类型THIS指定类型/距离属性指定后类型段寄存器名段前缀修改段HIGH分离高字节高字节LOW分离低字节低字节SHORT 短转移说明BYTE PTRBXALPHA EQU THIS BYTEHIGH 2345H=23HLOW 2345H=45HJMP SHORT LABEL18nPTR:强制类型转换例:F1 DB 15H F2 DW 31

11、32H ALPHA:MOV AL,BYTE PTR F2 JMP FAR PTR ALPHAnEQU THIS:指定类型及距离属性例:B-GAMA EQU THIS BYTE W-GAMA DW 1234H MOV AL,B-GAMA MOV AX,W-GAMA19运算符类型符号名称运算结果实例其它运算符()圆括号改变运算级优先级 方括号下标或间接寻址点运算符连接结构与变量尖括号修改变量MASK返回字段屏蔽码字段屏蔽码WIDTH返回记录宽度记录/字段位数(84)*4=16MOV AX,BXTABT1MASK CWIDTH W20运算符的优先级表优先级符号高低1234567891011LENGT

12、H,SIZE,WIDTH,MASK,(),PTR,OFFSET,SEG,YPE,THISHIGH,LOW+,(单目)*,/,MOD,SHL,SHR+,(双目)EQ,NE,LT,LE,GT,GENOTANDOR,XORSHORT21三、伪指令伪指令(指示语言)指示性语句又称伪指令,它没有对应的机器指示性语句又称伪指令,它没有对应的机器指令,不由指令,不由CPUCPU执行,而是在汇编程序汇编时执行,而是在汇编程序汇编时识别,用于说明识别,用于说明CPUCPU的类型、段结构、源程序的类型、段结构、源程序起止信息和段内存的安排等。起止信息和段内存的安排等。MASMMASM的伪指令可分为变量定义语句、符

13、号的伪指令可分为变量定义语句、符号定义语句、段定义语句、段分配语句、过程定定义语句、段定义语句、段分配语句、过程定义语句、群定义语句、结构定义语句、记录定义语句、群定义语句、结构定义语句、记录定义语句等。义语句等。22变量定义语句变量定义语句 变量定义语句用来定义字节、字或双字变量,变变量定义语句用来定义字节、字或双字变量,变量定义语句有两种不同的格式。量定义语句有两种不同的格式。格式一格式一 变量名变量名 DB/DW/DD/DF/DQ/DT DB/DW/DD/DF/DQ/DT 表达式表达式 功能:为变量分配功能:为变量分配 1 1 个字节个字节/字字/双字双字/长字长字/四四 字字/十字节的

14、存储单元,并赋值。十字节的存储单元,并赋值。23(1)用数值表达式定义变量。例如:用数值表达式定义变量。例如:K1 DB 5AH ;将5AH赋给字节变量K1K2 DW 2354H ;将2354H赋给字变量K2K3 DD 2A00 4455H ;将2A00 4455H赋给双字变量K35AH54H23H55H44H00H2AHK1K2K324(2)用字符串定义变量。例如:ONE DB “HOW ARE YOU”;将“HOW ARE YOU”字符串赋给变量ONE。TWO DW OK ;将OK字符串赋给变 量TWOHOW KOONETWO25(3)存放结果时,用(?)定义不确定值的变量ABOV DB?

15、;定义变量ABOV为不确定值的字节变量BLOW DW?;定义变量BLOW为不确定值的字变量CLER DD?;定义变量CLER为不确定值的双字变量(4)用数组表达式定义变量。例如:A1 DB 00H,11H,22H,33HA2 DW 3456H,1025H,25*25,1000/3,10A0H例:MOV AL,A13 ;(AL)=33H MOV AX,A22 ;(AX)=1025H26 格式二格式二 格式格式 2 2 用于定义重复变量,其格式为:用于定义重复变量,其格式为:DB DB DW DW DD DD DF DF DQ DQ DT DT变变量量名名n DUP(n DUP(表达式)表达式)例

16、:TAB1 DB 10 DUP(0)TAB2 DW 2 DUP(?)TAB3 DB 4 DUP(1,2 DUP(50H)27符号定义语句符号定义语句 等值语句(等值语句(EQUEQU)格式:符号格式:符号 EQU EQU 表达式表达式 功能:将表达式的值赋给功能:将表达式的值赋给EQUEQU左边的符号。表左边的符号。表达式可以是常数、变量、标号、数值或地址表达式。达式可以是常数、变量、标号、数值或地址表达式。等号语句等号语句 格式:符号格式:符号=表达式表达式 等号语句(等号语句(=)与)与EQUEQU语句有同样的功能,语句有同样的功能,区别在于区别在于等号语句定义的符号允许重新定义等号语句定

17、义的符号允许重新定义,使用更加方便灵活。,使用更加方便灵活。28【例1】ACOS EQU 1250H COUNT EQU 100 BUF EQU ACOS+1000H MOV CL,COUNT【例2】ONE=100 COUNT=100 A=ONE S=COUNT+100 A=A+10029n段定义指令段定义指令 在汇编程序设计中,需要将存储器分成若干段,在汇编程序设计中,需要将存储器分成若干段,8048680486CPUCPU访问存储器时,凭借段寄存器对各个段进访问存储器时,凭借段寄存器对各个段进行访问。通常用段定义语句(行访问。通常用段定义语句(SEGMENT/ENDSSEGMENT/END

18、S)来来定义各种类型的逻辑段。定义各种类型的逻辑段。30 格式:格式:段名段名 SEGMENTSEGMENT定位类型定位类型 ,组合类型组合类型,字长选择字长选择,类别类别 (段体)(段体)段名段名 ENDSENDS (一)完整段定义伪指令(一)完整段定义伪指令 1.1.段定义语句段定义语句31uu段名:自己选定,前后一致段名:自己选定,前后一致uu定位类型:定位类型:pPAGEPAGE:段的首地址后两位为段的首地址后两位为0000H H,页页边界开始边界开始pPARAPARA:(:(隐含)段的首地址后隐含)段的首地址后1 1位为位为0 0H H,节节边界边界pDWORDDWORD:4 4的倍

19、数的倍数pWORDWORD:偶地址偶地址 pBYTEBYTE:任一字节任一字节32u组合类型:pNONE:(隐含)与同名段不连接,独立存在。pSTACK:表明该段为堆栈段,不可缺省。pAT 表达式:表示本段可定义在表达式指示的节边界上。例:MCODE SEGMENT AT 2050H则该段的首地址为20500H。u字长选择:pUSE16:段字长为16位,最大段长为64KBpUSE32:段字长为32位,最大段长为4GBu分类名:用单引号括起,分类名相同的逻辑段存放在连续存储空间。33 2.2.段分配语句(段分配语句(ASSUMEASSUME)段分配语句用来完成段的分配,说明当前哪些逻辑段分配语句

20、用来完成段的分配,说明当前哪些逻辑段被分别定义为代码段、数据段、堆栈段和附加段。段被分别定义为代码段、数据段、堆栈段和附加段。格式:格式:ASSUME ASSUME 段寄存器:段名,段寄存器:段名,段寄存器:段名段寄存器:段名 功能:说明源程序中定义的段由哪个段寄存器去寻址。段功能:说明源程序中定义的段由哪个段寄存器去寻址。段 寄存器可以是寄存器可以是CSCS,SSSS,DSDS,ESES,FSFS或或GSGS。3.3.段寄存器的装入段寄存器的装入 ASSUMEASSUME语句只建立当段和段寄存器之间的联系,但语句只建立当段和段寄存器之间的联系,但ASSUMEASSUME语句不能将各段的段基值

21、装入各个段寄存器,段基址语句不能将各段的段基值装入各个段寄存器,段基址的装入是用程序的办法。的装入是用程序的办法。34DSDS、ESES、FSFS和和GSGS的装入的装入 DSDS、ESES、FSFS和和GSGS不能用立即数寻址方式直接装入,不能用立即数寻址方式直接装入,段基值需先送入通用寄存器,再传送给段寄存器。段基值需先送入通用寄存器,再传送给段寄存器。SSSS及及SPSP的装入:的装入:pp在段定义伪指令中,选用在段定义伪指令中,选用 “STACKSTACK”参数项,在参数项,在ASSUMEASSUME语句中,语句中,把堆栈段分配给把堆栈段分配给SSSS,则则SSSS和和SPSP自动装入

22、。自动装入。pp如未使用如未使用“STACKSTACK”参数项,则用程序实现参数项,则用程序实现SSSS和和SPSP的装入的装入例:例:MOV MOV AXAX,DATADATA MOV MOV DSDS,AXAX CSCS的装入的装入 :由起始标号确定:由起始标号确定CSCS和和IPIP35例:STACK2 SEGMENT DW 40 DUP(?)BOTTOM LABEL WORD;堆栈底的位置 STACK2 ENDS CODE SEGMENT ASSUME CS:CODE SS:STACK2START:MOV AX,STACK2 MOV SS,AX MOV SP,OFFSET BOTTOM

23、 CODE ENDS END START36例:DATA SEGMENT BCDBUF DB 22H DATA ENDS EXTRA SEGMENT BUFF DB 20 DUP(00H)EXTRA ENDS STACK SEGMENT STACK SBUFF DB 200 DUP(?)STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:EXTRA,SS:STACKSTART:MOV AX,DATA MOV DS,AX MOV AX,EXTRA MOV ES,AXCODE ENDS END START 37 (二)简化段定义伪指令(二)简化段定义

24、伪指令1.1.段次序语句(段次序语句(DOSSEGDOSSEG)格式:格式:DOSSEGDOSSEG 功能:各段在内存的顺序按功能:各段在内存的顺序按DOSDOS段次序预定排列。段次序预定排列。2.2.内存模式语句(内存模式语句(.MODELMODEL)格式:格式:MODEL MODEL 模式类型模式类型.高级语言高级语言 功能:指定数据和代码允许使用的长度。功能:指定数据和代码允许使用的长度。说明:说明:高级语言高级语言 是可选项,可用是可选项,可用C C、BASICBASIC、FORTRANFORTRAN。38n简化段定义 DOSSEGMODEL SMALL486(支持32位寄存器操作)S

25、TACK DB 200HDATA BCDBUF DB 12HCODESTART:END START39过程定义伪指令(过程定义伪指令(PROC/ENDP)在程序设计中,常把具有一定功能的程序段设计成一个子程序,又称为过程。过程定义伪指令的格式如下:过程名 PROC(NEAR/FAR)RET过程名 ENDP40其他伪指令其他伪指令1.LABEL 伪指令:用于给已定义的变量起一个别名。名称 LABLE 类型/距离2.(1)定位伪指令 定位伪指令的格式是:ORG 表达式 (2)当前位置计数器 在汇编程序时,用$表示当前的偏移地址值。DATA SEGMENT ST DB ABCDEFGH COUNT

26、EQU$-ST DATA ENDS3、END 伪指令41汇编语言的上机过程汇编语言的上机过程(用MASM进行汇编)上机步骤如下:v用编辑程序(EDIT.COM)形成汇编语言源程序(.asm文件)v用汇编程序(MASM.EXE)对源程序进行汇编,形成目标文件(.obj文件)v用连接程序(LINK.EXE)把目标文件转换成可执行文件(.exe)42上机步骤如下:一、建立扩展名为一、建立扩展名为.asm.asm的源文件程序。的源文件程序。可用任何文本编辑器编辑源文件均可。如记事本、WORDWORD、WPSWPS等,通常用DOSDOS自带的EDITEDIT编辑文件。二、用汇编程序二、用汇编程序MASM

27、MASM或或TASMTASM产生目标文件产生目标文件MASM是支持宏指令的宏汇编程序(Microsoft公司)TASM也是支持宏指令的汇编程序(Borland公司)汇编程序的汇编对象是.asm文件43汇编的结果产生的文件:汇编的结果产生的文件:.obj 文件文件,默认与源文件同名的二进制目标文,默认与源文件同名的二进制目标文件。件。.lst 文件,列表文件,此文件包括源程序和机文件,列表文件,此文件包括源程序和机器语言程序清单,以及使用的标号和变量的列器语言程序清单,以及使用的标号和变量的列表。方便查错。默认不建立。表。方便查错。默认不建立。44如果源程序有错,汇编会报告是哪类错误,有多少错,

28、其中(warning errors)为警告错误,是一般性错误,不影响.obj文件的生成。若存在严重错误(severe errors)则影响目标文件的生成,需要返回到编辑环境对源程序进行修改,直到没有错为止。MASM 的完整格式为:的完整格式为:E:MASM option source,object,listing,xref 主要主要Option参数参数 /l,/c,/zi45例:例:E:MASM TEST 只生成只生成TEST.OBJ文件文件 E:MASM TEST/L/ZI 生成生成TEST.OBJ和和TEST.LST 文件(含调试信息)文件(含调试信息)三、用LINK和TLINK程序产生.

29、EXE文件。因为.obj文件还不是可执行文件,需要经过LINK/TLINK程序处理后,才能得到可执行文件即.exe文件。格式为:LINK objectfiles ,exefile,mapfile,libfiles46 LINK有两个输出文件.exe文件和.map文件其中.map文件是连接映像文件,它给出每个段在存储器中的分配情况。四、程序的执行在DOS提示符下,直接敲入文件名,一般情况下,执行结果不可见,要用DUBUG来查看 由于汇编程序只能查出语法错误,对于程序的逻辑错误(如:算法、语句的多、少,转移是否正确等)都不能查出,因此汇编语言的正确性,通常需要通过DEBUG或TD调试程序来检验。4

30、7开始开始编辑成编辑成.ASM文件文件汇编成汇编成.OBJ文件文件有错?有错?连接成连接成.EXE文件文件NOYES调试运行调试运行有错?有错?结束结束NOYES上机过程图48加快汇编过程的方法vMASM ,;一次输入即可得到与源文件程序名相同的.obj .lst和.crf文件。vMASM 源文件名,;一次输入可得到与与源文件程序名相同的.obj 和.lst文件vMASM 源文件名;只生成同名的.obj文件49连接也有类似情况vLINK 目标文件名,;一次输入可得到同名的.exe和.map文件vLINK 目标文件名;只生成同名的.exe文件vTD*.EXE进入TD调试程序50DEBUGDEBU

31、G程序调试程序调试标志位标志位 设置设置/清除(清除(RF)溢出标志溢出标志 ov/nv 方向标志方向标志 dn(减)(减)/up(增)(增)中断允许中断允许 ei(启用)(启用)/di(禁用)(禁用)符号标志符号标志 ng(负)(负)/pl(正)(正)零零 标标 志志 zr/nz 辅助进位辅助进位 ac/na 奇偶校验奇偶校验 pe(偶校验)(偶校验)/po(奇校验)(奇校验)进位标志进位标志 cy/nc51四四、程序设计概述、程序设计概述 与高级语言程序设计类似,在用汇编语言进行程序设计时,同样应按以下步骤进行。1.分析问题,建立数学模型 2.确定算法 3.编制程序流程图 4.编制程序 5

32、.调试程序52一个源程序的基本格式如下:DATA SEGMENT DATA ENDSEXTRA SEGEMNT EXTRA ENDSSTACK1 SEGMENT PARA STACK STACK1 ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA ASSUME SS:STACK1,ES:EXTRA;存放数据项的数据段;存放数据项的附加段;堆栈段53START:MOV AX,DATA MOV DS,AX MOV AX,EXTRA MOV ES,AX MOV AH,4CH INT 21HCODE ENDS END START(核心程序段);DD装入段基址;ES装入段

33、基址;系统功能调用;返回操作系统54(一一)、顺序结构程序、顺序结构程序例1 编制程序,求下列公式中的Z值,并将结果存放到RESULT单元中。=Z(X+Y)*8-X2 设X,Y的值分别存放在VARX,VARY单元中,运算结果不超过16位。解:(1)存储单元 RESULT 用来存放结果,VARX 和 VARY 放 X、Y的值。寄存器 DX 放中间运算结果,左移 1 位相当于乘 2,右移 1 位相当于除 2,所以可以用左移 3 位得到乘以 8 的结果。55开始预置段寄存器DX XDX X+YDX右移得(X+Y)*8-X)/2RESULT DX结束DX左移3次(X+Y)*8DX (DX)-X(2)程

34、序流程图和程序如下:56DATA SEGMENT VARX DW 0006H VARX DW 0006H VARY DW 0007H VARY DW 0007H RESUL DW RESUL DW?DATA ENDSSACK1 SEGMENT PARA STACK DW 100H DUP(?)DW 100H DUP(?)SACK1 ENDSCOSEG SEGMENT ASSUME CS:COSEG,DS:DATA57 START:MOV AX,DATA MOV DS,AX;-MOV DX,VARX ;DXX ADD DX,VARY ;DX X+Y MOV CL,3 SAL DX,CL ;DX

35、(X+Y)*8 SUB DX,VARX ;DX (X+Y)*8-X SAR DX,1 ;DX (X+Y)*8-X)/2 MOV RESULT,DX;-MOV AH,4CH ;系统功能调用,返回操作系统 INT 21HCOSEG ENDS END START58(二二)、分支程序、分支程序条件转移:Jcc 目标用于程序需要进行分别处理的情况。主要使用转移指令。转移指令分为无条件转移指令无条件转移指令 和条件转移指令条件转移指令。无条件转移指令:JMP 目标在进行分支程序设计时,通常用比较、测试,或算术运算、逻辑运算影响标志位,然后选择转移指令。59例1.符号函数 y=1 x0 0 x=0-1 x

36、 0X=0X 0AL=0AL-1AL0AL1 NYNYYAL结束61DATA SEGMENT XX DB x YY DB?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX;-;-MOV AH,4CH INT 21HCODE ENDS END START62MOV AL,XX CMP AL,0 ;x-0建标志位 JGE BIGR ;x 0转移 MOV AL,-1 ;x0转移 MOV AL,0 ;x=0 JMP JUS2JUS1:MOV AL,1 ;x0JUS2:MOV YY,AL63(三三)、循环程序循

37、环程序 一个循环程序通常由以下四部分组成:n初始化部分 n循环体n修改部分n控制部分按结构又分为先判断后执行和先执行后判断循环程序常用指令:LOOP,LOOPE,LOOPNE,JCXZ64例1.计算Y=解:定义数组名TABL存放 a1a20;和存放于单元YY中。中间结果存于寄存器AX中。BX寄存器为地址指针,CX寄存器作计数器。设 a1,a2,a20是一组无符号十六位二进制数,并设其和不大于2个字节。(程序演示e4-2.asm)65DATA SEGMENTTABL DW 20 DUP(2)YY DW?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTAR

38、T:MOV AX,DATA MOV DS,AX;-;-MOV AH,4CH INT 21HCODE ENDS END START66MOVAX,0 MOV BX,OFFSET TABL MOV CX,20LOP:ADD AX,BX INC BXINC BXDEC CXJNZ LOP MOV YY,AX 修改部分LOOP LOP初始化部分循环体控制部分67(A).循环的基本结构循环的基本结构1.先执行,后判断结构流程图如右:入口初始化部分循环体修改部分循环结束?出口YN68例2.编程统计数据块中正数的个数,并将其送 RS单元中。(程序演示count.asm)解:数据块定义为 D1,RS单元存放正

39、数的个数,数据块长度用 COUNT表示。BX作地址指针,CX作计数器,DX记录正数的个数。69START预置段RBX D1 DX 0 CX COUNT BX0?DX DX+1BX BX+1 CX CX-1CX=0?RS(DX)ENDNYNY70DATA SEGMENT D1 DB -1,-3,5,7,-9,-6,8,4COUNT EQU$-D1RS DW?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX;-;-MOV AH,4CH INT 21HCODE ENDS END START补码表示:FFH表示

40、当前偏移地址.71 MOV RS,DX JUSTI:INC BX DEC CX JNZ LOP1MOV BX,OFFSET D1MOV CX,COUNTMOV DX,0LOP1:MOV AL,BX CMP AL,0JLE JUSTIINC DX如果求数据块中大于0的数之和,结果送RS单元,试修改程序.LOOP LOP1初始化部分循环体修改部分控制部分722.先判断,后执行结构流程图如右入口初始化部分循环结束?循环体修改部分出口YN73例3.AX寄存器中有一个 16位的二进制数,编程统计其中值为 1的位的个数,并将结果存于CX中。(ppt-e4-3.asm)解:由于AX有可能为 0,若AX=0则

41、不必再往下作统计工作,因此可采用先判断,后执行结构。流程图如右:74STARTCX0AX=0?AX左移CF=0?CX CX+1ENDYNYN75CODE SEGMENTASSUMECS:CODESTART:NOP;-MOVAX,1100101000111101BXORCX,CXAGAIN:CMPAX,0;建立标志位 JZNEXTSHLAX,1JNCAGAIN;判断CFINCCXJMPAGAINNEXT:NOP;-MOVAH,4CHINT21HCODE ENDSEND STARTTEST AX,0FFFFH(AND AX,AX)76(B).循环控制方式循环控制方式1.计数控制用于计数次数已知的情

42、况,可采用正计数或倒计数法。如例12.条件控制当计数次数无法确定,但循环次数与某些条件有关,并且条件可检测时,可采用条件控制,例如检测,比较或判断等形式。77例4.在一串字符串中查找某一关键字#,若查到,记下存放该关键字单元的偏移地址,若找不到用-1 作标记。解:设串变量名 STRING,关键字单元CHAR,关键字单元的偏移地址放 FLAG单元。寄存器 SI为字符串的地址指针,CX为字符串长度,AL用于放关键字#。78STARTSI STRING的EA CX 串长度 AL#SI=AL?SI=SI+1CX-1=0?FLAG -1ENDFLAG SIYNYN还可用字符串指令实现79(C).多重循环

43、多重循环循环体中又有循环称多重循环。开始循环控制条件循环体结束循环控制条件循环体80 程序设计过程中常常把多次引用的相同程序段编成一个独立的程序段,当需要只执行这个程序段时,可以用调用指令调用它。具有这种功能的程序段称为过程或子程序。(A)子程序的设计方法子程序的设计方法1、适合编成子程序的程序有以下两大类:(1)程序需要反复使用,这类程序编成子程序可避免重复编写程序,并节省大量存储空间。(2)程序具有通用性,这类程序大家都要用到,如键盘管理程序,磁盘读写程序,标准函数程序等。编成子程序后便于用户共享。(四四)、子程序子程序812、编写子程序文件 为了使用户使用方便,子程序应当以文件形式编写。

44、一般包含两部分:(1)子程序说明部分;子程序DTOB;将两位十进制数(BCD码)转换成二进制数;寄存器BX传递参数;入口参数:AL寄存器存放十进制数;出口参数:CL寄存器存放转换后的二进制数;执行时间0.06ms82(2)子程序程序部分子程序用过程定义伪指令(PROC/ENDP)定义,编写格式如下:子程序名 PROC(NEAR/FAR)RET 子程序名 ENDPNEARNEAR:当子程序和调用程序在同一代码段;:当子程序和调用程序在同一代码段;FARFAR:当子程序和调用程序不在同一代码段。当子程序和调用程序不在同一代码段。;清清0 0子程序子程序DATADATASEGMENTSEGMENT

45、BUF DB 20H DUP(?)BUF DB 20H DUP(?)DATA ENDSDATA ENDSCODE SEGMENTCODE SEGMENTASSUME CSASSUME CS:CODE,DSCODE,DS:DATADATASUSUPROC FARPROC FARPUSH DSPUSH DSMOV AX,0MOV AX,0PUSH AXPUSH AXMOV AX,DATAMOV AX,DATA MOV DS,AX MOV DS,AX;-;-;-;-RETRETSUSUENDPENDPCODE ENDSCODE ENDS END SU END SU MOV BX,OFFSET BUF

46、 MOV BX,OFFSET BUF LP:MOV BX,0LP:MOV BX,0 INC BX INC BX CMP BX,20H CMP BX,20H JNZ LP JNZ LP842.2.调用子程序时寄存器及所用存储单元内容的保护。调用子程序时寄存器及所用存储单元内容的保护。如果子程序中要用到某些寄存器或存储单元时,为了不破坏原有的信息,如果子程序中要用到某些寄存器或存储单元时,为了不破坏原有的信息,要将寄存器或存储单元的原有内容压栈保护或存入子程序不用的寄存器或存要将寄存器或存储单元的原有内容压栈保护或存入子程序不用的寄存器或存储单元中。储单元中。(B)子程序使用中的问题)子程序使用中

47、的问题 1.1.子程序的调用和返回子程序的调用和返回 主程序调用子程序主程序调用子程序 是通过是通过CALL指令来实现,子程序执行后,通过指令来实现,子程序执行后,通过RET指令返回主程序指令返回主程序3.3.子程序调用时参数的传递方法子程序调用时参数的传递方法(1)用寄存器传递)用寄存器传递(2)用堆栈传送)用堆栈传送(3)用存储单元传送。)用存储单元传送。85五、五、DOS 功能调用功能调用 为程序员编写汇编语言源程序时提供方便,MS-DOS系统中设置了几十个内部子程序,可供用户调用。调用时需要使用软中断指令:INT n 其中DOS功能子程序的调用使用中断指令“INT 21H”,它共有80

48、多个功能子程序,可完成磁盘读写控制,文件管理,存储管理,基本输入/输出管理等功能。调用功能子程序时需要用以下方式:(1)(1)传送入口参数到指定寄存器中传送入口参数到指定寄存器中(2)(2)调用的功能号送入调用的功能号送入AHAH寄存器寄存器(3)(3)INT 21HINT 21H86n键盘输入字符串键盘输入字符串(0(0A A号功能号功能)格式:格式:MOV DX,缓冲区偏移量缓冲区偏移量 MOV AH,0AH INT 21H BUF DB 30H DB?DB 30H DUP(?)MOV DX,OFFSET BUFMOV AH,0AHINT 21Hn带显示的键盘输入单字符带显示的键盘输入单字

49、符(1(1号功能号功能)格式:格式:MOV AH,01H INT 21H (AL)=输入字符的输入字符的ASCII码码n不带显示的键盘输入单字符不带显示的键盘输入单字符(8(8号功能号功能)格式:格式:MOV AH,08H INT 21H (AL)=输入字符的输入字符的ASCII码码87n直接输入直接输入/输出单字符输出单字符(6(6号功能号功能)格式:格式:MOV DL,输入输出标志输入输出标志 MOV AH,06H (DL)=0FFH,键盘输入键盘输入 INT 21H 否则否则,DL内容输出内容输出CHAR DB BB$DB 0DH DB 0AHLEA DX,CHARMOV AH,09HI

50、NT 21H(回车:0DH)(换行:0AH)n单字符显示单字符显示(2(2号功能号功能)格式:格式:MOV DL,字符字符 MOV AH,02H INT 21Hn字符串输出字符串输出(9(9号功能号功能)格式:格式:MOV DX,字符串偏移量字符串偏移量 MOV AH,09H INT 21H88n返回操作系统返回操作系统(4(4CHCH号功能号功能)格式:MOV AH,4CH INT 21H演示doscall.asm程序。89六、实用程序设计举例六、实用程序设计举例【例4-3】用变址寻址实现多个16位数加法。(E4-3.ASM)DATA SEGMENT TABLE DW 1234H,5678H

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁