04第四章汇编程序设计基础(自).ppt

上传人:小飞机 文档编号:5395829 上传时间:2023-07-03 格式:PPT 页数:91 大小:2.50MB
返回 下载 相关 举报
04第四章汇编程序设计基础(自).ppt_第1页
第1页 / 共91页
04第四章汇编程序设计基础(自).ppt_第2页
第2页 / 共91页
04第四章汇编程序设计基础(自).ppt_第3页
第3页 / 共91页
04第四章汇编程序设计基础(自).ppt_第4页
第4页 / 共91页
04第四章汇编程序设计基础(自).ppt_第5页
第5页 / 共91页
点击查看更多>>
资源描述

《04第四章汇编程序设计基础(自).ppt》由会员分享,可在线阅读,更多相关《04第四章汇编程序设计基础(自).ppt(91页珍藏版)》请在三一办公上搜索。

1、【本章主要内容】,汇编语言基础 汇编语言程序结构框架 汇编语言程序设计方法 汇编程序的开发过程,第4章汇编程序设计基础(自学),4.1 汇编语言基础,第4章汇编程序设计基础,4.1.1 概述,汇编语言是一种面向机器结构的低级程序设计语言,汇编语言程序是将机器指令组成的机器语言程序“符号化”,它同机器语言的目标代码一一对应。汇编语设计程序设计能充分发挥机器硬件的性能,提高计算机的运行效率,汇编语言比机器语言易于辨认、维护和修改。,第4章汇编程序设计基础,4.1.2 汇编语言语句种类与格式,指令语句 每条指令语句经编译后都要产生一条可执行的目标代码(机器指令),所以这种语句属于可执行语句。,例如:

2、MOV AX,32H AND BX,01010111B,第4章汇编程序设计基础,伪指令语句 指示汇编程序如何编译源程序,伪指令不产生目标代码。,例如:ORG 100H,宏指令语句 用户定义的新指令,用于替代源程序中一段有独立功能的程序。,第4章汇编程序设计基础,1.语句格式,标号:指令助记符 操作数;注释,指令的符号地址,指明该指令的功能,若有多个操作数用“,”隔开,起说明作用的字符串,第4章汇编程序设计基础,标号的命名规则:,字符个数为131个。,第一个字符不能是数字,可以使用字母或点号.、$、?和下划线_;从第二个字符开始,可以是字符、数字和特殊字符。,不能与系统专用的保留字相同,第4章汇

3、编程序设计基础,4.1.3 汇编语言数据和表达式,1.常量,数值常量 例如:25D、80H、101001B、45,字符串常量 例如:2、A、”Computer”,第4章汇编程序设计基础,符号常量 用一个符号来代表常。,1)等值伪指令EQU,格式:符号 EQU 表达式,例如:S1 EQU ABCD N EQU 12 NUM EQU 23+25+N ADR1 EQU DS:BP+14H,第4章汇编程序设计基础,2)等号伪指令=,格式:符号=表达式,例如:NUM=10H,伪指令(EQU)和伪指令(=)的区别是:在同一源程序中,同一符号不能用EQU伪指令重新定义,“=”可以。,第4章汇编程序设计基础,

4、2.变量,变量是指存放在存储单元中的数据,这些数据在程序运行过程中可以改变。,(1)数据定义伪指令,可选,是分配的存储单元的符号地址,按字节(DB)、字(DW)和双字(DD)分配内存单元,设定变量的初值,第4章汇编程序设计基础,1)数值表达式 VARB1 DB 10H VARB2 DB 20H,30H,40H VARW DW 1122H,3344H,上述变量的存储单元分配及初始化情况如右图所示。,第4章汇编程序设计基础,2)字符串表达式 STR1 DB ABCD STR2 DW AB,C,上述变量的存储单元分配及初始化情况如右图所示。,第4章汇编程序设计基础,3)“?”表达式 STR1 DB?

5、,?,4)DUP表达式,在连续的存储单元中重复定义一组数据。,例如:NUM1 DB 20H DUP(5)NUM2 DW 10H DUP(?),第4章汇编程序设计基础,4.运算符与表达式,(1)算术运算符 参见下表。,第4章汇编程序设计基础,第4章汇编程序设计基础,(2)逻辑运算符,第4章汇编程序设计基础,(3)关系运算符,第4章汇编程序设计基础,(4)数值返回运算符,1)SEG和OFFSET运算符 SEG:取变量或标号所在段的段基值;OFFSET:取变量名或标号所在段内的偏移量。,例如:MOV AX,SEG VAR1 MOV SI,OFFSET VAR3,第4章汇编程序设计基础,(5)属性运算

6、符,1)PTR运算符 格式:类型 PTR 地址表达式,第4章汇编程序设计基础,源程序的基本结构框架,8086/8088汇编程序采用分段结构,一个完整的源程序可以包含多个逻辑段,但当前段最多只能有4个:数据段、堆栈段、附加段和代码段。,4.2.1 段定义,段名 SEGMENT 定位类型 组合类型 类别名 段名 ENDS,第4章汇编程序设计基础,例如:Data1 Segment DB?,10H V1 DB 20H Data1 Ends,第4章汇编程序设计基础,4.2.2 段寻址伪指令(ASSUME),段寻址伪指令用来建立段与段寄存器之间的联系。,格式:ASSUME 段寄存器名:段名,段寄存器名:段

7、名,,例如:,第4章汇编程序设计基础,DATA1SEGMENT;定义段DATA1 VAR1 DB 12HDATA1ENDS;DATA1段定义结束DATA2SEGMENT;定义段DATA2 VAR2 DB 34HDATA2ENDS;DATA2段定义结束CODE SEGMENT VAR3 DB 56H ASSUME CS:CODE,DS:DATA1,第4章汇编程序设计基础,4.2.3 END伪指令,格式:END 地址表达式,4.2.4 段寄存器的装入,1.DS和ES的装入,在指令中直接引用段名时,得到的是这个段的段基值,这个段基值是16位的立即数。,第4章汇编程序设计基础,例如:CODE SEGM

8、ENT ASSUME CS:CODE,DS:DATA1,ES:DATA2START:MOV AX,DATA1;设置DS MOV DS,AX MOV AX,DATA2;设置ES MOV ES,AX,第4章汇编程序设计基础,2.SS的装入,(1)自动装入,Stack1 Segment Para Stack Dw 20H dup(?)Stack1 Ends,code Segment Assume code:CS,Stack1:SS,第4章汇编程序设计基础,(2)执行程序装入,Stack1 Segment Dw 20H dup(?)Stack1 Ends,code Segment Assume cod

9、e:CS,Stack1:SS Mov AX,Stack1 Mov SS,AX,第4章汇编程序设计基础,2.CS的装入,CS和IP控制程序的执行流程。装载目标代码时自动将CS和IP初始化为程序将要执行的第一条指令的段基值和偏移量,它们由END伪指令提供。如果END伪指令没有指定地址表达式,则源程序中第一条指令语句的地址作为程序执行的起始地址。,基本框架,STATCKSEGMENT STACK;定义堆栈段.STACKENDSDATASEGMENT;定义数据段DATAENDSCODESEGMENT;定义代码段ASSUME CS:CODE,DS:DATA,SS:STATCK;仅告诉汇编程序,并不能赋值

10、START:MOV AX,DATAMOV DS,AX.MOV AH,4CH;程序结束 返回DOSINT 21HCODEENDSEND START,(X+125-X*Y)/Z,STATCKSEGMENT STACK DW 100H DUP(?)STACKENDSDATSEGMENTX DW 3Y DW 4Z DW 10DATENDSCODSEGMENTASSUME CS:COD,DS:DAT,SS:STACKSTART:MOV AX,DATMOV DS,AXMOV AX,XIMUL YMOV CX,AXMOV BX,DXMOV AX,XADD AX,125CWD,SUB AX,CXSBB DX,

11、BXIDIV ZMOV X,AXMOV Y,DXMOV AH,4CHINT 21HCOD ENDSEND START,第4章汇编程序设计基础,1、返回DOS系统的方式,Mov AH,4CH Int 21H,2、从键盘接收一串字符,MOV AH,0AHINT 21H;DS:DX:缓冲区可接收的字符 缓冲区,4.3 系统功能调用,第4章汇编程序设计基础,3、显示一个字符,MOV DL,41H;A的ASCII MOV AH,2 INT 21H,4、从键盘接收一串字符,MOV AH,0AHINT 21H;DS:DX:缓冲区可接收的字符 缓冲区,第4章汇编程序设计基础,4.3 其它伪指令,过程定义伪指令

12、,格式:过程名 PROC NEAR/FAR Ret 过程名 ENDP,第4章汇编程序设计基础,ORG伪指令,格式:ORG 数值表达式 将表达式的值赋给当前位置计数器,符号“$”就代表当前位置计数器。例:,第4章汇编程序设计基础,DATA SEGMENT;定义段DATA ORG 30H VAB1 DB 12H,34H ORG$+20H STR DB STRING DATA ENDS,第4章汇编程序设计基础,4.4 汇编程序设计方法 概述,1.程序设计步骤,(1)分析问题,确定算法,(2)绘制程序流程图,(3)编写程序,(4)调试程序,第4章汇编程序设计基础,顺序程序的设计,例 4-1 试编制程序

13、,计算:Z=(3X+Y-5)/2 其中 X=15H Y=10H,DATA Segment;数据段 X DW 15H Y DW 10H Z DW?DATA Ends,第4章汇编程序设计基础,CODE Segment;代码段 Assume CS:CODE,DS:DATAStart:Mov AX,DATA Mov DS,AX;初始化DS Mov AX,X Shl AX,1;AX2X Add AX,X;AX3X,第4章汇编程序设计基础,Add AX,Y;AX3X+Y Sub AX,5;AX3X+Y-5 Sar AX,1;AX(3X+Y-5)/2 Mov Z,AX;存放结果 Mov AH,4CH Int

14、 21H;返回DOSCODE Ends End Start,第4章汇编程序设计基础,4.4.3 分支程序设计,在汇编语言中分支程序主要是通过转移指令来实现。,1.转移指令,(1)无条件转移指令,功能:无条件转移到“目标地址”处执行。,指令格式:JMP 目标地址,例如:jmp Label1 jmp BX,第4章汇编程序设计基础,(2)条件转移指令,功能:条件成立时转移到“目标地址”处执行。,指令格式:JXX 目标地址,XX为1-3个字母表示的转移条件,说明:条件转移指令只能在段内转移,转移范围只能在-128127之间。,条件:S SF(符号标志)C CF(进位标志),第4章汇编程序设计基础,Z

15、ZF(零标志)N NOT A Above L Less E Equal G-Great,例如:JZ Lab1 JNZ Lab2,第4章汇编程序设计基础,2.分支程序的设计,条件,Y,N,条件,图4.4-3 分支程序结构形式,第4章汇编程序设计基础,1条件转移指令实现分支程序,例2 编制程序,把DA1字节单元中数据变成偶数。,TEST DA1,01H JZ NEXT;是偶数,转移 INC DA1;是奇数,加1NEXT:,第4章汇编程序设计基础,例3 设X、Y为带符号的字节变量,编程实现下面的公式。,CMP X,0;比较X与0进行比较JGE BIGER;X0,转移到BIGERMOV Y,-1;X0

16、,Y置-1JMP NEXT,第4章汇编程序设计基础,BIGER:JZ EQUL;X=0,转移EQUL MOV Y,1;X0,Y置1 JMP NEXTEQUL:MOV Y,0;Y置0NEXT:,第4章汇编程序设计基础,2用跳转表实现多路分支 对于多分支结构通常采用跳转表来实现。,例4 现有若干个程序段,每个程序段的入口地址分别是Sub1、Sub2、Subn,试编制一程序,根据指定的参数转入相应的程序段。,DATA SEGMENT;定义数据段JUMP_TABLE DW SUB1,SUB2,SUB3 DW SUB4,SUB5 PARAM DB 3DATA ENDS;数据段结束,第4章汇编程序设计基础

17、,STACK1SEGMENT STACK;定义堆栈段 DW 20H DUP(0)STACK1ENDS;堆栈段结束,CODESEGMENT;定义代码段 ASSUME CS:CODE,DS:DATA,SS:STACK1BEGIN:MOVAX,DATA;取DATA段的段基值 MOV DS,AX;初始化段寄存器DSXOR AH,AH;寄存器AH清0,第4章汇编程序设计基础,MOV AL,PARAM;参数PARAM送ALDEC AL;AL(AL)-1SHL AL,1;AL(AL)*2LEA BX,JUMP_TABLE;取跳转表首址ADD BX,AXJMP BX;转移到对应分支SUB1:JMP END0S

18、UB2:JMP END0,第4章汇编程序设计基础,END0:MOVAH,4CH;返回DOS INT 21HCODE ENDS END BEGIN,第4章汇编程序设计基础,循环程序设计,1循环控制指令,(1)LOOP指令 格式:LOOP 目标地址 功能:首先将CX内容减1,若(CX)0,则转至目标地址处执循环,否则顺序执行。例如:,Loop1:Loop Loop1,条件:(CX)0,,否则,第4章汇编程序设计基础,例6 计算1+2+3+100的和。,MOV CX,100;设置循环次数 MOV AX,0;AX保存计算结果L1:ADD AX,CX LOOP L1,第4章汇编程序设计基础,(1)LOO

19、PZ/LOOPE指令 格式:LOOPZ/LOOPE 目标地址 功能:首先将CX内容减1,若(CX)0且ZF=1,则转至目标地址处执循环,否则顺序执行。例如:,Loop1:Loopz Loop1,条件:(CX)0且ZF=1,,否则,第4章汇编程序设计基础,例7 编程实现在字符串中查找第一个非空字符,并将其在字符串中的位置送入INDEX单元。,STR DB“THIS IS A TEST.”LEN EQU$-STR MOV CX,LEN;设置循环次数 MOV BX,-1;地址指针初值 NEXT:INC BX CMP STRBX,20H;判断是否为空字符,第4章汇编程序设计基础,LOOPE NEXT;

20、空字符且CX0,继续循环 JNE FOUND;找到非空字符 JMP NONFOUND;未找到非空字符 FOUND:JMP END0NONFOUND:JMP END0,第4章汇编程序设计基础,(3)LOOPNZ/LOOPNE指令 格式:LOOPNZ/LOOPNE 目标地址 功能:首先将CX内容减1,若(CX)0且ZF=0,则转至目标地址处执循环,否则顺序执行。例如:,Loop1:Loopz Loop1,条件:(CX)0且ZF=0,,否则,第4章汇编程序设计基础,2 循环程序结构,第4章汇编程序设计基础,初始化部分,工作部分,修改部分,结束处理部分,循环结束?,图4.4-9(b)先判断后执行,N,

21、Y,第4章汇编程序设计基础,3单重循环程序设计,(1)计数控制循环 即用CX的值来控制循环次数,常用于循环次数已知的情况。每循环一次,计数器计数一次,直到计数器达到预定值(CX)=0,循环结束。,(2)条件控制循环 循环次数无法事先确定,只能用“条件”来控制循环。每循环一次,便对条件进行检测,若满足终止循环的条件,便结束循环,否则继续循环。,第4章汇编程序设计基础,4多重循环程序设计 多重循环结构是指循环程序的循环体中又包含了另一个循环,即循环的嵌套。,在编制多重循环程序时,首先要分清内外循环的任务和要求,接着划分内外循环中有规律变化的参数,如哪些是内循环的地址指针、计数器,哪些是外循环的地址

22、指针、计数器。然后分别确定内外循环的控制方法和具体实施。注意:内外循环都要修改CX寄存器的内容。,第4章汇编程序设计基础,子程序设计,在程序设计使用子程序可减少重复编写程序,缩短目标代码,节省内存空间,便于阅读程序。在汇编语言中子程序是以“过程”的形式出现的。,第4章汇编程序设计基础,1.过程定义伪指令 格式:过程名 Proc Near/Far Ret 过程名 Endp 过程定义必在一个逻辑段内。,Code1 Segment p1 Proc p1 Endp P2 Proc Far p2 endpCode Ends,第4章汇编程序设计基础,2.子程序调用与 调用格式:Call 子程序入口地址 返

23、回格式:Ret n(其中n是偶数),第4章汇编程序设计基础,在编写子程序时,应满足下面的基本要求:1适度地划分并确定子程序功能 2选择适当的参量传递途径 3信息的保存 4清晰的子程序文本,4子程序与主程序的参数传递和设计举例,第4章汇编程序设计基础,(1)通过寄存器传递参量,例12 设在数据段中有一数组,数组中元素为字类型。试编制程序,用减奇数法对数组中各个数据逐一开平方,并把结果依次存入字节数组PFG中。,DATA SEGMENT DA1 DW 1234H,5678H,3456H COUNT EQU($-DA1)/2 PFG DB COUNT DUP(0)DATA ENDS,第4章汇编程序设

24、计基础,DATA SEGMENT DA1 DW 1234H,5678H,3456H COUNT EQU($-DA1)/2 PFG DB COUNT DUP(0)DATA ENDS,STACK1 SEGMENT PARA STACK DW 20H DUP(0)STACK1 ENDS,第4章汇编程序设计基础,CODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK1START:MOV AX,DATA MOV DS,AX MOV CX,COUNT;循环计数器初值 LEA SI,DA1 LEA DI,PFG LOP:MOV AX,SI;取被开方数,第4章汇编程序设计基础,

25、PUSH CX;保存循环计数器CALL SQR_PROC;调用子程序MOV DI,CL;存平方根POP CX;恢复循环计数器ADD SI,2;修改地址指针INC DILOOP LOPMOV AH,4CHINT 21H,第4章汇编程序设计基础,;子程序SQR_PROC:开平方;入口参数:;(AX)为被开方数;(CL)为开方结果SQR_PROC PROC;开平方子程序 MOV CL,0;开平方计数器CL0 MOV DX,1;奇数1,第4章汇编程序设计基础,SQR:SUB AX,DX;减奇数 JB EXIT0;不够减,转移 INC CL;够减,计数 ADD DX,2;形成下一个奇数 JMP SQR

26、EXIT0:RET;子程序返回 SQR_PROC ENDPCODE ENDS END START,第4章汇编程序设计基础,(2)通过堆栈传递参数 将要传递的参数放在寄存器中,主程序和子程序通过对堆栈的访问取得所需的参数。(3)用存储单元传递参数,4子程序嵌套与递归调用,(1)子程序嵌套 即一个子程可以调用另外一个子程序。,第4章汇编程序设计基础,2子程序递归调用 一个子程序直接或间接调用自己,叫递归调用。递归调用是子程序嵌套的特例,在某些应用场合它是很有用的程序设计技术。,例14 子程序递归调用示例(计算N!)。,第4章汇编程序设计基础,DATASEGMENT N DW 6 M DW?DATA

27、 ENDSSTK1 SEGMENT STACKDW 40H DUP(0)STK1 ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STK1START:,第4章汇编程序设计基础,MOV AX,DATA MOV DS,AX MOV AX,N CALL FACT;调用子程序 MOV AH,4CH INT 21H;返回DOS,第4章汇编程序设计基础,FACT PROCCMP AX,1JNE NEXT;不等于1 MOV M,1 JMP EXIT0 NEXT:PUSH AX;压栈 DEC AX CALL FACT;递归调用 POP AX MUL M,第4章汇编程序设计

28、基础,MOV M,AXEXIT0:RETFACT ENDPCODE ENDS END START,递归调用可以简化算法,且程序简洁,但由于要使用堆栈,因此在存储空间上需要一些开销。,举例,在ADDR单元中存放着16位数Y的地址,统计Y中放1的个数,结果存入COUNT单元中,例:按15行*16列的表格形式显示ASCII码10H FFH的所有字符。每16个字符为1行,每行中的相邻两个字符之间用空格隔开。,MOV AH,02HMOV DL,输出字符的ASCIIINT 21H,COD SEGMENTASSUME CS:CODSTART:MOV DL,10H;显示的字符MOV CH,15NEXT_H:M

29、OV CL,16;1行显示的个数NEXT_L:MOV AH,02INT 21HPUSH DXMOV DL,20H;显示空格INT 21HPOP DXINC DLDEC CLJNZ NEXT_L,PUSH DXMOV AH,02MOV DL,0DH;换行INT 21HMOV DL,0AH;回车INT 21HPOP DXDEC CH JNZ NEXT_HMOV AH,4CHINT 21HCODENDSEND START,两个6字节数相加,第4章汇编程序设计基础,4.5 汇编语言程序的开发过程,汇编语言程序的开发过程须经过:汇编连接、最后可执行程序。,下面介绍宏汇编MASM软件的使用,假定在C:MA

30、SM目录下,存放了宏汇编程序MASM和源程序EXAMPLE.ASM。,第4章汇编程序设计基础,一MASM的操作 在C:MASM提示状态下,运行MASM,即键入命令:C:MASMMASMSource filename.ASM:EXAMPLE Object filename EXAMPLE.OBJ:Sourcelisting NUL.LST:Cross-reference NUL.CRF:,第4章汇编程序设计基础,在结束上述提示应答之后,MASM便对源程序进行扫描和语法检查。在没有严重语法错误的情况下生成目标文件,扩展名为.OBJ。若有语法错误,则显示错误信息。,第4章汇编程序设计基础,二汇编状态

31、信息和错误代码在汇编后,显示如下信息:Microsoft(R)Macro Assembler Version 5.00Copyright(C)Microsoft Corp.1981,1987,All right reserved47904+353887 Bytes symbol space free0 Warning Errors0 Severe Errors,第4章汇编程序设计基础,三生成的文件1目标文件(OBJ)一个二进制目标文件。2列表文件(LST)列表文件是一个有助于程序调试的文本文件。3交叉引用文件(CRF)列出源程序自定义的各个符号,指明这些符号在源程序的定义位置和符号引用位置。,

32、第4章汇编程序设计基础,4.5.3 连接 连接程序LINK能够把一个或多个独立的目标文件和定义于库文件.LIB中的子程序与变量,连接装配成一个可重定位的可执行文件,扩展名为.EXE。连接时,除了生成.EXE程序外,用户还可以根据需要,生成相应的内存映像文件。在DOS提示状态下执行如下命令:C:MASMLINK,第4章汇编程序设计基础,Object Modules.OBJ:EXAMPLERun File EXAMPLE.EXE:List FileNUL.MAP:Libraries.LIB:,4.5.4 调试与运行 程序中的错误分为两类:一类是语法错误,另一类是逻辑错误。在程序的汇编和连接中,可以检查出语法错误。而对逻辑错误的检测最常用的工具软件是DEBUG。,第4章汇编程序设计基础,一进入与退出DEBUG状态在DOS状态下直接启动DEBUG,例如:CMASMDEBUG filename-当要退出DEBUG,返回操作系统时,可使用Q(QUIT)命令,如:-QCMASM二DEBUG常用命令 请同学参阅书中相关部分。,一进入与退出DEBUG状态在DOS状态下直接启动DEBUG,例如:CMASMDEBUG filename-当要退出DEBUG,返回操作系统时,可使用Q(QUIT)命令,如:-QCMASM二DEBUG常用命令 请同学参阅书中相关部分。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号