[Chapter 13] - [实验13]

(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++中的适配器,将不同数据转换为统一的“地址和行号”,交给子程序处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值