Demo entry 6356834

c

   

Submitted by anonymous on Apr 20, 2017 at 14:27
Language: reg. Code size: 1.5 kB.

data segment  ; 定义数据段
old_intlc dw 0,0  ; dw用于保存原中断服务地址
string db 'second$' ; 定义整段程序都用到的变量
count db 18  ; count统计“*”的打印次数
flag db 0  ; flag为1,表示应该打印“second”,否则打印“*”
data ends

code segment ; 定义代码段
assume cs:code, ds:data, es:data ; 配置一些寄存器地址
main proc far ; main程序
start:push ds    ; 设置数据段
	mov ax, 0
	push ax
	mov ax, data
	mov ds, ax
	
	cli  ; 设置中断标志位,禁止其它的中断 
	mov ax, 0 ; 以下6行代码用于保存原有中断向量的地址
	mov es, ax
	mov si, 4 * 1ch
	mov di, offset old_intlc
	mov ax, es:[si+2]
	mov [di+2], ax
	
	mov ax, 0 ; 以下7行代码插入new_intlc的地址
	mov es, ax
	mov di, 4 * 1ch
	mov ax, offset new_intlc
	mov es:[di], ax
	mov ax, seg new_intlc
	mov es:[di+2], ax
	sti  ; 设置中断标志位,允许其它的中断  
	
next:  call break ; 调用子程序break
	cmp flag, 1 ; 如果flag不为1, 重复执行next以下三行代码
	jnz next
	mov flag, 0 ; 恢复falg标志变量
	mov ah, 9 
	mov dx, offset string
	int 21h  ; 调用中断21 中断功能往屏幕上输出“second”
	jmp next ; 继续回去检测flag的值
main endp

new_intlc proc  ; new_intlc子程序
	mov ax, data
	mov ds, ax
	
	mov ah, 0eh ; 以下7行输出“*”并增加统计的次数
	mov al, '*'
	int 10h ; 调用中断10h的输出功能
	sub count, 1 ; 计算器count - 1
	jnz next2
	mov count, 18 ; 重置计算器
	mov flag, 1 ; 设置输出的标志位

next2:
	iret ; 中断返回,中断服务程序的最后一条指令

new_intlc endp

break proc near

	mov ah, 06h ; 重新执行段地址
	mov dl, 0ffh
	int 21h
	je return
	cli ; 数据的恢复工作,恢复过程中不允许打断
	mov ax, 0
	mov es, ax
	mov dl, 4 * 1ch
	mov si, offset old_intlc
	mov ax, [si]
	mov es:[di], ax
	mov ax, [si+2]
	mov es:[di+2], ax
	sti
	mov ax, 4c00h
	int 21h
return:ret
break endp

code ends
end start
	

This snippet took 0.01 seconds to highlight.

Back to the Entry List or Home.

Delete this entry (admin only).