汇编语言笔记实验13编写应用中断例程
汇编语言笔记实验13编写应用中断例程
0x00 为什么又没有实验12?
因为实验12的任务是完成第12章中内容部分的操作,已经在《笔记12》中完成了!
0x01 任务一

上代码!
assume cs:code
data segment
db 'welcome to masm! ',0
data ends
code segment
start: mov ax,cs
mov ds,ax
mov si,offset do7c
mov ax,0
mov es,ax
mov di,200h
mov cx,offset do7c_e-offset do7c
cld
rep movsb
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
do7c: push es
push di
push si
push ax
push bx
mov bl,cl
mov ax,0b800h
mov es,ax
mov al,160
mul dh
add dl,dl
mov dh,0
add ax,dx;计算出偏移地址
mov di,ax
s: mov cl,ds:[si]
mov ch,0
jcxz fin
mov es:[di],cl
mov es:[di+1],bl
add di,2
inc si
jmp short s
fin: pop bx
pop ax
pop si
pop di
pop es
iret
do7c_e: nop
code ends
end start

上述代码运行正确
0x02 任务二


这个程序 在《笔记13》也就是13章中写过啊,在写一次就当熟悉把:
assume cs:code
code segment
start: mov ax,cs
mov ds,ax
mov si,offset do7c
mov ax,0
mov es,ax
mov di,200h
mov cx,offset do7c_e-offset do7c
cld;让si di自动递增
rep movsb
mov word ptr es:[7ch*4],200h
mov word ptr es:[7ch*4+2],0;安装完成
mov ax,0b800h
mov ds,ax
mov si,0
mov cx,80
mov bx,offset s-offset s1
s: mov byte ptr ds:[si+1920],'!';1920是160*12+0*2 12行0列
mov byte ptr ds:[si+1921],2;绿色
add si,2
int 7ch;跳转到s
s1: mov ax,4c00h
int 21h
do7c: push ax
push bp;栈顶 bp ax ip cs 标志
dec cx
cmp cx,0
je fin
mov bp,sp
mov ax,[bp+4];让栈中原ip到ax 原ip指向offset s1(执行到int 7ch 时ip早已经指向下一条了 所以是offset s1)
add ax,bx;ax=ax+bx=offset s1+offset s-offset s1=offset s所以会跳转到s
mov [bp+4],ax
fin: pop bp
pop ax
iret
do7c_e: nop
code ends
end start

上述代码运行正确
0x03 任务三


上述代码的思想应该是数据和代码完全分离的思想,数据和数据的地址都没有硬编码,而是放在data区,便于修改
dh是行号,那么应该是[si],然后后面inc si递增 dx是字符串首字符偏移地址,那么就是[bx],然后后面add bx,2 对应递增,完整代码如下:
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 10,12,14,16
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]
mov dl,40
mov ah,2
int 10h
mov dx,[bx]
mov ah,9
int 21h
inc si
add bx,2
loop ok
mov ax,4c00h
int 21h
code ends
end start

上述代码运行正确