王爽汇编(第三版)第13章实验13

 

(1)  编写并安装 int7ch 中段例程,功能为显示一个用0结束的字符串,中断例程安装在0:200处。

参数: (dh)=行号      ,(dl)=列号      ,(cl)=颜色,ds:si指向字符串地址

代码如下

assume cs:code

data segment
 db"welcome to masm!",0
data ends

code segment
start:   mov ax,0
         mov es,ax
         mov di,200h
		 mov ax,cs
		 mov ds,ax
		 mov si,offset show
		 mov cx,offset extra-offset show
		 cld            ;df设置为0,老是忘记加上去
		 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    ; 列数
		 mov cl,2     ;颜色,绿字黑底
		 mov ax,data
		 mov ds,ax
		 mov si,0
		 int 7ch
		 mov ax,4c00h
		 int 21h
		 
    show:mov ax,0b800h
	     mov es,ax
		 mov al,160
		 mul dh      ;结果保存在ax中
		 add dl,dl
		 sub dl,2
		 mov dh,0
		 add ax,dx
		 mov di,ax   ;内存地址位置=行数*160+列数*2-2  
		 
	   s:mov bh,ds:[si]
	     cmp bh,0     ;内存单元中以 00 结尾
		 je showend
		 mov es:[di],bh   ;字符
		 mov es:[di+1],cl   ;字体颜色
		 inc si
		 add di,2
		 jmp s
  showend:iret
    extra:nop   ;空(占位) 占一个字节
code ends
end start

(2)编写并安装int 7ch 中断例程,功能为完成loop指令的功能。

参数:(cx)=循环次数,(bx)=位移。  要求:在屏幕显示80个“!”

代码如下

assume cs:code
code segment
 start: mov ax,cs
        mov ds,ax
		mov di,200h
		mov ax,0
		mov es,ax
		mov si,offset circle
		mov cx,offset extra-offset circle
		cld
		rep movsb
		mov word ptr es:[7ch*4],200h
		mov word ptr es:[7ch*4+2],0

		mov ax,0b800h
		mov es,ax
		mov di,160*12
		mov bx,offset s-offset se   ;设置从标号se到标号s的转移位移
		mov cx,80
	  s:mov byte ptr es:[di],'!'
	    add di,2
		int 7ch     ;如果(cx)!= 0,转移至标号s处
	 se:nop
	    mov ax,4c00h
		int 21h

 circle:push bp         ;这里不一定要push bp 因为bp后面用不到。当然为了安全起见,大多数情况
        mov bp,sp       ;下都要把变量用栈的结构封起来。
		add [bp+2],bx
		dec cx          ;这里忘记cx不是会自己减的,当成loop,因此dec cx
		jcxz se
		pop bp
        iret
  extra:nop

code ends
end start

运行结果

(3)下面的程序,分别在屏幕的第2、4、6、8行显示4句英文诗,补全程序。

assume cs:code
code segment
  s1:  db'Good,better,best','$'
  s2:  db'Never let it rest','$'
  s3:  db'Till good is better.','$'
  s4:  db'And better,best.','$'
  s:   dw offset s1,offset s2,offset s3,offset s4
  row: db 2,4,6,8

  start:mov ax,cs
        mov ds,ax
		mov bx,offset s
		mov si,offset row
		mov cx,4
	 ok:mov bh,0
	    mov dh,cs:[si]    ;dh 放行号
		mov dl,0          ;dl 放列号
		mov ah,2
		int 10h

		mov dx,cs:[bx]    ;ds:dx指向字符串地址
		mov ah,9
		int 21h
		inc si
		add bx,2    ;两个字节=一个字
		loop ok
		mov ax,4c00h
		int 21h
code ends
end start

运行

cs,ip,栈的状态,自己观察。懂了程序就好了

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值