4第四章 汇编语言程序设计.ppt_第1页
4第四章 汇编语言程序设计.ppt_第2页
4第四章 汇编语言程序设计.ppt_第3页
4第四章 汇编语言程序设计.ppt_第4页
4第四章 汇编语言程序设计.ppt_第5页
已阅读5页,还剩96页未读 继续免费阅读

下载本文档

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

文档简介

1、第四章 汇编语言程序设计,4.3 汇编语言的语法,4.4 汇编语言程序的上机过程,4.5 汇编语言程序设计,4.6 系统功能调用,4.7 程序设计举例,4.1 汇编语言与汇编程序,4.2 伪指令,4.1 汇编语言与汇编程序,一、汇编语言概述,用指令的助记符、符号地址、标号、伪指令等符号 书写的语言。,用这种汇编语言书写的程序称为汇编语言源程序,4.1,二、汇编程序,把汇编语言源程序翻译成在机器上能执行的机器语言程序(目标代码程序)的过程叫做汇编,完成汇编过程的系统程序称为汇编程序。,4.1,DATASEGMENT BUF1DB34H BUF2DB21H SUMDB? DATAENDS CODE

2、SEGMENT ASSUMECS:CODE,DS:DATA START: MOVAX,DATA MOVDS,AX MOVAL,BUF1 ADDAL,BUF2 MOVSUM,AL MOVAH,4CH INT21H CODEENDS ENDSTART,4.2 伪指令,一、伪指令概述,伪指令也称为伪操作,伪指令用于为汇编程序提供某些信息,让汇编程序在汇编过程中执行某些特定的功能。也叫指示性语句。,给出目标程序存放的位置、定义存储单元中存放的初始数据、分配存储区、指示程序结束等功能。伪操作不产生任何目标代码 。,伪指令是汇编语言的保留字,不能够用来命名变量名或标号,4.1,DATASEGMENT BU

3、F1DB34H BUF2DB21H SUMDB? DATAENDS CODESEGMENT ASSUMECS:CODE,DS:DATA START: MOVAX,DATA MOVDS,AX MOVAL,BUF1 ADDAL,BUF2 MOVSUM,AL MOVAH,4CH INT21H CODEENDS ENDSTART,汇编指令,汇编程序在对源程序进行汇编时把指令语句一对一地翻译成机器指令,然后在程序运行期间由CPU来执行其操作,伪指令与汇编指令的区别:,每一条汇编指令必须生成机器代码,然后在程序运行期间由CPU来执行其操作。,伪指令是在汇编期间由汇编程序执行的操作命令,它不生成目标代码。,

4、4.2,二、常用伪指令,1. 段定义伪指令SEGMENT-ENDS,Segname SEGMENT align_type combine_type use_type class Segname ENDS,可选择的段参数有定位类型、组合类型和类别名,一般情况下,这些说明可以不用,但如果需用链接程序把本程序与其他程序模块相连接时,就需要使用这些说明。,DATASEGMENT BUF1DB34H BUF2DB21H SUMDB? DATAENDS CODESEGMENT ASSUMECS:CODE,DS:DATA START: MOVAX,DATA MOVDS,AX MOVAL,BUF1 ADDAL

5、,BUF2 MOVSUM,AL MOVAH,4CH INT21H CODEENDS ENDSTART,4.2,2. 段寄存器设定伪指令ASSUME,定义段与段寄存器的对应关系,CS:CODE,DS:DATA,只是说明段寄存器与定义段之间的对应关系,段寄存器的内容需要用程序按要求来加载。,DATASEGMENT BUF1DB34H BUF2DB21H SUMDB? DATAENDS CODESEGMENT ASSUMECS:CODE,DS:DATA START: MOVAX,DATA MOVDS,AX MOVAL,BUF1 ADDAL,BUF2 MOVSUM,AL MOVAH,4CH INT21

6、H CODEENDS ENDSTART,4.2,3. 汇编程序结束伪指令END,END START,DATASEGMENT BUF1DB34H BUF2DB21H SUMDB? DATAENDS CODESEGMENT ASSUMECS:CODE,DS:DATA START: MOVAX,DATA MOVDS,AX MOVAL,BUF1 ADDAL,BUF2 MOVSUM,AL MOVAH,4CH INT21H CODEENDS ENDSTART,这些伪操作可以把其后的数据存入指定的存储单元,形成初始化数据,或者只分配空间而不存入确定的数值,开成未初始化数据。,4.2,4. 数据定义及存储器分

7、配伪指令,DB用来定义字节 DW用来定义字 DD用来定义双字,DATASEGMENT BUF1DB34H BUF2DB21H SUMDB? DATAENDS CODESEGMENT ASSUMECS:CODE,DS:DATA START: MOVAX,DATA MOVDS,AX MOVAL,BUF1 ADDAL,BUF2 MOVSUM,AL MOVAH,4CH INT21H CODEENDS ENDSTART,4.2,4. 数据定义及存储器分配伪指令,操作数可以是字符串,如:,MESS1DB AB MESS2DW AB,通常定义字符串时,用DB,低地址,高地址,低地址,高地址,4.2,4. 数

8、据定义及存储器分配伪指令,repeat_count DUP(operand,operand),例如:ARRAY1 DB 2 DUP(0,1,2,?),ARRAY2 DB 100 DUP(?),用来指定括号中的操作数的重复次数,4.2,5. 表达式赋值伪指令EQU / =,ABCEQU 256 ;数赋以符号名 DEFEQU 2*3 MOVE EQU MOV ;地址表达式赋以符号名,以后遇到此标识符则等效于表达式的值或字符串,X=10 X=X+10,给标识符定义一个数值。,两者区别:EQU用给标识符定义一个数值时不能重复定义标识符,但“=”允许重复赋值。,4.2,6. 地址计数器$,JNE $+6

9、 ; 转向地址是当前指令JNE的首址+6,例:$用在伪操作的参数字段表示地址计数器的当前值 ARRAY DW 1, 2 , $+4 , 3 , 4 , $+4 如果汇编时ARRAY分配的偏移地址为0070H,4.2,7. 对准伪指令ORG/EVEN/ALIGN,1)设置起始地址伪指令ORG,ORG 100H;使下一地址是100H,2)EVEN伪操作使下一变量或指令开始于一个偶数字节地址,EVEN ;使下一地址B从偶地址开始 B DW 2 DUP (?);对于字类型地址最好从偶地址开始,3)ALIGN伪操作为保证双字数组边界从4的倍数开始创造了条件,ALIGN 4 ARRAY DD 100 DU

10、P (?);使双字数组边界从4的倍数开始,8. 过程定义伪指令PROC-ENDP,4.2,procedure_name PROC NEAR ( FAR ) procedure_name ENDP,1)NEAR属性:调用程序和子程序在同一代码段中,属于段内调用。 2)FAR属性:调用程序和子程序不在同一代码段中,为段间调用。,4.3 汇编语言的语法,一、汇编语言的语句结构,name:operation operand;comment,标号,操作码,操作数,注释,二、数据与表达式,4.3,算术操作符,+、-、/和MOD,可用于数字 表达式或地址表达式中,例如:数组ARRAY定义如下,试写出把数组长

11、度(字数)存入CX寄存器的指令,ARRAY DW 1,2,3,4,5,6,7 END DW ? MOV CX,(END-ARRAY)/2,MOV CX,7,4.3,2. 逻辑运算与移位操作符,逻辑操作符有AND、 OR、 XOR、 NOT 移位操作符有SHL和SHR 按位操作,只能用于数值 表达式中,例如:MOV AX,1 SHL 3,将表达式1 SHL 3的结果8送入AX,将表达式256 SHR 2的结果64送入CX,例如:ADD CX,256 SHR 2,4.3,3. 关系运算符,EQ(相等)、NE(不等)、LT(小于)、LE(小于或等于)、GT(有大于)、GE(大于或等于)6种,结果为逻

12、辑值,为真时表示为0FFFFH,为假时为0000H,例如:MOV AX,1234 GT 1024,将0FFFFH送入AX,将0送入BX,例如:MOV BX,1234 LT 1024,4.3,4. 数值回送操作符,TYPE、LENGTH、SIZE、OFFSET、SEG等。 这些操作符把一些特征或存储器地址的一部分作为数值回送。,1)类型回送操作符TYPE,TYPE 表达式,表达式是变量:,回送该变量的以字节表示的类型,DB、DW、DD、分别对应 变量的类型属性为1、2、4。,表达式为常数:,回送0,例如:ARRAY DW 1,2,3 ADD SI,TYPE ARRAY 汇编后的结果是: ADD

13、SI,2,4.3,2)偏移OFFSET回送操作符,回送变量或标号的偏移地址,如:MOV BX , OFFSET OPER1,等价于:LEA BX ,OPER1,3)SEG,回送变量或标号的段地址值,例如:DATA是从存储器的05000H开始的一个数据段的段名,OPER是该段中的一个变量名,则:MOV BX,SEG OPER指令执行后,将把05000H作为立即数送到BX寄存器中。,4.3,4)LENGTH,例如: KKK DW 20 DUP (?) ;汇编程序为变量KKK ;分配20个字存储单元。 MOV CX ,LENGTH KKK;等价于 MOV CX ,20,变量中使用DUP,汇编程序将回

14、送分配给该变量的单元数,,又例如: ARRAY DW 1,2,3 MOV CX,LENGTH ARRAY 汇编后为:MOV CX,1,4.3,5)SIZE,回送分配给该变量的总字节数,是LENGTH 和TYPE值的乘积,例如: KKK DW 20 DUP (?) ;汇编程序为变量KKK ;分配20个字存储单元。 MOV CX ,SIZE KKK;等价于 MOV CX ,40,4.3,属性操作符 (PTR、段操作符、SHORT、THIS、HIGH、LOW),1)PTR,更改一些已经规定了类型的存储单元的类型,type PTR expression,MOV BX,5,该指令把立即数存入BX寄存器内

15、容指定的存储单元中,但汇编程序不能分辨是存入字单元还是字节单元,此里必须用PTR操作符来说明。,XYZ DW 10 DUP(?),PP EQU BYTE PTR XYZ QQ EQU BYTE PTR XYZ+1,把XYZ开始的2个存储单元规定为字节类型,KK EQU DWORD PTR XYZ+2,把接下来的4个存储单元规定为双字类型,MOV BX , XYZ MOV BL , PP MOV AL , QQ,2)段操作符,MOV AX ,ES:BX+SI,3)SHORT,用来修饰JMP指令中转向地址的属性,指出转向地址是在下一条指令地址的127个字节范围内。,4)THIS,THIS attr

16、ibute,THIS type,像PTR一样建立一个指定类型(BYTE、WORD、DWORD)的或指定距离(NEAR、FAR)的地址操作数。,FIRST_TYPE EQU THIS BYTE WORD_TABLE DW 100 DUP(?),FIRST_TYPE 与 WORD_TABLE 的偏移地址及段地址完全相同,但FIRST_TYPE 是字节类型,而WORD_TABLE是字类型。,4.3,5)字节分离操作符HIGH 和LOW,HIGH取其高位字节,LOW取其低位字节,CONST EQU 0ABCDH MOV AH , HIGH CONST ;等价于MOV AH ,0AB,4.3,6. 优先

17、级,括号内的表达式应优先计算,4.4 汇编语言程序的上机过程,步骤包括:,源程序的录入编辑 汇编 连接形成可执行程序 运行 调试,4.4,编辑程序:如EDIT.EXE 汇编程序:如ASM.EXE或MASM.EXE 连接程序:如LIKE.EXE 调试程序:如DEBUG.COM 有时还需要CREF.EXE、EXE2BIN.EXE等文件,4.5 汇编语言程序设计,程序有顺序、循环、分支和子程序四种结构形式,流程图的组成成分,4.5,4.5,一、顺序程序设计,顺序程序结构是指完全按顺序逐条执行的指令序列,这在程序段中是大量存在的,但作为完整的程序则很少见,一般作为程序的一部分。顺序结构程序是最简单的程

18、序,在顺序结构程序中,指令按照先后顺序一条一条执行。,例:将两个字节数据相加,并存放到一个结果单元中, 并显示在屏幕上。,4.5,DATASEGMENT AD1 DB4CH;定义第1个加数 AD2 DB25H;定义第2个加数 SUM DB?;定义结果单元 DATA ENDS,4.5,CODE SEGMENT ASSUMECS:CODE,DS:DATA START: MOVAX,DATA MOVDS,AX MOVAL,AD1;取出第1个加数 ADDAL,AD2;和第2个加数相加 MOVSUM,AL;存放结果 MOVBL,AL;显示十六进制结果 MOVCL,4 SHRAL,CL ANDAL,0FH

19、 ADDAL,30H,END START,MOVDL,AL MOVAH,2 INT21H MOVAL,BL ANDAL,0FH ADDAL,30H MOVDL,AL MOVAH,2 INT21H MOVAH,4CH;返回DOS INT21H CODE ENDS ENDSTART,4.5,4.5,计算(25*178+355-360)/25,要求计算结果的商存入BUF单元,余数存入BUF+2单元中。,DATA SEGMENT;定义数据段 X DW 25;定义源数据 Y DW 178 Z DW 355 BUF DW 2 DUP (?);开辟结果单元 DATA ENDS;数据段结束,4.5,CODE

20、SEGMENT ASSUME DS:DATA, CS:CODE;段约定 BEGIN: MOV AX ,DATA MOV DS ,AX;数据段地址送DS MOV AX ,X IMUL Y;DX,AXX*Y MOV CX ,AX MOV BX ,DX;BX,CXDX,AX MOV AX ,Z CWD;对Z进行符号扩展 ADD AX ,CX ADC DX ,BX;DX,AXX*Y+Z,4.5,SUB AX ,360 SBB DX ,0;DX,AXX*Y+Z-360 IDIV X MOV BUF , AX;存放商 MOV BUF+2 ,DX;存余数 MOV AH ,4CH;返回DOS INT 21H;

21、程序结束 CODE ENDS;代码段结束 END BEGIN;结束汇编,计算结果的商B1H存入BUF单元, 余数14H存入BUF+2单元中,4.5,二、分支程序设计,(a)IF_THEN_ELSE语句可以引出两个分支 (b)CASE语句则可以引出多个分支,4.5,程序的分支一般用条件转移指令来产生,利用转移指令不影响条件码的特性,连续地使用条件转移指令可使程序产生多个不同的分支。,例: 编写计算如下分段函数值的程序:,4.5,设输入数据为X、输出数据Y, 且皆为字节变量。 程序流程图如下:,4.5,程序如下:,DATASEGMENT XDB-10 YDB? DATAENDS CODESEGME

22、NT ASSUME DS:DATA,CS:CODE START: MOVAX,DATA MOVDS,AX CMPX,0;与0进行比较 JGEA1;X0转A1 MOVY,-1;X 0时,-1Y JMPEXIT A1:JGA2;X0转A2 MOVY,0;X=0时,0Y JMPEXIT A2:MOVY,1;X0,1Y EXIT:MOVAH,4CH INT21H ;程序结束点,返回DOS CODEENDS ENDSTART,4.5,例:设计一个程序段,要求根据键盘输入的19数字转向9个不同的处理程序段。,分析:在数据段定义一个存储区,形成一张地址表,用来存放9个程序段的起始地址。将键盘输入的19数字符

23、转换为真值,用于查表得到偏移地址。若输入非法字符则提示出错。,DATASEGMENT INPUTDBInput a number,13,10,$;提示信息 INERRDBInput number not 09,13,10,$ TAB DWP01;定义地址表 DWP02 DWP03 DWP04 DWP05 DWP06 DWP07 DWP08 DWP09 DATAENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,源程序如下:,4.5,BEGIN: MOV AX,DATA MOV DS,AX LEA DX,INPUT MOV AH,9 INT 21H;显示提示信息 M

24、OV AH ,1 INT 21H;从键盘接受一个输入字符 CMP AL ,1 ;若输入字符不是19中的某一数字,转LERR JB LERR CMP AL ,9 JA LERR AND AX ,000FH ;将ASCII码转换成数字 DEC AX ADD AX ,AX;求出表内偏移量 MOV BX ,AX JMP TABBX ;查表,段内间接转移,4.5,4.5,EXIT: MOV AH ,4CH INT 21H LERR:MOV DX ,OFFSET INERR;显示出错提示 MOV AH ,9 INT 21H JMP EXIT P01 :; 各处理程序入口 P02 : P09 : CODE

25、ENDS END BEGIN,4.5,三、循环程序设计,一种是DO WHILE结构形式; 一种是DO UNTIL结构形式。,4.5,例: 设计一个程序,完成从1连加到100(即1+2+.+99+100)的操作,结果保存在数据段的SUM单元。,DATASEGMENT SUMDW? DATAENDS CODE SEGMENT ASSUMECS:CODE,DS:DATA,程序如下:,4.5,START: MOV AX,DATA MOV DS,AX;数据段寄存器赋初值 ;循环初始化 SUB AX,AX;工作寄存器清零 MOV CX,100;计数器赋初值 CLC;清除进位标志 LP: INC AX;循环

26、体 ADC SUM,AX DEC CX;循环修改 JNZ LP;循环控制 ;*;插入显示程序的地方(预留位置) HLT CODE ENDS END START,4.5,例:编一个程序将字单元BUF中所含1的个数存入COUNT单元中。,分析:要测出BUF字单元所含1的个数,就应逐位测试,一个比较简单的办法是可以根据最高有效位是否为1来计数,然后用移位的方法把各位数逐次移到最高位去。 循环的结束可以用计数值为16来控制,但更好的办法是结合上述方法可以用测试数是否为0作为结束条件,这样可以在很多情况下缩短程序的执行时间。此外考虑到BUF本身为0的可能性,应该采用WHILE结构循环。,4.5,程序框图

27、:,首先将BUF中的数送给寄存器AX,然后将AX寄存器逻辑左移一次,如果CF=1,则表明AX中的最高位为1,则计数器CL计数1次,如果CF=0,表明AX最高位为0,这样依次将最高位移入CF中去测试。移位之后,判断AX的值是否为0,如果为0则结束循环,不为0,则继续循环。,4.5,程序如下:,DATA SEGMENT;定义数据段 BUFDW 0011110010101011B;定义数据 COUNTDB ?;定义存放结果的单元 DATA ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE START:MOVAX,DATA MOVDS,AX,4.5,MOV AX,BUF

28、 MOV CL,0 ;计数器为0 LOPA: ANDAX,AX JEEXIT;(AX)=0,结束循环 SHLAX,1;AX 左移一位 JNCLOPA INCCL;产生进位,(CL)+1CL JMPLOPA EXIT: MOVCOUNT,CL MOVAH,4CH;返回DOS INT21H CODE ENDS ENDSTART;结束汇编,MOV AX,BUF MOV CX,16 MOV BL,0 L1: ANDAX,AX JEEXIT AND AX,8000H JZ L2 INCBL L2: SHL AX,1 LOOPL1 EXIT: MOV COUNT,BL,4.5,四、子程序,procedur

29、e_name PROC NEAR ( FAR ) procedure_name ENDP,1. 定义子程序,2. 子程序的调用和返回,CALL RET,4.5,3. 现场保护与现场恢复,PUSH,POP,4. 子程序嵌套,子程序允许嵌套和递归,4.5,5. 子程序的参数传递,1)用寄存器传递参数,2)通过变量传递参数,3)通过堆栈传递参数或参数地址,4.5,1)用寄存器传递参数,code segment assume cs:code,ds:data begin: mov ax,data mov ds,ax mov bx,offset array mov cx,N call proc_sum m

30、ov result,al mov ah,4ch int 21h proc_sum proc xor al,al sum:add al,bx inc bx loop sum ret proc_sum endp code ends end begin,data segment array db 29h,18h,26h,19h,12h,04h,3,7,17h,35h N dw $-array result db ? data ends,4.5,2)通过变量传递参数,data segment array db 29h,18h,26h,19h,12h,04h,3,7,17h,35h N dw $-arr

31、ay result db ? data ends,code segment assume cs:code,ds:data begin: mov ax,data mov ds,ax call proc_sum mov ah,4ch int 21h proc_sum proc xor al,al mov bx,offset array mov cx,N sum:add al,bx inc bx loop sum mov result,al ret proc_sum endp code ends end begin,4.5,3)通过堆栈 传递参数或参数地址,code1 segment main pr

32、oc far assume cs:code1,ds:data,ss:stack begin: push ds sub ax,ax push ax mov ax,data mov ds,ax mov ax,offset array push ax mov ax,offset count push ax mov ax,offset result push ax call far ptr proc_sum ret main endp code1 ends,data segment array db 1,2,3 count dw 3 result db ? data ends stack segmen

33、t stack dw 100 dup(0) stack ends,data segment array db 29h,18h,26h,19h,12h,04h,3,7,17h,35h count dw 10 result db ? data ends stack segment stack dw 100 dup(0) stack ends,4.5,1)通过堆栈 传递参数或参数地址,code2 segment assume cs:code2 proc_sum proc far push bp mov bp,sp push ax push bx push cx push di mov bx,bp+0

34、Ah mov di,bp+8 mov cx,di mov di,bp+6 xor al,al,sum:add al,bx inc bx loop sum mov di,al pop di pop cx pop bx pop ax pop bp ret 6 proc_sum endp code2 ends end begin,4.6 系统功能调用,一、系统功能调用概述,IBM PC机中的BIOS和DOS操作系统都提供了丰富的中断服务程序,这两组功能子程序主要是实现系统外部设备的输入输出操作、文件管理等。,4.6,调用DOS或BIOS功能时,有以下几个基本步骤:,1)将调用参数装入指定的寄存器中;

35、 2)如需功能号,把它装入AH; 3)如需子功能号,把它装入AL; 4)按中断号调用DOS或BIOS中断;INT n 5)检查返回参数是否正确。即如果有出口参数并且需要的话,分析出口参数决定后续的程序执行。,4.6,二、DOS功能调用(INT 21H ),DOS键盘功能调用 ( AH=1,6,7,8,A,B,C ),get:movah, 1;AH=1,等待键入字符 int21h;AL键入的字符(码) cmpal, Y jeyes;若输入的是Y,则转yes标号处 cmpal, N jeno;若输入的是N,则转no处 jneget;键入其它字符,转到get处, ;继续等待键入字符 yes: . n

36、o: .,4.6,2. 字符串输入,LEADX,BUFSIZE;DS:DX指向缓冲区的第一个字节 MOV AH,0AH ;0a号功能,输入字符串到缓冲区 INT 21H,3. DOS显示功能调用,1)显示单个字符 MOVAH,2;AH=2显示单个字符 MOVDL,A ;准备入口参数,41HDL INT21H,4.6,2)显示字符串( AH=9 ), STRING DB HELLO, 0dh, 0ah, $; 字符串以$结束 MOV DX,OFFSET STRING;调用参数DS:DX=串地址 MOV AH,9;9功能DOS系统调用 INT21H;显示字符串HELLO并换行回车 ,三、常用的RO

37、M BIOS功能调用,4.6,INT 10H,4.6,INT 16H,4.7 程序设计举例,例:在屏幕上显示电子钟。,4.7,4.7,DATA SEGMENT BUF1 DB Current time is: $ BUF2DB 10 DB 10 DUP(?) DATA ENDS STACK SEGMENTSTACK DB 100 DUP(?) STACKENDS CODE SEGMENT,4.7,ASSUME CS:CODE,DS:DATA,SS:STACK CURSORMACROROW,CLM MOV AH,2 MOV BH,0 MOV DH,ROW MOV DL,CLM INT 10H E

38、NDM WIN MACRO ROWL,CLML,ROWR,CLMR,COLOR MOV AH,6 MOV AL, 0 MOV CH,ROWL,4.7,MOV CL,CLML MOV DH,ROWR MOV DL,CLMR MOV BH,COLOR INT10H ENDM ASCBCDMACROREG ;ASCII变BCD INCBX INC BX MOV REG,BX MOVCL,4,4.7,SHLREG,CL INCBX MOVAL,BX ANDAL,0FH ORREG,AL ENDM BCDASCMACROREG INC BX INC BX MOV AL,REG MOV CL,4 SHR

39、AL,CL OR AL,30H,4.7,MOV BX,AL INC BX MOV AL,REG AND AL,0FH OR AL,30H MOV BX,AL ENDM INCBCDMACRO REG,COUNT MOV AL,REG INC AL DAA MOV REG,AL,4.7,CMP AL,COUNT JNZ DISPY MOV REG, 0 ENDM STRDSPYMACROADRS LEA DX,ADRS MOV AH,9 INT 21H ENDM CLOCK PROC FAR START:PUSH DS MOV AX,0 PUSH AX,4.7,MOV AX,DATA MOV D

40、S,AX WIN 0,0,24,79,7;全屏黑白 WIN 9,28,15,52,01010111B CURSOR 11,32 STRDSPY BUF1 CURSOR 13,36 LEA DX,BUF2 MOV AH,0AH INT 21H LEA BX,BUF2 ASCBCD CH ASCBCD DH ASCBCD DL,4.7,TIMER: CALL DELY;延时1秒 INCBCDDL,60H INCBCDDH,60H INCBCDCH,24H DISPY: LEABX,BUF2 BCDASCCH BCDASCDH BCDASCDL INC BX MOV AL,$ MOV BX,AL,4

41、.7,PUSH DX CURSOR13,36 STRDSPYBUF2+2 POPDX JMPTIMER DELY PROC ;延时子程序 PUSHCX PUSHAX MOVAX,3FFFH X1:MOVCX,0FFFFH,4.7,X2:DECCX JNEX2 DECAX JNEX1 POPAX POPCX RET DELYENDP CLOCKENDP CODEENDS ENDSTART,4.7,例:下图是“两只老虎”的简谱。,根据乐谱在数据段中定义频率数据表(FREQ)和节拍时间数据表(TIME),程序以1作为频率数据表的结束标志。,1=C 4/4 1 2 3 1 | 1 2 3 1 | 3

42、4 5- | 3 4 5- | 5 6 5 4 3 1 | 5 6 5 4 3 1 | 2 5 1- | 2 5 1 - |,4.7,4.7,DATA SEGMENT FREQ DW262,294,330,262,262,294,330,262 DW330,349,392,330,349,392,392,440 DW392,349,330,262,392,440,392,349 DW330,262,294,196,262,294,196,262,1 TIMEDW 25,25,25,25,25,25,25,25,25,25 DW50,25,25,50,12,12,12,12,25,25 DW12

43、,12,12,12,25,25,25,25,50,25,25,50 SNAME DB TWO TIGER.$ DATA ENDS STACK SEGMENTSTACKSTACK DB100DUP(0),4.7,STACK ENDS CODE SEGMENT ASSUME CS:CODE,SS:STACK,DS:DATA PLAY PROC FAR PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX MOV DX,OFFSET SNAME MOV AH,9 INT 21H MOV AL,0B6H OUT43H,AL MOV BP,OFFSET TIME

44、MOV SI,OFFSET FREQ,4.7,SONG:MOV DI,SI CMP DI,1 JZ EXIT MOV BX,DS:BP CALL CSOUND INC SI INC SI INC BP INC BP JMPSONG EXIT: RET,4.7,CSOUNDPROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI MOV DX, 12H MOV AX, 34DCH DIV DI OUT 42H,AL MOV AL, AH OUT 42H,AL IN AL, 61H MOV AH, AL OR AL, 03H OUT 61H,AL MOV

45、BX, 3FFFH,4.7,DLY0: MOV CX,32717 DLY1: LOOP DLY1 DEC BX JNZ DLY0 MOVAL,AH OUT 61H,AL POP SI POP DX POPCX POPBX POPAX RET CSOUND ENDP PLAY ENDP CODE ENDS ENDPLAY,4.7,例:用子程序调用实现把键盘上输入的十进制转换为十六进制数并显示出来。假定从键盘输入一个无符号十进制数范围在065535之间。,分析:用一个子程序DECTOBIN实现从键盘接收十进制数,并把它转换为二进制数;另一个子程序BINTOHEX将二进制数以十六进制数的形式在屏幕上

46、显示出来。另外为显示清晰,用RETURN子程序达到回车换行效果。这里采用寄存器BX在各子程序之间传送信息。也就是说,在过程DECTOBIN中取得的输入数据转换为二进制数后保存在BX中,过程BINTOHEX需要使用系统功能调用把BX寄存器中的数用十六进制形式显示出来。,4.7,4.7,DATA SEGMENT MSGDB 0DH,0AH,PLEASE INPUT:$ BUF1DB 6;定义接字符串缓冲区的最大字符数 DB ?;实际键入的字符数 DB 6 DUP(0);存放键入的字符串 BUF2 DB 6 DUP(0);存放待显示16进制字符串 DAT DW 10; DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK BEGIN: MOV AX,DATA MOV DS,AX REPEAT:LEADX,MSG MOVAH,9;DOS功能调用,显示提示字符串 INT21H CALLDECTOBIN;调用键盘输入子程序 CALLRETURN;调用回车换行子程序 CMP BX,-1;若键入值65535,BX=-1 JZ EX;不显示十六进制数,直接退出 CALL BINTOHEX;调用转换显示子程序 CALL

温馨提示

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

评论

0/150

提交评论