「汇编语言 第 3 版 王爽」- 参考答案:实验 13 编写、应用中断例程

  CREATE BY JENKINSBOT
原文链接:「汇编语言 第 3 版 王爽」- 参考答案:实验 13 编写、应用中断例程
文章分类:「01.Section_of_the_Computer_Hardware:1.CPU_-_Central_Processing_Unit:x86_Assembly_Language:ISBN_-_9787302333142:EXP_13」
文章标识:「dd88d8e3」

显示壹个用零结束的字符串

调用中断例程的程序

assume cs:code

data segment
	db 'Welcome to masm!', 0
data ends

code segment
start:	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 
		
code ends
end start

中断例程及安装程序

assume cs:code

code segment
		
	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	;; 编写中断例程
	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
show_str:
	push ax
	push es
	push dx
	push di
	push cx
	push si
	; 显存的写入地址
	mov ax, 0B800H
	mov es, ax
	; mov di, (dh - 1) x 80 x 2 + (dl - 1) x 2
	sub dh, 1
	mov al, 160
	mul dh ; ax
	sub dl, 1
	add dl, dl
	mov dh, 0
	add ax, dx
	sub ax, 2
	mov di, ax ; di = ax
	; 向显存写入字符串
	mov ch, cl 			; 颜色
	_loop_s0_start:
		mov cl, ds:[si]		; 字符
		cmp cl, 0
		je _loop_s0_end		; 为零则结束
		mov es:[di], cx		; 写入显存
		inc si
		add di, 2
		jmp short _loop_s0_start
	_loop_s0_end:
	pop si
	pop cx
	pop di
	pop dx
	pop es
	pop ax
	iret
show_str_end:

	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	;; 复制中断例程
	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
start:
	; 起始地址
	mov ax, cs
	mov ds, ax
	mov si, offset show_str ; 0
	; 目的地址
	mov ax, 0
	mov es, ax
	mov di, 0200H
	; 复制长度
	mov cx, offset show_str_end - offset show_str
	; 复制方向
	cld
	; 开始复制
	rep movsb
	
	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	;; 设置中断向量
	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	mov ax, 0000H
	mov ds, ax
	mov word ptr ds:[007CH * 4], 0200H
	mov word ptr ds:[007CH * 4 + 2], 0000H
	
	mov ax, 4C00H
	int 21H
	
code ends
end start

完成 LOOP 指令功能

调用中断例程的程序

assume cs:code

code segment
start:  mov ax, 0b800h
        mov es, ax
        mov di, 160*12

        mov bx, offset s-offset se
        mov cx, 80
	s:  mov byte ptr es:[di], '!'
        add di, 2
        int 7ch
	se: nop
        mov ax, 4c00h;
        int 21h
code ends

end start

中断例程及安装程序

assume cs:code

code segment
		
	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	;; 编写中断例程
	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
loop_emu:
	dec cx			; cx--
	jcxz loop_end	; 循环结束,直接返回
	push si			; 否则跳转到 s 偏移
	mov si, sp
	add ss:[si+2], bx
	pop si
	loop_end:
	iret
loop_emu_end:

	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	;; 复制中断例程
	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
start:
	; 起始地址
	mov ax, cs
	mov ds, ax
	mov si, offset loop_emu ; 0
	; 目的地址
	mov ax, 0
	mov es, ax
	mov di, 0200H
	; 复制长度
	mov cx, offset loop_emu_end - offset loop_emu
	; 复制方向
	cld
	; 开始复制
	rep movsb
	
	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	;; 设置中断向量
	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	mov ax, 0000H
	mov ds, ax
	mov word ptr ds:[007CH * 4], 0200H
	mov word ptr ds:[007CH * 4 + 2], 0000H
	
	mov ax, 4C00H
	int 21H
	
code ends
end start

显示英文诗,补全程序

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, ds:[si]		; 设置显示行号,这是中断例程的子程序的参数
		mov dl, 0
		mov ah, 2
		int 10h
		
		mov dx, [bx]
		mov ah, 9
		int 21h
		add bx, 2			; 使 bx 指向下处
		add si, 1			; 使 si 指向下处
		loop ok
		
		mov ax, 4c00h
		int 21h 
		

参考文献

CSDN/汇编语言王爽第三版答案
百度文库/汇编语言实验答案 (王爽)