1、 子程序、宏定义 4段过程数据定义伪指令语句 2汇编语言程序设计的一般方法 3 DOS、BIOS功能调用 51汇编语言程序的结构 12了解:汇编语言源程序的结构汇编语言语句类型及格式汇编语言是面向具体计算机硬件的语言,和机器密切相关。它最大缺点是可读性差,编程效率低。高级语言编程时不需要对机器指令系统有深入了解,稍加培训即可掌握。可读性强,功能强。为什么要用汇编语言?汇编语言编写的程序节省内 存,执行速度快,并为用户 直接控制对象提供了手段。故实时性要求很高的程序 多采用汇编语言程序。4汇编语言源程序汇编程序用助记符编写用助记符编写汇编程序汇编程序汇编语言汇编语言源程序源程序机器语言机器语言目
2、标程序目标程序源程序的编译程序源程序的编译程序5输入汇编语言源程序(EDIT)汇编(MASM)链接(LINK)调试(TD)源文件源文件.ASM目标文件目标文件.OBJ可执行文件可执行文件.EXE最终程序最终程序编辑程序Prog.asm文件汇编程序Prog.obj文件连接程序Prog.exe文件Edit.exeMasm.exeAsm.exeLink.exe汇编语言程序的汇编过程7数据段名 SEGMENT 数据段名 ENDS附加段名 SEGMENT 附加段名 ENDS堆栈段名堆栈段名 SEGMENT 堆栈段名堆栈段名 ENDS代码段名代码段名 SEGMENT 代码段名代码段名 ENDS END 8
3、DSEG SEGMENT DATA1 DB 1,2,3 DUP(?)DATA2 DW 1234HDSEG ENDSESEG SEGMENT DB 20 DUP(?)ESEG ENDSSSEG SEGMENT STACK STACK DB 200 DUP(?)SSEG ENDS9 CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG,ES:ESEG,SS:SSEG START:MOV AX,DSEG MOV DS,AX MOV AX,ESEG MOV ES,AX MOV AX,SSEG MOV SS,AX CSEG ENDS END START源程序源程序 代码代码段寄存器初始
4、化段寄存器初始化将段地址送将段地址送相应的段寄存器相应的段寄存器10指令性语句指示性语句CPU执行的语句,能执行的语句,能够生成目标代码够生成目标代码CPU不执行,而由汇编不执行,而由汇编程序执行的语句,不生程序执行的语句,不生成目标代码成目标代码二、汇编语言语句类型及格式11 指令性语句:标号:前缀 助记符 操作数,操作数 ;注释指令的符号地址指令的符号地址标号后要有冒号标号后要有冒号操作码操作码注释前加分号注释前加分号12名字 伪指令助记符 操作数,操作数,;注释变量的符号地址变量的符号地址其后不加冒号其后不加冒号指示性语句中至指示性语句中至少有一个操作数少有一个操作数13标号后有冒号,在
5、指令性语句前;名字后不加冒号,在指示性语句前。英文字母、数字及专用字符组成,最大长度不能超过31个,且不能由数字打头,不能用保留字(如寄存器名,指令助记符,伪指令)。14寄存器存储器单元常量变量或标号表达式15数字常量字符串常量例:A MOV AL,A例:ABCD汇编时被译成对应的汇编时被译成对应的ASCII码码用单引号引起的字符或字符串用单引号引起的字符或字符串16代表内存中的数据区,程序中视为存储器操作数变量的属性:变量所在段的段地址 变量单元地址与段首地址之 间的位移量。字节型、字型和双字型段段 值值偏移量偏移量类类 型型17算术运算逻辑运算*关系运算取值运算和属性运算其它运算18算术运
6、算符+,-,*,/,MOD逻辑运算符AND,OR,NOT,XOR例:MOV AL,8 AND 4MOV AL,8+4-119取得其后变量或标号的偏移地址取得其后变量或标号的偏移地址取得其后变量或标号的段地址取得其后变量或标号的段地址TYPE 取取LENGTH 取所定义存储区的长度取所定义存储区的长度SIZE 取所定义存储区的字节数取所定义存储区的字节数n用于分析存储器操作数的属性用于分析存储器操作数的属性n获取变量的属性值获取变量的属性值OFFSETSEG20 MOV AX,SEG DATA MOV DS,AX MOV BX,OFFSET DATA LEA BX,DATA等价于等价于21TYP
7、E运算符用于返回变量和标号的类型。对于字节变量返回1,对于字变量返回2,对于双字变量返回4;对于NEAR标号返回-1(0FFFFH),对于FAR标号返回值-2(0FFFEH)。例如,若AB是DB定义的变量,执行:MOV AX,TYPE AB则AX=0001H。22LENGTH和SIZE运算符只对用DUP定义的变量有意义。LENGTH返回的是分配给变量的元素的个数,SIZE返回的是分配给变量的总字节数,或者说它返回的是变量的长度与其类型乘积,例如TABLE DW 100 DUP(?),若执行指令 MOV CX,LENGTH TABLE,则CX=100;若执行指令MOV CX,SIZE TABLE
8、,则CX=1002=200。23HIGH和LOW运算符分别返回一个16位表达式的高位字节和低位字节,例如:NUM EQU 0CDEFHMOV AH,HIGH NUMMOV AL,LOW NUM则执行完后 AH=0CDH AL=0EFH24 1.PTR运算符运算符PTR运算符用于暂时改变变量或标号的原有属性。运算符用于暂时改变变量或标号的原有属性。PTR的一般格式是:的一般格式是:新属性新属性 PTR 表达式表达式例如,例如,F1是是DW定义的字变量,定义的字变量,F2是是DB定义的字节变定义的字节变量,若要取量,若要取F1的低字节,或者要将的低字节,或者要将F2开始的两个字节开始的两个字节送送
9、BX,则可以:,则可以:F1 DW 1234HF2 DB 23H,56H,18HMOV AL,BYTE PTR F1;AL=34HMOV BX,WORD PTR F2;BX=5623H25方括号:段重设符 段寄存器名:方括号中内容为操作数的偏移地址方括号中内容为操作数的偏移地址用于修改默认的段基地址用于修改默认的段基地址26掌握:伪指令的格式及实现的操作伪指令的应用27由汇编程序执行的“指令系统”作用:定义变量;分配存储区定义逻辑段;指示程序开始和结束;定义过程等。28数据定义伪指令符号定义伪指令段定义伪指令结束伪指令过程定义伪指令宏命令伪指令29用于定义数据区中变量的类型及大小格式:变量名
10、伪指令助记符 操作数,;注释符号地址符号地址定义变量类型定义变量类型定义变量值定义变量值及区域大小及区域大小30DB 定义的变量为字节型DW 定义的变量为字类型(双字节)DD 定义的变量为双字型(4字节)DQ 定义的变量为4字型(8字节)DT 定义的变量为10字节型31DATA1 DB 11H,22H,33H,44HDATA2 DW 11H,22H,3344HDATA3 DD 11H*2,22H,33445566H以上变量在内存以上变量在内存中的存放形式中的存放形式32DATA111223344DATA2224411000033DATA32200220000XX6655443333伪指令的性质
11、决定所定义变量的类型;定义字符串必须用DB伪指令例:DATA1 DB ABCD,66HABCD41H42H43H44H66H34作用:为一个数据区的各单元设置相同的初值目的:常用于声明一个数据区格式:变量名 伪指令助记符 n DUP(初值,)例:M1 DB 10 DUP(0)35表示随机值,用于预留存储空间MEM1 DB 34H,A,?DW 20 DUP(?)预留预留40个字节单元,每单元为随机值个字节单元,每单元为随机值随机数随机数占占1个字节单元个字节单元36M1 DB How are you?M2 DW 3 DUP(11H),3344H DB 4 DUP(?)M3 DB 3 DUP(22
12、H,11H,?)变量在内存中的分区变量在内存中的分区37M1How aM211H11H00H44H33H r e you?11H00H00H随机数随机数M311H22H11H22H11H22HXXXXXXXXXXXXXX38格式:符号名 EQU表达式操作:用符号名取代后边的表达式,不可重新定义例:CONSTANTEQU 100 VAR EQU 30H+99HEQU说明的表达式不占用内存空间说明的表达式不占用内存空间39说明逻辑段的起始和结束;说明不同程序模块中同类逻辑段之间的联系形 态40段名 SEGMENT 定位类型 组合类型 类别 段名 ENDS说明逻辑说明逻辑段的起点段的起点说明不同模块
13、中同名说明不同模块中同名段的组和连接方式段的组和连接方式41PARA:段的起点从节边界开始 (16个字节为1节)BYTE:段的起点从存储器任何地址开始WORD:段的起点从偶地址开始PAGE:段的起点从页边界开始 (256个字节为1页)42与其它模块中的同名段在满足定位类型的前提 下具有的组合方式:NONE:不组合PUBLIC:依次连接(顺序由LINK程序确定)COMMON:覆盖连接STACK:堆栈段的依次连接AT 表达式:段定义在表达式值为段基的节边界MEMORY:相应段在同名段的最高地址处。43不同模块连接时将相同类别的段放在连续的内存区域中44DATA SEGMENT MEM1 DB 11
14、H,22H MEM2 DB Hello!MEM3 DW 2 DUP(?)DATA ENDS变量在逻辑段变量在逻辑段中的位置就代中的位置就代表了它的偏移表了它的偏移地址地址表示变量所在表示变量所在逻辑段的段地逻辑段的段地址址表示变量的类表示变量的类型型45说明所定义逻辑段的性质格式:ASSUME 段寄存器名:段名,段寄存器名:段名,46表示源程序结束格式:END 标号47数据段名 SEGMENT 数据段名 ENDS附加段名 SEGMENT 附加段名 ENDS堆栈段名堆栈段名 SEGMENT 堆栈段名堆栈段名 ENDS代码段名代码段名 SEGMENT 代码段名代码段名 ENDS END 48DSE
15、G SEGMENT DATA1 DB 1,2,3 DUP(?)DATA2 DW 1234HDSEG ENDSESEG SEGMENT DB 20 DUP(?)ESEG ENDSSSEG SEGMENT STACK STACK DB 200 DUP(?)SSEG ENDS49 CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG,ES:ESEG,SS:SSEG START:MOV AX,DSEG MOV DS,AX MOV AX,ESEG MOV ES,AX MOV AX,SSEG MOV SS,AX CSEG ENDS END START源程序源程序 代码代码段寄存器初始化段
16、寄存器初始化将段地址送将段地址送相应的段寄存器相应的段寄存器50用于定义一个过程体格式:过程名 PROC NEAR/FAR RET 过程名 ENDPP157例例过程入口的过程入口的符号地址符号地址定义延时子程序 DELAY PROC PUSH BX PUSH CX MOV BL,2NEXT:MOV CX,4167W10M:LOOP W10M DEC BL JNZ NEXT POP CX POP BX RETDELAY ENDP51n调用延时子程序:调用延时子程序:nCALL DELAY 52 源程序中由汇编程序识别的具有独 立功能的一段程序代码格式:宏命令名 MACRO ENDM宏体宏体宏宏与
17、过程调用相似,简化程序结构。格式:宏指令名 MACRO ENDM例:DECADD MACRO MOV CL,BL ADD BL,AL MOV BL,CL ENDM使用宏定义有三步:首先进行宏定义,然后可以进行宏调用,最后汇编时由MASM进行宏扩展。类似于DOS中的批处理命令54 段内程序代码或变量的起始偏移地址格式:ORG 表达式例:ORG 2000H计算值为计算值为非负常数非负常数ORG55NAME-为目标程序设定一个名字格式:NAME 模块名TITLE-为程序清单指定打印标题格式:TITLE 标题名56设计步骤:根据实际问题抽象出数学模型确定算法画程序流程图 分配内存工作单元和寄存器程序编
18、码调试57起始:起始:功能:功能:判断:判断:子过程:子过程:58顺序结构循环结构先判定型后判定型分枝结构单分枝多分枝子程序结构 顺序结构顺序结构 循环结构循环结构 分支结构分支结构 子程序结构子程序结构(1)DO-WHILE结构结构 (2)DO-UNTIL结构结构二、循环结构二、循环结构循环初始状态循环体循环控制条件循环初始状态循环体循环控制条件YNYN循环结构程序有以下三部分组成:1)设置循环的初始状态;(如:设置循环次数的计数值)2)循环体,它由循环的工作部分和修改部分组成。3)循环控制部分,控制循环的运行和结束。(如:LOOP,LOOPZ,LOOPNZ)两种形式:IF_THEN_ELS
19、E和CASE判定条件YN判定条件。子程序又称过程,它相当于高级语言的过程和函数。(一)设计方法:1.过程定义伪操作:procedure name PROC NEAR/FAR .procedure name ENDP对过程属性的说明:1)同一个代码段为NEAR属性,不同代码段为FAR属性2)主过程应定义为FAR属性,因为我们把程序的主过程看作是DOS调用的一个子过程,属于段间调用。(二)子程序的调用和返回过程的正确执行是由子程序的正确调用和正确返回保证的。因此,注意以下两点:1)正确选择子过程的属性;2)注意子程序运行期间的堆栈状态,也即保存和恢复寄存器SUBT PROC NEAR POP DX
20、 PUSH AX POP CX PUSH BX POP BX PUSH CX POP AX PUSH DX RET .SUBT ENDP但是保存的寄存器要根据具体的程序设计情况而定一、概述:DOS(Disk Operation System)是IBM和PC/XT的操作系统。BIOS(Basic Input and Output System)是IBM和PC/XT的基本IO系统。IBMBIO.COM和IBMDOS.COM是DOS系统的核心模块。IBMBIO.COM为基本I/O设备处理程序,负责数据输入输出。(系统自检,测试,初始化引导程序,固化在BIOS中);IBMDOS.COM是磁盘文件管理程
21、序,负责管理系统资源。我们所说的调用其实就是对这两个功能模块进行调用。66DOS 功能调用 BIOS功能调用67包含多个子功能的功能包;用软中断指令调用,中断类型码固定为21H;各子功能采用功能号来区分。68设备管理4位2进制数其等值的16进制数和对应ASCII码的关系4位2进制数:0000,0001,1001,1010,1111 16进制数:0 1 9 A F16进制数ASCII:30H 31H 39H 41H 46H结论:1.4位2进制数介于09(十进制),该数加上30H(110000B)就等于对应16进制数的ASCII码;2.4位2进制数介于1015(十进制),该数加上37H(11011
22、1B)就等于对应16进制数的ASCII码。判断+C:CMP reg,03H响铃符:07H,用2号功能调用显示响铃符70调用格式:MOV AH,功能号 INT 21H71调用方法:MOV AH,01 INT 21H输入的字符在AL中72GET_KEY:MOV AH,1 INT 21H CMP AL,Y JZ YES CMP AL,N JZ NO JMP GET_KEY YES:NO:交互式应交互式应 答程序答程序73注意问题:调用格式字符输入缓冲区的定义74 功能号功能号OAH 字符串在内存中的存放地址字符串在内存中的存放地址nINT 21Hn AHn DS:DX75用户自定义缓冲区格式:0DH
23、N1N2整个缓冲区整个缓冲区最大可键入字符数最大可键入字符数实际键入字符数实际键入字符数存放键入的字符存放键入的字符存放字符个数:存放字符个数:25576 DAT1 DB 20,?,20 DUP(?)LEA DX,DAT1 MOV AH,0AH INT 21H在数据段在数据段中定义中定义7714H?20个字节个字节定义后的输入缓冲定义后的输入缓冲区初始状态:区初始状态:78 功能号O2H 待输出字符INT 21Hn AHn DL79MOVAH,02MOVDL,41HINT21H执行结果:执行结果:屏幕显示屏幕显示A80 功能号功能号O9H 待输出字符串的偏移地址待输出字符串的偏移地址nINT
24、21Hn AHn DS:DX81被显示的字符串必须以$结束,且所显示的 内容不应出现非可见的ASCII码82DATA SEGMENTMESS1 DB Input String:,0DH,0AH,$DATA ENDSCODE SEGMENT MOV AH,09MOV DX,OFFSET MESS1INT21H 知识点:知识点:1、DOS系统功能调用系统功能调用 一、概述:DOS(Disk Operation System)是IBM和PC/XT的操作系统。BIOS(Basic Input and Output System)是IBM和PC/XT的基本IO系统。IBMBIO.COM和IBMDOS.C
25、OM是DOS系统的核心模块。IBMBIO.COM为基本I/O设备处理程序,负责数据输入输出。(系统自检,测试,初始化引导程序,固化在BIOS中);IBMDOS.COM是磁盘文件管理程序,负责管理系统资源。我们所说的调用其实就是对这两个功能模块进行调用。COMMAND.COMMSDOS.SYSIO.SYSROM BIOSI/O设备设备用户用户I/O请求请求(高级用户)用户程序(普通用户)DOS命令用户与DOS之间的关系图二、DOS软中断及系统功能调用软中断指令INT n1.n=51F时,调用BIOS中的服务程序;n=203F时,调用DOS中的服务程序;2.特殊INT 21H(一)DOS软中断(I
26、NT 20HINT 27H)常用INT 20H 程序正常退出INT 21H 系统功能调用(重点)使用方法:设置入口参数,声明DOS调用,分析出口参数学会查表,P177,P449(二)DOS系统功能调用(INT 21H)(重点)功能强大:设备管理,目录管理,文件管理和其它如分配内存、置/取日期时间等。使用方法:1.置功能号n(AH):MOV AH,n2.置入口参数:具体根据功能号3.声明DOS功能调用:INT 21H4.分析出口参数:具体根据功能号(详细解释入口,出口参数)1.键盘输入(1)检查键盘状态,功能号:0BH无入口参数,出口参数AL 检查是否有键按下,有键按下ALFFH,否则AL00H
27、LOOPER:。MOV AH,0BH INT 21H INC AL JZ LOOPER RET (2)单字符输入,功能号1、7、8无入口参数,出口参数AL直接接收键入的字符,例P162(3)键入字符串,功能号0AH入口参数DS:DX,无出口参数DS:DX=存放键入字符串的缓冲区的首地址;(DS:DX)=用户规定的缓冲区长度;(DS:DX+1)=实际键入字符数,从(DS:DX+2)开始放入键入字符字符串要在新的一行显示,可在字符串前加上回车换行符:0DH,0AH 255HELLO0DBUFSIZEACTCHARCHARTEXTDS:DXDS:DX+1DS:DX+2a.(DS:DX)中存放的数据为
28、最大键入字符数,用户键入的字符数不能超过此数。b.(DS:DX+1)中存放的是实际键入的字符数,由DOS自动给出c.(DS:DX+2)才开始存放键入的字符。d.缓冲区实际的大小为最大字符数+2 用户定义的键入字符串的缓冲区2.显示器输出功能号9入口参数:DS:DX,无出口参数注意两点:(1)被显示字符串必须以“$”为结束符;(2)当和键入字符功能0A配合使用时,要注意DS:DX 应指向用户定义的缓冲区的第三字节。例:P163三、Dos功能调用应用举例:1.从键盘接收输入字符,如果是数字N,则响铃N次;如果不是数字则不响;若是CtrC键则返回DOS分析题目需解决下列问题:(1)绘出流程图(2)如
29、何判断数字和非数字(查阅P354表)(3)如何判断CtrC键和实现响铃(4)如何得到响铃次数N,如何判断响铃结束4位2进制数其等值的16进制数和对应ASCII码的关系4位2进制数:0000,0001,1001,1010,1111 16进制数:0 1 9 A F16进制数ASCII:30H 31H 39H 41H 46H结论:1.4位2进制数介于09(十进制),该数加上30H(110000B)就等于对应16进制数的ASCII码;2.4位2进制数介于1015(十进制),该数加上37H(110111B)就等于对应16进制数的ASCII码。判断+C:CMP reg,03H响铃符:07H,用2号功能调用
30、显示响铃符 CODE SEGMENT ASSUME CS:CODE START:MOV AH,01H INT 21H CMP AL,03H JZ EXIT CMP AL,30H JBE START CMP AL,39H JA START SUB AL,30H XOR AH,AH MOV BP,AXBELL:MOV AH,02H MOV DL,07H INT 21H DEC BP JNZ BELL JMP STARTEXIT:MOV AX,4C00H INT 21HCODE ENDS END START2.人机对话,通过人机对话可以得到程序运行所需要的参数。先演示rj.exe,观看程序执行情况分
31、析题目,找出需要解决的关键问题Debug RJ.EXE例1:源数据区和目标数据区地址可能重叠的数据块传送。CODE SEGMENT ASSUME CS:CODEBLK_MOV PROC FARSTART:PUSH DS MOV AX,0 PUSH AX MOV AX,SI ;计算源数据区物理地址的高16位 SHR AX,1 SHR AX,1 SHR AX,1 SHR AX,1 MOV DX,DS ADD AX,DX MOV DS,AX ;结果送DS AND SI,0FH ;(SI)源数据区物理地址低4位 MOV BX,DI ;计算目标数据区物理地址的高16位 SHR BX,1 SHR BX,1
32、 SHR BX,1 SHR BX,1 MOV DX,ES ADD BX,DX MOV ES,BX ;结果送ES AND DI,0FH ;(DI)目标数据区物理地址低4位 CMP AX,BX ;比较源起始地址和目标地知道高16位 JA DOWN ;若源地址高,转移到DOWN JB UP ;若源地址低,转移到UP CMP SI,DI ;若相等,则再比较低4位地址 JA DOWN ;若源地址高,转移到DOWN JB UP ;若源地址低,转移到UP JMP EXIT ;若物理地址完全相等,则停止 UP:STD ;(DF)1;从高位地址开始传送 DEC AX ADD SI,AX ADD DI,AX JM
33、P TRANSDOWN:CLD ;(DF)0;从低位地址开始传送TRANS:REP MOVSBEXIT:RETBLK_MOV ENDPCODE ENDS END START 例2:将36位BCD数转换为ASCII十进制数DATA SEGMENTBCDBUF DB 56H,34H,12H,90H,78H,34H,12H DB 90H,78H,56H,34H,12H,90H,78H,56H,34H,12HDATA ENDSSTACK SEGMENT STACK DB 100 DUP(?)STACK ENDS STACKCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:S
34、TACKTRANS PROC FARSTART:PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX MOV CX,18 ;(CX)字节数 LEA SI,BCDBUF ADD SI,17 ;(SI)BCD缓冲器末址 MOV DH,0 ;设置前导为0标志LOAD:PUSH CX ;CX入栈,保存循环次数 MOV AL,SI ;取一个字节BCD DEC SI MOV BL,AL ;BCD数暂存到BL MOV CL,4 ROL AL,CL ;AL循环左移4次 AND AL,0FH ;取高4为BCD OR DH,AL ;判断是否为前导0 JZ LAST ;若是,
35、不显示 ADD AL,30H ;否则,BCD转换为ASCII MOV DL,AL MOV AH,02 INT 21H LAST:POP CX ;(DF)1;从高位地址开始传送 CMP CX,1 AX JNZ BCDL MOV DH,0FFHBCDL:MOV AL,BL ;取暂存在BL中的一个字节 AND AL,0FH ;取低4位BCD OR DH,AL JZ GOON ;若是,不显示,继续循环 ADD AL,30H ;否则,BCD转换为ASCII MOV DL,AL MOV AH,02 INT 21HGOON:LOOP LOAD RETTRANS ENDPCODE ENDS END START
36、例1:源数据区和目标数据区地址可能重叠的数据块传送。CODE SEGMENT ASSUME CS:CODEBLK_MOV DB?(Y/N)$START:PUSH DS DB?DB 30 DUP(?)DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATABEG:MOV AX,DATA MOV DS,AXAGAIN:MOV AH,9 MOV DX,OFFSET MESG1 INT 21H MOV AH,0AH MOV DX,OFFSET BUF INT 21H MOV BL,BUF+1 MOV BH,0 MOV SI,OFFSET BUF+2 MOV BYTE P
37、TRBX+SI,$MOV AH,2 MOV DL,0AH INT 21H MOV AH,9 MOV DX,OFFSET BUF+2 INT 21H MOV AH,9 MOV DX,OFFSET MESG2 INT 21H MOV AH,1 INT 21H CMP AL,Y JNE AGAIN MOV AH,4CH INT 21H CODE ENDS END BEG例1:人机对话DATA SEGMENTMESG1 DB 0DH,0AH,What is your name?$MESG2 DB?(Y/N)$BUF DB 30 DB?DB 30 DUP(?)DATA ENDSCODE SEGMENT
38、ASSUME CS:CODE,DS:DATABEG:MOV AX,DATA MOV DS,AXAGAIN:MOV AH,9 MOV DX,OFFSET MESG1 INT 21H MOV AH,0AH MOV DX,OFFSET BUF INT 21H MOV BL,BUF+1 MOV BH,0 MOV SI,OFFSET BUF+2 MOV BYTE PTRBX+SI,$MOV AH,2 MOV DL,0AH INT 21H MOV AH,9 MOV DX,OFFSET BUF+2 INT 21H MOV AH,9 MOV DX,OFFSET MESG2 INT 21H MOV AH,1 I
39、NT 21H CMP AL,Y JNE AGAIN MOV AH,4CH INT 21H CODE ENDS END BEG例1:源数据区和目标数据区地址可能重叠的数据块传送。CODE SEGMENT ASSUME CS:CODEBLK_MOV DB?(Y/N)$START:PUSH DS DB?DB 30 DUP(?)DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATABEG:MOV AX,DATA MOV DS,AXAGAIN:MOV AH,9 MOV DX,OFFSET MESG1 INT 21H MOV AH,0AH MOV DX,OFFSET BU
40、F INT 21H MOV BL,BUF+1 MOV BH,0 MOV SI,OFFSET BUF+2 MOV BYTE PTRBX+SI,$MOV AH,2 MOV DL,0AH INT 21H MOV AH,9 MOV DX,OFFSET BUF+2 INT 21H MOV AH,9 MOV DX,OFFSET MESG2 INT 21H MOV AH,1 INT 21H CMP AL,Y JNE AGAIN MOV AH,4CH INT 21H CODE ENDS END BEG例1:人机对话DATA SEGMENTMESG1 DB 0DH,0AH,What is your name?$
41、MESG2 DB?(Y/N)$BUF DB 30 DB?DB 30 DUP(?)DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATABEG:MOV AX,DATA MOV DS,AXAGAIN:MOV AH,9 MOV DX,OFFSET MESG1 INT 21H MOV AH,0AH MOV DX,OFFSET BUF INT 21H MOV BL,BUF+1 MOV BH,0 MOV SI,OFFSET BUF+2 MOV BYTE PTRBX+SI,$MOV AH,2 MOV DL,0AH INT 21H MOV AH,9 MOV DX,OFFSET
42、 BUF+2 INT 21H MOV AH,9 MOV DX,OFFSET MESG2 INT 21H MOV AH,1 INT 21H CMP AL,Y JNE AGAIN MOV AH,4CH INT 21H CODE ENDS END BEG例2:从键盘接收数字,如果是数字 n,则响铃 n 次。其它字符不响,重新输入。直到键入Ctrl+C时结束。lcode segmentl assume cs:code,ds:datelstart:mov ax,datel mov ds,axl tt:mov dx,offset tsl mov ah,09Hl int 21hl zzl mov ah,01
43、Hl int 21hl zzl cmp al,03Hl jz exitl cmp al,30Hl jbe errorl cmp al,39Hl ja error l sub al,30H 响铃程序zz macromov dl,0dhmov ah,02hint 21hmov dl,0ahmov ah,02hint 21h endmdata segmentts db Please enter a number(1-9):$wts db The number is wrong!$data endsl xor cx,cxl mov cl,allbell:mov ah,02hl mov dl,07hl
44、int 21hl loop belll jmp ttlerror:mov dx,offset wtsl mov ah,09hl int 21hl zzl jmp ttl exit:mov ax,4c00hl int 21hlcode endsl end start 例3:从键盘接受字符如果是小写字母将它转变为大写字母送存到某一存储区域,否则直接送存。当输入回车时,程序退出,退出时显示输入转变后的字母串。CALL INKEY MOV BX+SI,AL MOV AL,0AH MOV BX+SI+1,AL MOV AL,$MOV BX+SI+2,AL MOV AH,09 MOV DX,BX INT
45、21H MOV AX,4C00H INT 21H大小写字母转换DATA SEGMENTMESS DB Please input alphbet.DB 0D,0A DB$BUF DB 82 DUP(?)DATA ENDSSTACK SEGMENT STA DB 50 DUP(?)TOP EQU LENGTH STASTACK ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV SP,TOP CMP AL,7AH JA TTT SUB AL,20
46、H TTT:MOV BX+SI,AL INC SI JMP MOREEXITSUB:RETINKEY ENDPCODE ENDS END STARTINKEY PROC NEAR MOV BX,OFFSET BUF MOV SI,0MORE:MOV AH,09H LEA DX,MESS INT 21H MOV AH,01 INT 21H CMP AL,0DH JZ EXITSUB CMP AL,61H JB TTT例4:在缓冲区BUFFER连续存放着30个学生的数学成绩,编程统计其中优、良、中、及格、不及格各有多少人,并把结果存在自RESULT开始的五个字节单元。1)分析题目,找出需解决的关键
47、问题,怎么解决2)数据段怎么定义3)程序采用什么结构,画出流程图Cmp al,60 Jge a60 Inc Result5 Jmp tt a90:Inc Result Jmp tt a80:Inc Result8 Jmp tt a70:Inc Result7 Jmp tt a60:Inc Result6 Jmp tt tt:Inc si Loop kk Mov ah,4ch Int 21h Code ends End sa统计成绩:Data segmentBuffer db 52,64,83,85,70Result db 0Result8 db 0 Result7 db 0Result6 db
48、 0Result5 db 0Data endsStack segment para stack stackDb 20 dup(?)Stack endsCode segment Assume cs:code,ds:data,ss:stacklsa:Mov ax,datal Mov ds,axl Mov ax,stackl Mov ss,axl Mov cx,30l Lea si,Bufferlkk:Mov al,sil Cmp al,90l Jge a90l Cmp al,80l Jge a80l Cmp al,70l Jge a70 112完整的汇编语言源程序结构定义逻辑段,说明段的含义,初始化段寄存器伪指令数据定义方式字符及字符串的输入和显示输出字符输入缓冲区的定义,输出字符串的定义源程序的编写几种结构(顺序、循环、分枝等)
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。