# 2020-09-30 #「汇编语言 第 3 版 王爽」- 参考答案:实验 13 编写、应用中断例程
显示壹个用零结束的字符串
调用中断例程的程序
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
参考文献
K4NZ / 参考答案:实验 13 编写、应用中断例程
CSDN/汇编语言王爽第三版答案
百度文库/汇编语言实验答案 (王爽)