显示壹个用零结束的字符串
调用中断例程的程序
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/汇编语言王爽第三版答案
百度文库/汇编语言实验答案 (王爽)