(1)代码
第1种:用之前的方法,逐个字节复制ASCII,逐个填充属性单元。经验证正确
;实验13 ;功能:显示一个用0结尾的字符串 ;参数:ds:si指向源字符串,位置用dh显示行、dl显示列,cl为显示属性 ;返回值:无 assume cs:code data segment db 'welcome to masm!',0 data ends code segment start: ;安装程序 mov ax,code mov ds,ax mov si,offset str mov ax,0 mov es,ax mov di,200h mov cx,offset strend-offset str cld rep movsb ;设置中断向量表 mov ax,0 mov es,ax mov word ptr es:[7ch*4],200h mov word ptr es:[7ch*4+2],0 ;测试程序 mov dh,10 mov dl,10;接口中代表1列,显示缓冲区中代表2列 mov cl,2 mov ax,data mov ds,ax mov si,0 int 7ch mov ax,4c00h int 21h ;int 7ch str: push ax push cx push dx push es push si push di ;用之前的方法,逐个复制字符、逐个填充属性单元 mov ax,0b800h mov es,ax ;计算di mov al,160 mul dh mov dh,0 add dx,dx add ax,dx mov di,ax s: cmp byte ptr [si],0 je se mov al,[si] mov es:[di],al mov es:[di+1],cl inc si add di,2 jmp short s se: pop di pop si pop es pop dx pop cx pop ax iret strend: nop code ends end start
第2种:在int 7ch中循环调用int 10h,通过每次在光标处显示1个字符,前进光标并继续显示,直至显示完所有字符
;实验13 ;功能:显示一个用0结尾的字符串 ;参数:ds:si指向源字符串,位置用dh显示行、dl显示列,cl为显示属性 ;返回值:无 assume cs:code data segment db 'welcome to masm!',0 data ends code segment start: ;安装程序 mov ax,code mov ds,ax mov si,offset str mov ax,0 mov es,ax mov di,200h mov cx,offset strend-offset str cld rep movsb ;设置中断向量表 mov ax,0 mov es,ax mov word ptr es:[7ch*4],200h mov word ptr es:[7ch*4+2],0 ;测试程序 mov dh,10 mov dl,10;接口中代表1列,显示缓冲区中代表2列 mov cl,2 mov ax,data mov ds,ax mov si,0 int 7ch mov ax,4c00h int 21h ;int 7ch str: push ax push bx push cx push dx push es push si ;调用int 10h的9号子程序,逐个显示字符并指定属性(从而达到显示字符串的效果) s: mov ah,2 mov bh,0 ;dh,dl作为参数由外部赋值 int 10h;置光标 cmp byte ptr [si],0 je se ;不为0则调用int 10h的9号子程序 mov ah,9 mov al,[si] mov bl,cl mov bh,0 ;防止显示次数cx覆盖属性值cl,用前先备份,用完再还原 push cx mov cx,1 int 10h pop cx inc si inc dl;防止所有字符显示在同一光标处,最终只会显示最后1个字符“!” jmp short s se: pop si pop es pop dx pop cx pop bx pop ax iret strend: nop code ends end start
(2)代码
代码逻辑构架
;实验13-(2),用int 7ch完成loop指令功能 ;程序名称:int 7ch ;功能:作为中断例程,完成loop指令功能 ;参数:CX传递循环次数,BX传递位移 ;返回值:无 assume cs:code code segment start: ;安装程序 ;设置中断向量表 ;测试程序 mov ax,4c00h;传递参数 int 21h;调用中断例程 ;int 7ch code ends end start
第1种:
;实验13-(2),用int 7ch完成loop指令功能。使用jcxz ;程序名称:int 7ch ;功能:作为中断例程,完成loop指令功能 ;参数:CX传递循环次数,BX传递位移 ;返回值:无 assume cs:code code segment start: ;安装程序 mov ax,cs mov ds,ax mov si,offset lp mov ax,0 mov es,ax mov di,200h mov cx,offset lpe - offset lp;CX需要为正值 cld rep movsb ;设置中断向量表 mov ax,0 mov es,ax mov word ptr es:[7ch*4],200h mov word ptr es:[7ch*4+2],0 ;测试程序 mov ax,0b800h mov es,ax mov di,12*160;显示缓冲区的第13行的行首(第1列) mov bx,offset s - offset se;bx须是负值,因为是向后跳转 mov cx,80;手动指定,本例为80次 s: mov byte ptr es:[di],'!' add di,2 int 7ch se: nop mov ax,4c00h;传递参数 int 21h;调用中断例程 ;int 7ch lp: push bp dec cx jcxz lpend mov bp,sp add [bp+2],bx lpend: pop bp iret lpe: nop code ends end start
第2种
;实验13-(2),用int 7ch完成loop指令功能。使用cmp配合je ;程序名称:int 7ch ;功能:作为中断例程,完成loop指令功能 ;参数:CX传递循环次数,BX传递位移 ;返回值:无 assume cs:code code segment start: ;安装程序 mov ax,cs mov ds,ax mov si,offset lp mov ax,0 mov es,ax mov di,200h mov cx,offset lpe - offset lp;CX需要为正值 cld rep movsb ;设置中断向量表 mov ax,0 mov es,ax mov word ptr es:[7ch*4],200h mov word ptr es:[7ch*4+2],0 ;测试程序 mov ax,0b800h mov es,ax mov di,12*160;显示缓冲区的第13行的行首(第1列) mov bx,offset s - offset se;bx须是负值,因为是向后跳转 mov cx,80;手动指定,本例为80次 s: mov byte ptr es:[di],'!' add di,2 int 7ch se: nop mov ax,4c00h;传递参数 int 21h;调用中断例程 ;int 7ch lp: push bp dec cx cmp cx,0 je lpend mov bp,sp add [bp+2],bx lpend: pop bp iret lpe: nop code ends end start
(3)
用一个接受固定参数(数据类型)的子程序,处理多个类型相同但长度、位置不同的数据。类似于C++中的适配器,将不同数据转换为统一的“地址和行号”,交给子程序处理。