汇编语言实验13详细解析
建议先自己思考问题的答案,不懂则返回看书
(1)、编写并安装int 7ch中断例程,功能为显示一个用0结尾的字符串,中断例程安装在0:200处。
安装程序:DE13_1an.asm
assume cs:code
code segment
start:
;安装
mov ax,cs
mov ds,ax
mov si,offset display
mov ax,0
mov es,ax
mov di,200h
mov cx,offset displayend - offset display
cld
rep movsb
;设置向量
mov ax,0
mov es,ax
mov word ptr es:[7ch*4],200h
mov word ptr es:[7ch*4+2],0
mov ax,4c00h
int 21h
display:
mov ax,0b800h
mov es,ax
mov al,dh
dec al
mov ah,160
mul ah ;得到行偏移,ax中存放
mov dh,0
dec dl
add dl,dl ;得到列偏移,dx中存放
add ax,dx
mov di,ax
mov ah,00010100b
s:
cmp byte ptr ds:[si],0
je over
mov al,ds:[si]
mov es:[di],ax
inc si
inc di
inc di
jmp short s
over:
iret
displayend:
nop
code ends
end start
测试程序:DE13_17c.asm
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,0h
int 7ch
mov ax,4c00h
int 21h
code ends
end start
先执行安装程序,再执行测试程序,安装程序运行完毕后,重写的int 7ch中断例程已代替原有的中断例程,只要不重启DOSBox就一直保存着新的int 7ch 中断例程,就可以继续执行测试程序了。
此代码在DOSBox下的运行结果截图:
(2)编写并安装int 7ch中断例程,功能为完成loop指令的功能。
参数:(cx)=循环次数,(bx)=位移。
以上中断例程安装好后,对下面的程序进行单步跟踪,尤其注意int,iret指令执行前后cs,ip的和栈中的状态。
在屏幕中间显示80个 ‘!’。
安装程序:DE13_2an.asm
assume cs:code
code segment
start:
;安装
mov ax,cs
mov ds,ax
mov si,offset display
mov ax,0
mov es,ax
mov di,200h
mov cx,offset displayend - offset display
cld
rep movsb
;设置向量
mov ax,0
mov es,ax
mov word ptr es:[7ch*4],200h
mov word ptr es:[7ch*4+2],0
mov ax,4c00h
int 21h
display:
dec cx
jcxz displayover
push bp
mov bp,sp
add ss:[bp+2],bx
pop bp
displayover:
iret
displayend:
nop
code ends
end start
测试程序:DE13_27c.asm
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
此代码在DOSBox下的运行结果截图:
(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 beter,','$'
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,ds:[bx]
mov ah,9
int 21h
inc si
add bx,2
loop ok
mov ax,4c00h
int 21h
code ends
end start
此代码在DOSBox下的运行结果截图: