汇编语言实验16编写包含多个功能的子程序的中断例程

汇编语言实验16编写包含多个功能的子程序的中断例程

0x00 任务一

QQ截图20200609150437

QQ截图20200609150747

assume cs:code,ss:stack
stack segment
		db 128 dup (0)
stack ends
code segment
start:	mov ax,stack
		mov ss,ax
		mov sp,128
		
		mov ax,cs
		mov ds,ax
		mov si,offset do7c
		mov ax,0
		mov es,ax
		mov di,200h
		mov cx,offset do7ce-offset do7c
		cld
		rep movsb
		mov word ptr es:[7ch*4],200h
		mov word ptr es:[7ch*4+2],0;安装好了
		mov ax,307h
		int 7ch
		mov ax,4c00h
		int 21h
		
do7c:	jmp short begin
table:		 dw offset sub1-offset do7c+200h,offset sub2-offset do7c+200h,offset sub3-offset do7c+200h,offset sub4-offset do7c+200h
begin:		push ax
		push bx
		push cx
		push es
		push si
		push dx
		cmp ah,3
		ja over
		mov bl,ah
		mov bh,0
		add bx,bx
		mov dx,0b800h
		mov es,dx
		call word ptr cs:[offset table-offset do7c+200h+bx]
over:		pop dx
		pop si
		pop es
		pop cx
		pop bx
		pop ax
		iret	
sub1:	mov si,0
		mov cx,2000
sub1s:	mov byte ptr es:[si],32
		add si,2
		loop sub1s
		ret
sub2:		mov si,1
		mov cx,200
sub2s:		and byte ptr es:[si],11111000b
		or es:[si],al
		add si,2
		loop sub2s
		ret
sub3:		mov si,1
		mov cx,2000
		shl al,1
		shl al,1
		shl al,1
		shl al,1
sub3s:		and byte ptr es:[si],10000000b
		or es:[si],al
		add si,2
		loop sub3s
		ret
sub4:		mov si,160
		mov cx,2000
sub4s:		mov al,es:[si]
		mov es:[si-160],al
		add si,2
		loop sub4s
		ret
do7ce:	nop
code ends
end start

​ 上述代码运行正确,没有用数据标号,用的是地址标号offset,而且比较坑的是offset地址是编译时确定的,运行后不一定正确,要提前处理,数据标号试过,不知道为啥没用