(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,栈的状态,自己观察。懂了程序就好了