彙編語言(王爽)實驗十六

實驗十六

安裝一個新發int 7ch中斷例程,爲顯示輸出提供如下功能子程序

1、清屏

2、設置前景色

3、設置背景色

4、向上滾動一行

assume cs:code

code segment
	start:	mov ax,0
			mov es,ax
			mov ax,200h
			mov di,ax
			
			mov ax,cs
			mov ds,ax
			mov ax,offset int7c
			mov si,ax
			
			mov cx,offset int7c_end-offset int7c
			
			cld 
			rep movsb	; 複製代碼到內存中
			
			cli		; 避免受到可屏蔽中斷的影響
			mov ax,0	; 設置中斷向量表
			mov ds,ax
			mov word ptr ds:[07ch*4],200h
			mov word ptr ds:[07ch*4+2],0
			sti

			mov ax,4c00h
			int 21h
			
	int7c:	jmp short set
  			; 這裏要注意,在安裝程序中的sub1是一串數據,在中斷例程安裝在0:200h中時
  			; 如果仍然按照第十六章那樣設置,以是無法成功調用子程序的,因爲主程序運行完畢以後
  			; 主程序所佔的內存可能會被其他內容覆蓋,所以我們要把子程序安裝在中斷例程之後的內存中
  			; 當然這樣會存在一個問題,如果中斷例程並沒有安裝在0:200處,則table中的值也要相應改動
  			; 至於爲什麼子程序中的sub1s,sub2s以及loop指令還能正常工作,是因爲這是基於位移的跳轉
  			; 即在主程序中,相應的loop/jmp指令已經編譯爲回退/前進xx字節的指令,因此不會受位置移動的影響

  			table	dw sub1-int7c+200h,sub2-int7c+200h,sub3-int7c+200h,sub4-int7c+200h
  	
  	set:	push bx
  	
  			cmp ah,3	; 判斷功能號是否大於3
  			ja sret
  			mov bl,ah
  			mov bh,0
  			add bx,bx	; 根據ah提供的功能號找到對應子程序在table中的偏移
  			
  			push cs
  			pop ds
  			call word ptr [bx+200h+2]	; 調用
  			
  	sret:	pop bx
  			iret
  			
  	; 各個子程序的實現
	; 清屏
	sub1:	push bx
			push cx
			push es
			
			mov bx,0b800h
			mov es,bx
			mov bx,0
			
			mov cx,2000
   sub1s:	mov byte ptr es:[bx],' '
   			add bx,2
   			loop sub1s
   			
   			pop es
   			pop cx
   			pop bx
   			ret
   			
   			
   	; 設置前景色
    sub2:	push bx
			push cx
			push es
   			
			mov bx,0b800h
			mov es,bx
			mov bx,1
			mov cx,2000
			
   sub2s:	and byte ptr es:[bx],11111000b	; 第0、1、2位與前景色的有關
   											; 其他位和1與運算,保持不變
   			or es:[bx],al	;將前3位設置爲對應的顏色
   			add bx,2	; 奇數地址表示字符屬性
   			loop sub2s
   			
   			pop es
   			pop cx
   			pop bx
   			ret
   			
   	; 設置背景色
    sub3:	push bx
			push cx
			push es
			mov cl,4
			shl al,cl
   			
			mov bx,0b800h
			mov es,bx
			mov bx,1
			mov cx,2000
			
   sub3s:	and byte ptr es:[bx],10001111b	; 第4、5、6位與背景色的有關
   											; 其他位和1與運算,保持不變
   			or es:[bx],al	;設置爲對應的顏色
   			add bx,2	; 奇數地址表示字符屬性
   			loop sub3s
   			
   			pop es
   			pop cx
   			pop bx
   			ret
   			
   	; 向上滾動一行
   	sub4:	push cx
   			push si
   			push di
   			push es
   			push ds
   			
   			mov si,0b800h
   			mov es,si
   			mov ds,si
   			mov si,160		; ds:si指向第n+1行
   			mov di,0		; es:di指向第n行
   			cld
   			mov cx,24
   			
   sub4s:	push cx
   			mov cx,160
   			rep movsb		; 複製
   			pop cx
   			loop sub4s
   			
   			mov cx,80
   			mov si,0
   sub4s1:	mov byte ptr [160*24+si],' '	;最後一行清空
   			add si,2
   			loop sub4s1
   			
   			pop ds
   			pop es
   			pop di
   			pop si
   			pop cx
   			ret		

int7c_end:	nop
code ends
end start

測試子程序0

assume cs:code

code segment
	start:	mov ah,0
			;mas mov al,6
			int 7ch
			
			mov  ax,4c00h
			int 21h
code ends
end start

image-20200330140127368

image-20200330140208642

測試子程序1

assume cs:code

code segment
	start:	mov ah,
			mov al,6
			int 7ch
			
			mov  ax,4c00h
			int 21h
code ends
end start

image-20200330140527416

測試子程序2

assume cs:code

code segment
	start:	mov ah,2
			mov al,6
			int 7ch
			
			mov  ax,4c00h
			int 21h
code ends
end start

image-20200330140441773

測試子程序3

assume cs:code

code segment
	start:	mov ah,3
			int 7ch
			
			mov  ax,4c00h
			int 21h
code ends
end start

image-20200330140823652

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章