




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第4章子程序设计和DOS功能调用4.1 子程序设计子程序过程具有特定功能的程序模块子程序是提高程序设计效率的良好手段,也为模块化设计提供了很好的基础。4.1.1 过程调用和返回指令1call指令过程调用指令 格式: call 目的操作数 具体格式同jmp 注意:在功能上CALL指令与JMP指令都是要转换到新的位置执行程序,所不同的是,JMP不保护断点,CALL要保护断点。这里的断点是指CALL指令后继第一条指令的起始地址。当执行CALL指令时,CS:IP正指向其后继第一条指令断点,CALL指令保护之,以便执行完过程后能正确返回调用主程序继续原来程序的执行。可在DEBUG.EXE下观察到CALL
2、保护断点的情况。 段内直接调用 call 过程名(near型) 操作:堆栈ip,ipip+相对位移量(汇编结果),ip指向目标 段内间接调用 子程序的起始地址(偏移地址)事先存放在通用寄存器或内存单元中 call bx call cx call word ptr bx+di+2操作:堆栈ip(断点偏移地址),ip目标地址段间直接调用call 过程名(far型)操作: 堆栈cs:ip(断点地址),cs:ip目标地址段间间接调用子程序的起始地址(逻辑地址:偏移地址)存放在四字节的地址指针中 call dword ptrbx操作: 堆栈cs:ip(断点地址),cs:ip目标地址2. ret指令过程返
3、回指令格式: ret ret n(弹出值为偶数) 功能: ret 指令将控制从一个过程返回到调用该过程的call指令之后的那条指令(调用程序的断点),段内或段间返回都用RET. ret完成由堆栈恢复断点的功能 : 段内返回:ip断点偏移量 段间返回:ip断点偏移量 cs断点段地址 带弹出值的返回指令,其弹出值只能是偶数,在从堆栈中弹出返回地址后,再次修改堆栈指针sp的值: spsp+n 以废除调用程序装入栈中的参数恢复调用之前的栈顶。把执行call指令前压入堆栈的参数弹出丢去.注意:以标号开始,以RET结束的程序段均可以视为子程序,用CALL调用:data segmentpr1 db abcd
4、efg,0dh,0ah,24hdata endscode segment assume cs:code,ds:datastart: mov ax,data mov ds,ax call disp mov ah,9 lea dx,pr1 int 21h mov ah,4ch int 21hdisp: lea dx,pr1 mov ah,9 int 21h retcode endsend start4.1.2 过程定义语句 格式: 过程名 proc near/far . ret . ret过程名 endp说明:过程名不能省略,proc和endp前的过程名必须相同near近调用过程,即仅能被同一逻辑
5、代码段的程序调用. far远调用过程,即能被其他逻辑代码段的程序调用. 如果无类型说明,隐含near.过程调用与返回主程序用call命令调用过程,执行完后,在过程中执行ret返回主程序,所以在过程中,一般最后一条语句均为ret指令过程的嵌套与递归汇编程序也允许过程的嵌套调用和递归调用过程嵌在过程中调用过程过程递归过程调用自己这两种调用方式都是依靠CALL指令和RET指令配合实现的。子程序的编写方法1子程序的定义调用程序与子程序在同一代码段中,子程序的类型为near code segment assume . main proc far . call sub . ret main endp su
6、b proc near . ret sub endp code ends 调用程序与子程序不在同一代码段中,子程序必须是far型code1 segment assume .main proc far . call far ptr sub . retmain endpcode1 ends code2 segmentsub proc far . retsub endp . call sub . code2 ends end main注意:以标号开始,RET结束的程序段均可以视为子程序,用CALL调用:data segmentpr1 db abcdefg,0dh,0ah,24hdata endsco
7、de segment assume cs:code,ds:datastart: mov ax,data mov ds,ax call disp mov ah,9 lea dx,pr1 int 21h mov ah,4ch int 21hdisp: lea dx,pr1 mov ah,9 int 21h retcode endsend start 2编写子程序的要求 保护寄存器与存贮器工作单元code segment assume .main proc far . call sub ;调用延时子程序 . retmain endpsub proc near ;延时子程序 push bx ;子程序要
8、使用的寄器中数据送堆栈保护 push cx mov bl,20delay:mov cx,5600 ;延时循环 wait: loop wait dec bl jnz delay pop cx ;由堆栈恢复保护的数据 pop bx retsub endpcode ends正确使用堆栈执行CALL指令之间后,转入子程序之前,堆栈顶保存了断点地址.在子程序中执行RET指令时,要从堆栈中弹出断点地址,以便正确返回调用程序. 在子程序中使用了堆栈,必须成对地执行PUSH和POP,确保在执行RET时,栈顶能恢复刚进入子程序时的位置,使RET指令能正确恢复断点.否则程序的执行结果将无法预测.程序中加入必要的说
9、明和注释,增加程序的可读性和可理解性,一般应说明:子程序名、功能、入/出口地址、使用的寄存器和存贮单元,子程序中调用的其它子程序名等。处理好调用程序与子程序之间的参数传递,常用的参数传递方法有:借助寄存器 借助内存中建立的参数表 借助堆栈 4.1.3 子程序举例例1(p116-1.asm)写一个把用ASCII码表示的两位十进制数转换为对应二进制数的子程序.子程序入口参数:DH=十位ASCII码,DL=个位ASCII码出口参数:AL=对应二进制数 转换方法: 高位10低位 data segmentpr1 db “Input two numbers:$”pr2 db 0ah,0dh,”Out:$”
10、data endscode segment assume cs:code,ds:datastart: mov ax,datamov ds,axmov ah,09hlea dx,pr1int 21hmov ah,01hint 21hmov dh,almov ah,01hint 21hmov dl,alcall subrmov bl,al;显示程序入口bl=显示值call disp;调用按二进制显示子程序mov ah,4chint 21hsubr proc; mov al,dhand al,0fhmov ah,10mul ahmov ah,dland ah,0fhadd al,ahretsubr
11、endpdisp proc lea dx,pr2mov ah,09hint 21hmov cx,08hlp1: rol bl,1 mov dl,bland dl,01hadd dl,30h mov ah,02hint 21hloop lp1retdisp endpcode ends end start例2(p116-2.asm) 写一个把16位二进制数转换为4位十六进制数ASCII码的子程序,并用此子程序显示地址为F000:0000H的字单元内容.转换方法: 把要转换的字数据循环左移4位,把最高4位移到最低4位析出最低4位,相当于一位十六进制数把析出的一位十六进制数转换为ASCII码重复上述操
12、作4次.入口参数:DX=待转换的二进制数 DS:BX=存放转换所得ASCII码串的缓冲区首地址dseg segmentbuff db 4 dup(0),H,0dh,0ah,$dseg endscseg segment assume cs:cseg,ds:dsegstart: mov ax,dseg mov ds,ax mov ax,0f000h mov es,ax mov dx,es:0000h mov bx,offset buff call htascs mov dx,offset buff mov ah,09h int 21h mov ah,4ch int 21hhtascs proc m
13、ov cx,0404hlp: rol dx,cl mov al,dl and al,0fh add al,30h cmp al,39h jbe next add al,07hnext: mov bx,al inc bx dec ch jnz lp rethtascs endpcseg ends end start例3(P118-1.ASM)写一个把16位二进制无符号数转换为5位十进制数ASCII码的子程序,并用该子程序转换地址为FFFF:0000h的一个字转换方法:除10取余数,并把余数转换ASCII码,先取得的余数在低位,后取得的余数在高位。 入口参数:AX=欲转换的二进制数 DS:BX=存
14、放转换所得ASCII码串的缓冲区首地址出口参数:转换得到的十进制ASCII码串按由高位到低位的顺序存放在缓冲区dseg segment buff db 18 dup($)dseg endscseg segment assume cs:cseg,ds:dsegstart: mov ax,dseg mov ds,ax mov ax,0ffffh mov es,ax mov ax,es:0000h mov bx,offset buff call btoasc mov dx,offset buff mov ah,09h int 21h mov ah,4ch int 21hbtoasc proc xor
15、 cx,cx mov si,10lp: xor dx,dx div si add dl,30h push dx inc cx or ax,ax jz lp1 jmp lplp1: pop dx mov bx,dl inc bx loop lp1 retbtoasc endpcseg ends end start4.1.4 子程序说明信息为了方便子程序的使用,应给简明确切的说明,上面已经讲述到这方面的要求,下面给出一总结性的说明:前三点:即子程序名、功能描述、入口和出口参数是必须给出来的,否则难以使用。子程序名功能描述入口和出口叁数所用的寄存器和存储单元使用的算法和重要的性能指标其它调用注意事项
16、和说明信息调用实例4.1.5 寄存器的保护与恢复为了在子程序执行结束后,返回调用程序(主程序),程序能正常继续运行,应该在执行子程序的操作前,保护寄存器中原来的数据,当子程序操作结束后恢复寄存器中原有的数据,以确保程序的顺利运行。方法一:在调用程序(主程序)中保护寄存器(压入堆栈)和恢复寄存器(弹出堆栈)中的数据。即,在调用子程序前,把相关的寄存器的内容用PUSH指令压入堆栈,当由子程序返回调用程序时,又用POP指令把这些寄存器原来的内容由堆栈中取回到对应的寄存器中。优点:仅需要保护和恢复程序在主、子程序中都要用到的寄存器,不保护就会影响程序正常运行的寄存器。缺点:使主程序中出现大量的PUSH
17、、POP指令,如果子程序调用频繁应就会使主程序编写极为繁琐,且不易理解,甚至会漏掉某些应该保护的寄存器。方法二:在调用子程序中保护寄存器(压入堆栈)和恢复寄存器(弹出堆栈)中的数据。即在子程序的开始,用PUSH指令所在子程序中要使用改变内容的寄存中的数据送堆栈中保护起来,在子程序返回主程序之前,即在RET指令前,用POP指令把保护在堆栈中的数据送回到相应的寄存器中。优点:主程序编写方便,不必考虑保护哪些寄存器,且不会造成数据保护的因遗漏。更为重要的是,这样写出来的子程序相对独立,与主程序没有关系,是模块化程序设计的基础。btoasc proc push axpush bxpush cx pus
18、h dxmov cx,10lp: xor dx,dx div cx cmp dx,0 je next add dl,30h mov bx,dl inc bx jmp lppop dxpop cxpop bxpop ax next: retbtoasc endp说明:在.286 、.386等模式下可以使用PUSHA和POPA指令简程序的编写。格式: PUSHA功能:把通用寄存器AX、BX、CX、DX、BX、SP、BP、SI、DI的内容顺序推入堆栈。格式:POPA功能:把用PUSHA保存到堆栈中的8个通用寄存器的值弹回到相应的寄存中,并丢去原先SP的值用这两条指令,上述子程序可以简化为:btoas
19、c proc pushamov cx,10lp: xor dx,dx div cx cmp dx,0 je next add dl,30h mov bx,dl inc bx jmp lppopanext: retbtoasc endp如果程序需要,可以在主程序中用PUSHF和POPF保护和恢复标志寄存器的标志。各标志位中,常作为入口、出口参数的是CF一般来讲,不需要保护含有子程序入口参的寄存器。当然,若有必要,也可以象保护和恢复寄存器的数据一样,可以保护和恢复某些关键的存储单元中的数据。4.2 主程序与子程序间的参数传递主程序与子程序间的参数传递有多种方法:寄存器传递法、约定内存单元传递法、堆
20、栈传递法、CALL后续区传递法。4.2.1 利用寄存器传递参数 利用寄存器传递数据简单方便,但由于寄存器的个数较少,只适用于所要传递的数较少的情况。上面的大多数例子都是利用寄存器传递的参数。例1(p121-1.ASM) 写一个把大写字母改为小写字母的子程序。在第三章我们介绍过:由ASCII码表(P6)可知:A、B、C的ASCII码:0100 0001B、0100 0010B、0100 0011B、a、b、c 的ASCII码:0110 0001B、0110 0010B、0110 0011B、所以,只要把大写字母ASCII码中的D5位由0改为1,便实现了由大写转换为小写。要实现这个操作只需要用一个
21、D5=1,其它各位均为0的字节与大写字母的ASCII码进行或操作(OR)。这个字节=0010 0000B=20H由此可知,程序用不需要字符是大写还是小写进行判断。data segmentpr1 db Input a string:$ pr2 db 0ah,0dh,Capital string:$buff db 100 nu db 0string db 100 dup($)data endscode segment assume cs:code,ds:datastart: mov ax,data mov ds,axlea dx,pr1mov ah,09hint 21hmov ah,0ahlea
22、dx,buffint 21hxor ch,chmov cl,numov si,offset stringlp: mov al,si call uptolwmov si,alinc siloop lplea dx,pr2mov ah,09hint 21hlea dx,stringmov ah,09h int 21hmov ah,4chint 21huptolw proc pushf or al,20h popf retuptolw endpcode ends end start例2(p122-1.asm)写一个判别字符是否为数字字符的子程序,并利用该子程序把一个字符串中的所有数字字符删除。方法:
23、用ASCII码进行比较,其ASCII码值在30H与39H之间是数字字符。入口参数:AL=字符的ASCII码出口参数:是数字字符,CF=0;否则CF=1dseg segmentpr1 db Input a string:$pr2 db 0dh,0ah,Out:$buff db 100nu db 0string db 100 dup($)dseg endscseg segment assume cs:cseg,ds:dsegstart: mov ax,dseg mov ds,ax mov dx,offset pr1 mov ah,09h int 21h lea dx,buff mov ah,0ah
24、 int 21h mov si,offset string mov di,si mov cl,nu xor ch,chlp: mov al,si inc si call isdecm jnc next mov di,al inc dinext: loop lp inc si mov al,si;前移一个”$” mov di,al lea dx,pr2 mov ah,09h int 21h lea dx,string mov ah,09h int 21h mov ah,4ch int 21hisdecm proc cmp al,30h jb isdecm1;al30h:cf=1,非数字 cmp
25、al,3ah;cf=1:al3ah,是数字 cmc ;CF取反,使用其与要求一致isdecm1: retisdecm endpcseg ends end start4.2.2 利用约定的存储单元传递参数 利用数据段或附加段中的变量或参数表来传递参数,程序编写方便,且一般不会因为参数传递问题出错。存在的问题是子程序的通用性降低。例3(P123-1.ASM) 实现32位(4字节)数相加的子程序。方法:用两次字加法实现双字数据的加法操作,第二次加法操作用ADC。 入口参数:两个加数存放在双字缓冲区DATA1和DATA2出口参数:双字缓冲区DATA3,在DATA3后的第5个字节存放进位注:下面程序中增
26、加了按十六进制ASCII码显示加数、和的操作。data segmentdata1 dd 12345678hdata2 dd 98765432hdata3 dd ?data4 dd ? ;显示缓冲区data endscode segment assume cs:code,ds:datastart: mov ax,data mov ds,axcall maddmov ax,word ptr data1mov word ptr data4,axmov ax,word ptr data1+2mov word ptr data4+2,axcall dispmov ax,word ptr data2mov
27、 word ptr data4,axmov ax,word ptr data2+2mov word ptr data4+2,axcall dispmov ax,word ptr data3mov word ptr data4,axmov ax,word ptr data3+2mov word ptr data4+2,axcall dispmov ah,4chint 21hmadd proc;双字加法子程序 push axpush cxpush simov cx,2xor si,simadd1: mov ax,word ptr data1si adc ax,word ptr data2simov
28、 word ptr data3si,axinc siinc siloop madd1mov al,0adc al,0mov byte ptr data3+4,alpop sipop cxpop axretmadd endpdisp proc;双字显示子程序 mov cx,0804hlp: rol data4,cl mov dl,byte ptr data4and dl,0fhadd dl,30hcmp dl,3ahjb nextadd dl,07hnext: mov ah,02h int 21hdec chjnz lpmov dl,0ahmov ah,02hint 21hmov dl,0dhm
29、ov ah,02hint 21hretdisp endpcode ends end start说明:更常的方法是在存储区建立参数表,参数表的首地址通过寄存器传递给子程序,这样可以提高子程序的通用性。例4(p124-1.asm)设计一个把以ASCII码表示的十进制数字串转换为二进进制数的子程序。假设十进制不大于65535。方法: 高位10+低位 入口参数:DS:BX=缓冲区首地址,首字节为字串字符数出口参数:AX=转换得到的二进制数。data segmentpr1 db Input a number string:$pr2 db 0ah,0dh,Out:$buff db 6nu db 0stri
30、ng db 6 dup(0)data endscode segment assume cs:code,ds:datastart:mov ax,data mov ds,ax lea dx,pr1 mov ah,09h int 21h mov ah,0ah mov dx,offset buff int 21h lea bx,nu call dtobin mov bx,ax lea dx,pr2 mov ah,09h int 21h mov cx,16lp: rol bx,1 mov dl,bl and dl,01h add dl,30h mov ah,02h int 21h loop lp mov
31、 ah,4ch int 21hdtobin proc push bx push cx push dx xor ax,ax mov cl,bx xor ch,ch inc bx jcxz dtobin2dtobin1: mov dx,10 mul dx;高位乘10 mov dl,bx;读取代位ASCII码 inc bx ;bx指向下一字符 and dl,0fh ;取得的字符转换为数值 xor dh,dh add ax,dx;加低位 loop dtobin1dtobin2: pop dx pop cx pop bx retdtobin endpcode ends end start4.2.3 利用
32、堆栈传递参数主程序调用子程序前,把需要传递给子程序的入口参数有序地压入堆栈;进入子程序后,子程序从堆栈中依次弹出参数;如果使用堆栈传递出口参数,则在子程序返回主程序前,把需要返回的参数存入堆栈;返回主程序后,从堆栈中弹出出口参数.优点:不占用寄存器,不用分配额外的存储空间,有利于通过子程序的递调用来实现某些递归算法。缺点:入、出口参数都在堆栈中,同时要注意保护寄存器,在子程序中访问堆栈,要准确计算出相应单元的偏移地址,较为复杂。常用堆栈传递入口参数,用寄存器传递出口参数。例5(P125-1.ASM)测量字符串长度的子程序。方法:从串首搜索到串尾,计数字符的个数。设字符串以“0”为结束标志。入口
33、参数:字符串起始地址(段址:偏址)存放在堆栈中出口参数:AX=字符串的字符数data segmentpr1 db Input a string with 0_end:$pr2 db 0ah,0dh,Char_number:$nu db 5 dup(0),$buff db 100,0string db 100 dup(?)data endsstack segment para stack stack dw 100 dup(?)stack ends code segment assume cs:code,ds:data,ss:stackstart: mov ax, data mov ds,ax m
34、ov dx,offset pr1 mov ah,09h int 21h lea dx,buff mov ah,0ah int 21h mov bx,seg string push bx;串段址进栈 mov bx,offset string push bx;串偏址进栈 call strlen;调用测量过程 call disp;调用显示过程 mov ah,4ch int 21hstrlenproc push bp mov bp,sp;bp指向当前栈顶 push ds push si mov ds,bp+6;取串首段地址 mov si,bp+4;取串首偏移地址 mov al,0 ;al串结束标志st
35、rlen1:cmp al,si jz strlen2 ;到串尾转移 inc si ;SI逐渐指向串尾 jmp strlen1strlen2:mov ax,si ;串尾地址赋值给AX sub ax,bp+4;串尾址-串首址=串长 pop si pop ds pop bp ret 4;返回释放入口参数占用的地址strlen endpdisp proc mov cx,10 lea di,nu+4lp: xor dx,dx div cx add dl,30h mov di,dl cmp ax,0 jz next dec di jmp lpnext: mov dx,offset pr2 mov ah,0
36、9h int 21h lea dx,nu mov ah,09h int 21h retdisp endpcode ends end start注意:刚进入子程序后,让BP指向当前栈顶,是子程序中从堆栈读取入口参数的基本条件,否则很难准确地读到入口参数。在这里,编程者要对堆栈的数据存放情况要很清楚,否则子程序不可能获得正确的入口参数。4.2.4 利用CALL后续区传递参数在主程序的CALL指令后,用DW语句定义存放入口参数,使调用子程序的入口参数存放在CALL指令之后;在子程序中根据堆栈中保存的断点地址,从代码段中读取入口参数。在子程序中的基本操作结束后,准备返回主程序前,修改堆栈中的断点地址,
37、使断点地址越过入口参数的存储区例6(p128-1.asm)实现把字符串中的大写字母转换为小写字母的子程序。方法:在串中搜索大写字母,搜索到后加上20H,便转换为小写字母入口参数:串起始段址、偏址(存放在CALL指令之后)出口参数:无data segmentpr1 db Input a string with 0_end:$pr2 db 0ah,0dh,Out:$buff db 100,0string db 100 dup($)data endsstack segment para stack stack dw 100 dup(?)stack ends code segment assume c
38、s:code,ds:data,ss:stackstart: mov ax, data mov ds,ax mov dx,offset pr1 mov ah,09h int 21h lea dx,buff mov ah,0ah int 21h call strlwr dw offset string dw seg string;seg后可以是段名 lea dx,pr2 mov ah,09h int 21h lea dx,string mov ah,09h int 21h mov ah,4ch int 21hstrlwr proc push bp mov bp,sp;BP指向当前栈顶 push a
39、x push si push ds mov si,bp+2;si断点地址mov ds,cs:si+2;ds入口参数 mov si,cs:si;si入口参数(偏址)strlwr1:mov al,si;取一个字符 cmp al,0;判断是否到串尾 jz strlwr3 cmp al,A jb strlwr2 cmp al,Z ja strlwr2 or al,20h mov si,alstrlwr2:inc si jmp strlwr1strlwr3:add word ptr bp+2,4;修改断点地址 pop ds ;越过参数区 pop si pop ax pop bx retstrlwr en
40、dp code ends end start4.3 DOS功能调用及应用4.3.1 DOS系统功能调用概述1. DOS系统功能的主要类别基本输入/输出管理:键盘,显示器,打印机,鼠标I/O等磁盘写管理文件管理内存管理 2. 系统功能调用方法AH功能号 寄存器入口参数 执行指令中断指令:INT 21H 寄存器出口参数(系统功能完成) 读出存放出口参数的数据 4.3.2 基本I/O功能调用1. 单字符输入:DOS 21H的功能1、7、8从键盘(标准输入设备)读一个字符送入AL寄存器功能号1:有回显(显示到标准出设备上,即监显示器)功能号7:无回显功能号8:无回显,读到Ctrl+C或Ctrl+Bre
41、ak结束程序2. 输入字符串(中断21H的0AH功能)从键盘读入一串字符并把它存入用户定义的缓冲区中。 缓冲区的第一个字节保存最大字符数由用户程序给出。 第二个字节是实际输入的字符个数(不包含回车符)由功能OA填入,该字节后,开始存入字符串(按字节存) 结束字符串输入按回车,且回车符0DH还要占用一个字符,所以缓冲区实际的的空间为最大字符数+2如果输入的字符数超过缓冲区分配的空间,系统会响铃并放弃多余的字符。3. 清除键盘缓冲区(21H的0CH功能)0CH功能清除缓冲区然后执行AL所指定功能。AL的指定功能可以是1,6,7,8或0AH。4. 检测键盘状态(DOS 21H 0BH)如按下一个键,
42、则AL=0FFH,若无键按下则AL=00,无论哪种情况都将继续执行程序中的下一条指令。5. DOS显示功能调用(21h的2, 6, 9功能)功能号2:显示字符dl=字符的ASCII码,在屏幕上显示该字符功能号6:输入输出字符 dl=0ffh相当于1号功能,键盘输入字符送al dl=ASCII码,输出该字符功能号9:输出字符串 DS:DX=以$为结束符的字符串首地址,在屏幕上输出该串6打印机I/O中断功能号5:打印一个字符,dl=字符说明:INT 21H的功能5把一个字符送到打印机,字符必须放在DL寄存器中,这是唯一的DOS打印功能。如果需要回车、换行等打印机功能,必须由汇编语言程序送出回车、换
43、行等字符码。实现上要打印机动起来必须送回车、换行符4.3.3 应用举例例1(p132-1.asm)实现用二进制数形式显示所按键的ASCII码.cseg segment assume cs:cseg,ds:csegstart: mov ax,cseg mov ds,ax lea dx,pr1 mov ah,09h int 21h mov ah,01h int 21h mov bl,al mov dx,offset pr2 mov ah,09h int 21h mov cx,8next: rol bl,1 mov dl,bl and dl,01h add dl,30h mov ah,02h int
44、 21h loop next mov ah,4ch int 21hpr1 db Input a character:$pr2 db 0ah,0dh,ASCII_binary:$cseg ends end start例2(p133-1.asm)统计一个字符串的数字符、英文字母的个数和字符的长度。程序由多个子程序实现的.功能划分为:在主程序中完成字符串的输入和统计工作,显示结果是在主程序中调用子程序完成的有一个DISPAL子程序,负责把统计值转换为十进制数的ASCII码并显示出来,由主程序调用有一个ECHOCH子程序,负责显示一个字符,在DISPAL中调用有一个DISPMESS子程序,负责显示一字
45、符串,在主程序中调用有一个NEWLINE子程序,完成回车换行操作,在主程序中调用mlength=128 ;缓冲区长度dseg segmentbuff db mlength,0,mlength dup(0)mess0 db Please input:$mess1 db Length=$mess2 db Number_char x=$mess3 db English_char y=$dseg endscseg segment assume cs:cseg,ds:dsegstart: mov ax,dseg mov ds,ax mov dx,offset mess0 call dispmess;调用字符串显示过程 mov dx,offset buff mov ah,0ah int 21h ;键盘输入一字符串 call newline;调用回车换行过程 xor bx,bx ;清计数器 mov cl,buff+1;取字串长度
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 IEC 60335-2-11:2024 EXV-CMV EN Household and similar electrical appliances - Safety - Part 2-11: Particular requirements for tumble dryers
- 农业生态修复与环境治理合作合同
- 外墙涂料买卖合同
- 生物技术基因工程知识题集及解析
- 化学工程与工艺专业基础试题集
- 六一儿童节探访活动方案
- 六一公司团建音乐活动方案
- 六一商城活动方案
- 六一孕妇店活动方案
- 六一抢牛奶活动方案
- 实验题(7大类42题)原卷版-2025年中考化学二轮复习热点题型专项训练
- CJ/T 362-2011城镇污水处理厂污泥处置林地用泥质
- 2025安全宣传咨询日活动知识手册
- DB31/T 1249-2020医疗废物卫生管理规范
- 四川省宜宾市翠屏区2025届数学七下期末综合测试试题含解析
- 乡镇合法性审查工作报告
- 宁波大学《通信原理》期末考试试题
- 生命体征监测技术操作考核评分标准
- 第三章混合策略纳什均衡ppt课件
- 粉尘浓度和分散度测定
- 一年级成长档案
评论
0/150
提交评论