第三章汇编语言程序设计 第一节汇编语言上机过程 第二节汇编语言程序结构 第三节指示性语句 第四节汇编语言程序举例 第五节BIOS和DOS功能调用 第六节汇编语言程序设计
1 第三章 汇编语言程序设计 第一节 汇编语言上机过程 第二节 汇编语言程序结构 第三节 指示性语句 第四节 汇编语言程序举例 第五节 BIOS和DOS功能调用 第六节 汇编语言程序设计
作业: 3-2,3-6,3-7,3-9,3-12 复习内容: P97-P114 预习内容: P114-P140 Pl45-147(不作要求,自学)
2 作业: 3-2 , 3-6 , 3-7 , 3-9, 3-12 复习内容: P97--P114 预习内容: P114-P140 P145-147(不作要求,自学)
上机环境 用户开发的程序: ABC.exe等 操作系统:DOs系统 应用软件 编辑器: EDIT.exe 编程序: MASM.exe 系统软件 连接程序: LINK.exe 硬件 调试程序: DEBUG.exe CPU、存储器(ROM、RAM)、ⅣO接口、输入、输出设备
3 上机环境 硬件 系统软件 应用软件 操作系统:DOS系统 编辑器: EDIT.exe 编程序: MASM.exe 连接程序:LINK.exe 调试程序:DEBUG.exe 用户开发的程序:ABC.exe等 CPU、存储器(ROM、RAM)、I/O接口、输入、输出设备
第一节汇编语言上机过程 编辑源程序 EDIT ABC.ASM 汇编源程序 MASM ABC.ASM D: >EDIT ABC. asm 有汇编错误信息?X D: >MASM ABC: 有语法错,回EDI下改该程序 形成目标程序 ABC. OBJ D: >LINK ABC; 连接目标程序 LINK ABC. OBJ 有错,回在EDI下改程序 有连接错误信息? D: >ABC 「飛成可执行程序 ABC.EXE 运行结果错,回EDI下改程序 装入可执行程序到内执行 或在 DEBUG下调试,找原因。 D: >sub>ABC D: >DEBUG ABC.exe 运行结果正确?)·[下一程序 用DEBU(试程序查错?入N 用 DEBUG调试可执行程序我到原因 D: subDEBUG ABCEXE 4
4 第一节 汇编语言上机过程 D:>EDIT ABC.asm D:>MASM ABC; 有语法错,回EDIT下改该程序 D:>LINK ABC; 有错,回在EDIT下改程序 D:>ABC 运行结果错,回EDIT下改程序 或在DEBUG下调试,找原因。 D:>DEBUG ABC.exe 编辑源程序EDIT ABC.ASM 汇编源程序 MASM ABC.ASM 形成目标程序ABC.OBJ 连接目标程序 LINK ABC.OBJ 有连接错误信息? 形成可执行程序 ABC.EXE 装入可执行程序到内存,并执行 D:\>sub>ABC 下一程序 用DEBUG 调试可执行程序 D:\>sub>DEBUG ABC.EXE 找到原因 Y N Y N N Y N 有汇编错误信息 ? 运行结果正确 ? Y 用DEBUG调试程序查错 ?
第二节汇编语言程序结构 、程序结构 二、语句结构
5 第二节 汇编语言程序结构 一 、程序结构 二、语句结构
汇编语言程序结构例一 程序: movs.asm 功能:实现数据传送功能 数据段1传送到数据段2 目的:学习程序结构
6 汇编语言程序结构例一 程序: movs.asm 功能: 实现数据传送功能 数据段1 传送到 数据段2 目的: 学习程序结构
程序结构 汇编语言程序结构例一mows.asm 实现数据传送功能 aa SEgment;数据段1 ●程序由数条语句构成,每条语句占一行。 strl Db 'Hello!' 指令性语句(指令语句) aa ENds 指示性语句伪指令语句) bb SEgment 数据段2 str2 DB 6 dup ●分段结构 bb ENds 程序按段编写,与8088内存分段编址相对应。 CC SEGMENT;代码段 ASSUME CS: cc. DS: aa. ES: bb 每段由伪操作 SEGMENT开始、由ENDS结束。 tart: CLD ●程序最后为END结束语句,后跟一启动地址。 MOV AX. aa MOV DS. AX 启动地址指示程序开始执行的第一条语句。 LEA SI. strl ●程序中设有返回DOS的功能 MOV AX. SEG str2 MOV ES,AX 使程序执行完后返回DOS系统的命令接受状态 MOV DI OFFSET str2 MOV CX. 6 ●程序中用到内存操作数时, REP MOVSB 应按操作数的寻址方式给相应的段寄存器赋值 MOV AH. 4CH INT21H;返回DOS ENDS END start;指示程序结束
7 一、程序结构 ⚫ 程序由数条语句构成,每条语句占一行。 指令性语句(指令语句) 指示性语句(伪指令语句) ⚫ 分段结构 程序按段编写,与8088内存分段编址相对应。 每段由伪操作SEGMENT开始、由ENDS结束。 ⚫ 程序最后为END结束语句,后跟一启动地址。 启动地址指示程序开始执行的第一条语句。 ⚫ 程序中设有返回DOS的功能。 使程序执行完后返回DOS系统的命令接受状态。 ⚫ 程序中用到内存操作数时, 应按操作数的寻址方式,给相应的段寄存器赋值 ;汇编语言程序结构例一 movs.asm ;实现数据传送功能 aa SEGMENT ;数据段1 str1 DB 'Hello!’ aa ENDS bb SEGMENT ;数据段2 str2 DB 6 dup (?) bb ENDS cc SEGMENT ;代码段 ASSUME CS:cc, DS:aa, ES:bb start: CLD MOV AX , aa MOV DS , AX LEA SI , str1 MOV AX , SEG str2 MOV ES , AX MOV DI ,OFFSET str2 MOV CX , 6 REP MOVSB MOV AH , 4CH INT 21H ;返回DOS cc ENDS END start ;指示程序结束
汇编语言程序结构例二 程序 scans.asm (子程结构) 子程内容:用二进制显示BX内容 功能:实现 用二进制显示 中断向量表中(0:0-0:3FFH) 数据D0H的个数 目的:了解程序可由多个段构成
8 汇编语言程序结构例二 程序: scans.asm (子程结构) 子程内容: 用二进制显示BX内容 功能: 实现 用二进制显示 中断向量表中(0:0~0:3FFH) 数据D0H的个数 目的: 了解程序可由多个段构成
程序可由多个段构成,至少有一个代码段 ;汇编语言程序结构例〓(子程结构) scans.,asm ;用二进制显示中断向量表中(0:00:3FFH)数据D0H的个数 key EQU0D0H;用符号表示常量(关键字) code Segment ;代码段开始 ;用二进制显示BX内容子程 ASSUME CS: code display PROC begin: MOV AX, 0000H MOV CX.16 MOV DS. AX rotate: ROL BX. 1 MOV SI 0000H MOV DL BL MOV CX. 0400H AND DL. OIH MOV BX. 0 ADD DL. 30H MOV AL, key MOV AH 2H next: CMP I SI, AL INT 21H JNZ point LOOP rotate INC BX RET ;子程返回 point: INC SI display eNDP LOOP next CALL display;调用显示子程 code ENDS ;代码段结束 MOV AH,4CH;返回DOS eNd begin;指示程序结束和 INT 21H ;程序入口
9 程序可由多个段构成,至少有一个代码段 ;汇编语言程序结构例二(子程结构)scans.asm ;用二进制显示中断向量表中(0:0~0:3FFH)数据D0H的个数 key EQU 0D0H ;用符号表示常量(关键字) code SEGMENT ;代码段开始 ASSUME CS:code begin: MOV AX , 0000H MOV DS , AX MOV SI , 0000H MOV CX , 0400H MOV BX , 0 MOV AL , key next: CMP [ SI ] , AL JNZ point INC BX point: INC SI LOOP next CALL display ; 调用显示子程 MOV AH, 4CH ; 返回DOS INT 21H ;用二进制显示BX内容子程 display PROC MOV CX , 16 rotate: ROL BX , 1 MOV DL , BL AND DL , 01H ADD DL , 30H MOV AH , 2H INT 21H LOOP rotate RET ;子程返回 display ENDP code ENDS ;代码段结束 END begin ;指示程序结束和 ;程序入口
语句结构 「名字]:1助记符操作数,…][;注释 名字项助记符项操作数项 注释项 例: data SEgment;数据段 var db data ENDS code SEgment 代码段 ASSUME CS: code. ds: data start: MOv AX. data MOV DS. AX MOv var CL MOV AH. 4CH INT21H;返回DOS code ENDS END start
10 二、语句结构 [名字] [: ] 助记符 [ 操作数, ] [;注释] 名字项 助记符项 操作数项 注释项 data SEGMENT ;数据段 var DB ? data ENDS code SEGMENT ;代码段 ASSUME CS:code,DS:data start: MOV AX, data MOV DS , AX MOV var, CL MOV AH , 4CH INT 21H ;返回DOS code ENDS END start 例: