(1)
assume cs:code
data segment
db 'welcome to masm! ',0
data ends
code segment
start:
;设置ds:[si]指向源地址,即cs:[do0]
mov ax,cs
mov ds,ax
mov si,offset do7c
;设置es:[di]目的地址
mov ax,0
mov es,ax
mov di,200h
;设置cx为传输长度
mov cx,offset do7c_end-offset do7c
cld ;设置传输方向为正
rep movsb
;设置7c中断向量表指向0:200h
mov word ptr es:[7ch*4],200h
mov word ptr es:[7ch*4+2],0
;测试数据,dh=行号,dl=列号,cl=颜色
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
do7c:
push ax
push si
push es
push di
push dx
push cx
;es:di指向输出缓存区,di=ah*16+dl*2
mov ax,0b800h
mov es,ax
mov al,0A0h
mul dh
mov di,ax
mov al,2
mul dl
add di,ax
;放置数据
show:
mov al,ds:[si]
cmp al,0
je ok
mov es:[di],al
inc si
inc di
mov es:[di],cl
inc di
jmp short show
ok:
pop cx
pop dx
pop di
pop es
pop si
pop ax
iret
do7c_end: nop ;代码段结尾,便于计算7ch例程的长度
code ends
end start
(2)
assume cs:code
code segment
start: ;7cH中断例程的安装程序
mov ax, cs
mov ds, ax
mov si, offset lp ;将ds:si指向源地址(captial的机器码)
mov ax, 0000H
mov es, ax
mov di, 200H ;将es:di指向目的地址(0:200H向量表中)
mov cx, offset lpend - offset lp ;设置传输长度
cld ;传输方向为正
rep movsb ;字节传输
;设置中断向量表,使7cH条目中断向量指向0000:200H
mov ax, 0000H
mov es, ax
mov word ptr es:[7cH*4], 200H
mov word ptr es:[7cH*4+2], 0000H
mov ax, 4c00H
int 21H
lp: push bp ;将bp这个ss栈的偏址保存
mov bp, sp ;将当前栈顶指针值送入到bp
dec cx ;调用一次7cH,(cx)-1
jcxz lpret ;与(cx)值判断,如果为0,跳转到lpret标号
add [bp+2], bx ;修改ss栈中的从栈顶向下第2个单元的值
lpret: pop bp ;恢复bp值
iret ;返回到调用处。
lpend: nop ;代码段结尾,便于计算7cH例程的长度。
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,[si] ;dh放置行号
mov dl,10 ;dl放置列号
mov ah,2 ;调用10h号中断例程的二号子例程
int 10h
mov dx, [bx] ;dx中存放偏移地址
mov ah,9 ;调用21h号中断例程的9号子例程
int 21h
inc si ;准备下一次循环
add bx,2
loop ok
mov ax,4c00h
int 21h
code ends
end start