datarea segment count dw 1 msg db 'The bell is ringing',0dh,0ah,'$' datarea ends prognam segment main proc far assume cs:prognam,ds:datarea,es:datarea start: push ds sub ax,ax push ax mov ax,datarea mov ds,ax mov es,ax
;保存旧的中断向量 mov al,1ch ;1ch中断 mov ah,35h ;取中断向量,保存在es:bx里 int 21h push bx push es
;设置新的中断向量 push ds mov dx,offset ring ;ring的偏移地址 mov ax,seg ring ;ring的段地址 mov ds,ax ;ds:dx=段地址:偏移地址 mov al,1ch ;1ch中断 mov ah,25h ;设置中断向量 int 21h pop ds
;将21h端口的第0位清零,即打开定时器 in al,21h and al,11111110b out 21h,al sti ;设置中断标志,允许中断。
;循环20000*30000次,因为次数太多一个寄存器装不下 mov di,20000 delay: mov si,30000 delay1: dec si jnz delay1 dec di jnz delay
;重新设置回旧的中断向量 pop dx pop ds mov al,1ch mov ah,25h int 21h ret main endp ring proc near push ds push ax push cx push dx
mov ax,datarea mov ds,ax sti
dec count jnz exit ;打印消息'The bell is ringing' mov dx,offset msg mov ah,09h int 21h
mov dx,100 ;打开关闭的次数 in al,61h and al,0fch ;61h端口的第0、1位清0,分别是定时器2和扬声器脉冲门 sound: xor al,02 ;61h端口的第1位转置,扬声器脉冲门 out 61h,al
;等待,因为cpu比端口快的多 mov cx,1400h wait1: loop wait1 dec dx jne sound mov count,182 ;10s的铃响delay exit: cli pop dx pop cx pop ax pop ds iret ring endp prognam ends end start
datarea segment limit db 30 len db ? str db 30 dup('$') datarea ends prognam segment main proc far assume cs:prognam,ds:datarea,es:datarea start: push ds sub ax,ax push ax mov ax,datarea mov ds,ax mov es,ax
;输入字符串 lea dx,limit mov ah,0ah int 21h ;回车换行 mov dl,0dh mov ah,2 int 21h mov dl,0ah mov ah,2 int 21h ;di置为字符串长度减一,cx计数器置为字符串长度除以2 mov si,0 mov bl,len xor bh,bh mov di,bx dec di mov cx,1 ;除以2 shr bx,cl mov cx,bx rotate: mov al,str[si] mov bl,str[di] mov str[si],bl mov str[di],al inc si dec di loop rotate lea dx,str mov ah,9 int 21h ret main endp prognam ends end start
datarea segment str db "123456",'$' datarea ends prognam segment main proc far assume cs:prognam,ds:datarea,es:datarea start: push ds sub ax,ax push ax mov ax,datarea mov ds,ax mov es,ax
mov bx, offset str push bx call revers pop bx mov dl, [bx] mov ah, 2 int 21h
ret main endp revers proc near push bp mov bp, sp push ax push bx push dx mov bx, [bp+4] mov al, [bx] cmp al, '$' je return re_call: inc bx push bx call revers pop bx mov dl, [bx] mov ah, 2 int 21h return: pop dx pop bx pop ax pop bp ret revers endp
datarea segment sentence_label label byte sentence_max db 50 sentence_len db ? sentence db 50 dup('$') key_label label byte key_max db 30 key_len db ? key db 30 dup('$')
cmd1 db 'Input a sentence:','$' cmd2 db 'Input a keyword:','$' no_match_str db 'No match!',0dh,0ah,'$' match_str db "The location:",'$' crlf_str db 0dh,0ah,'$'
datarea ends prognam segment main proc far assume cs:prognam,ds:datarea,es:datarea start: push ds sub ax,ax push ax mov ax,datarea mov ds,ax mov es,ax loops: lea dx,cmd1 call cout call cin_sentence call crlf cmp sentence[0],3 ;比较ctrl+c je exit lea dx,cmd2 call cout call cin_key call crlf call compare jmp loops exit: ret main endp cin proc mov ah,0ah int 21h ret cin endp cin_sentence proc lea dx,sentence_label call cin ret cin_sentence endp cin_key proc lea dx,key_label call cin ret cin_key endp cout proc mov ah,09h int 21h ret cout endp crlf proc lea dx,crlf_str call cout ret crlf endp compare proc ;cx=sentence_len-key_len+1 xor ch,ch xor dh,dh xor bx,bx mov cl,sentence_len mov dl,sentence_len sub cx,dx inc cx rotate: lea si,sentence[bx] lea di,key mov cl,key_len xor ch,ch cld rep cmpsb jz match inc bx loop rotate no_match: lea dx,no_match_str call cout ret match: lea dx,match_str call cout call print_dec call crlf