汇编语言笔记实验13编写应用中断例程

汇编语言笔记实验13编写应用中断例程

0x00 为什么又没有实验12?

​ 因为实验12的任务是完成第12章中内容部分的操作,已经在《笔记12》中完成了!

0x01 任务一

QQ截图20200606154912

​ 上代码!

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

QQ截图20200606160513

​ 上述代码运行正确

0x02 任务二

QQ截图20200606160623

QQ截图20200606160654

​ 这个程序 在《笔记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

QQ截图20200606162158

​ 上述代码运行正确

0x03 任务三

QQ截图20200606162247

QQ截图20200606162257

​ 上述代码的思想应该是数据和代码完全分离的思想,数据和数据的地址都没有硬编码,而是放在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

QQ截图20200606164024

​ 上述代码运行正确