计算两数和
DATAS SEGMENT
TISHI DB 'The result is:','$'
string1 db '25','$'
string2 db '74','$'
DATAS ENDS
STACKS SEGMENT
db 128 dup(?)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV DX,OFFSET TISHI
mov ah,9
int 21h
mov bl,10
mov al,string1
sub al,30h
mul bl
mov bl,string1+1
sub bl,30h
add al,bl
mov bh,al
mov bl,10
mov al,string2
sub al,30h
mul bl
mov bl,string2+1
sub bl,30h
add al,bl
add al,bh
cbw
mov bl,10
div bl
mov bh,ah
add al,30h
mov dl,al
mov ah,2
int 21h
add bh,30h
mov dl,bh
mov ah,2
int 21h
MOV AH,4CH
INT 21H
CODES ENDS
END START
小写转大写
DATAS SEGMENT
tishi db 'enter data: ','$'
result db 'The result is :','$'
char db ?
crlf DB 0AH,0DH,"$"
DATAS ENDS
STACKS SEGMENT
db 128 dup (?)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
lea dx,tishi
mov ah,09h
int 21h
mov ah,1
int 21h
mov char,al
sub char,32
lea dx,crlf
mov ah,09h
int 21h
lea dx,result
mov ah,09h
int 21h
mov dl,char
mov ah,2
int 21h
MOV AH,4CH
INT 21H
CODES ENDS
END START
字符串小写转大写
DATAS SEGMENT ;从键盘输入一个小写字母,转换成大写字母,其他字符保持不变
;此处输入数据段代码
inf db 0DH,0AH,"Please input a string:$"
outf db 0DH,0AH,"The result string is:$"
;err db 0DH,0AH,"Input error!,Please input again!$"
buf1 db 81,?,81 dup(0)
buf2 db 81 dup(0)
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
LEA DX,INF
MOV AH,09H
INT 21H;在屏幕显示字符串
MOV AH,0AH
LEA DX,BUF1
INT 21H
LEA SI,BUF1
MOV CL,[SI+1]
MOV CH,0
MOV DI,OFFSET BUF2
L1: MOV AL,[SI+2]
CMP AL,'a'
JL L2
CMP AL,'z'
JG L2
sub AL,20H
L2: MOV [DI],AL
INC SI
INC DI
LOOP L1
MOV BYTE PTR[DI],'$'
LEA DX,OUTF
MOV AH,09H
INT 21H
LEA DX,BUF2
MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
字母前后输出
DATAS SEGMENT
char db ?
string1 db 'imput your word:','$'
a db 'aab','$'
z db 'yzz','$'
CRLF DB 0AH,0DH,"$"
tishi db 'The result is:','$'
cuowu db 'qing bu yao luan shu !','$'
DATAS ENDS
STACKS SEGMENT
db 128 dup (?)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
lea dx,string1
mov ah,09h
int 21h
MOV AH,1 ;进行输入
INT 21H
lea dx,CRLF
mov ah,9
int 21h
lea dx,tishi
mov ah,9
int 21h
MOV CHAR,AL
cmp char,'a'
js wrong
jz f1
cmp char,'z'
jns wrong
jz f2
sub char,1
mov AH,2 ;进行输出
MOV DL,CHAR
INT 21H
add char,1
mov AH,2 ;进行输出
MOV DL,CHAR
INT 21H
add char,1
mov AH,2 ;进行输出
MOV DL,CHAR
INT 21H
jmp en
f1:lea dx,a
mov ah,09H
int 21h
jmp en
f2:lea dx,z
mov ah,09h
int 21h
jmp en
wrong: lea dx,cuowu
mov ah,09h
int 21h
jmp en
en:MOV AH,4CH
INT 21H
CODES ENDS
END START
键盘字符串输入输出
DATAS SEGMENT
BUF DB 20
DB ?
DB 20 DUP (?)
shuru db 'enter data:','$'
tishi db 'then:','$'
CRLF DB 0AH,0DH,"$"
DATAS ENDS
STACKS SEGMENT
db 200 dup(?)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
lea dx,shuru
mov ah,9
int 21h
MOV AH,10
LEA DX,BUF
INT 21H
LEA DX,CRLF
MOV AH,9
INT 21H
lea dx,tishi
mov ah,9
int 21h
MOV CL,BUF+1
LEA SI,BUF+2
NEXT: MOV DL,[SI]
MOV AH,2
INT 21H
INC SI
DEC CL
JNZ NEXT ;循环输出
mov dl,'$'
mov ah,2
int 21h
MOV AH,4CH
INT 21H
CODES ENDS
END START
字符串长度输出
DATAS SEGMENT
string db 20
db ?
db 20 dup(?)
shuru db 'enter data:','$'
CRLF DB 0AH,0DH,"$";回车换行;此处输入数据段代码
tishi db 'The length of string:','$'
DATAS ENDS
STACKS SEGMENT
db 200 dup(?)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
lea dx,shuru
mov ah,9
int 21h
MOV AH,10
LEA DX,string
INT 21H
LEA DX,CRLF
MOV AH,9
INT 21H
lea dx,tishi
mov ah,9
int 21h
mov dl,string+1
add dl,30h
mov ah,2
int 21h
MOV AH,4CH
INT 21H
CODES ENDS
END START
从键盘接收十进制数并存入 BX
newchar: mov ah, 1
int 21h
sub al, 30h
jl exit ; <0退出
cmp al, 9
jg exit ; >9退出
cbw
xchg ax, bx
mov cx, 10
mul cx
xchg ax, bx
add bx, ax
jmp newchar
计算器
DATAS SEGMENT
string1 db 'imput your date1:','$'
string2 db 'imput your sign:','$'
string3 db 'imput your date2:','$'
string4 db 'The result is:','$'
CRLF DB 0AH,0DH,"$"
fu1 db ?
fu2 db ?
shu1 dw ?
shu2 dw ?
char db ?
DATAS ENDS
STACKS SEGMENT
db 128 dup(?)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
lea dx,string1
mov ah,09h
int 21h
newchar: mov ah, 1
int 21h
cmp al,13
jz panduan1
cmp al,'-'
jz fuzhi1
again1:sub al, 30h
jl exit ; <0退出
cmp al, 9
jg exit ; >9退出
cbw
xchg ax, bx
mov cx, 10
mul cx
xchg ax, bx
add bx, ax
jmp newchar
fuzhi1:mov fu1,1
mov al,0
jmp newchar
panduan1:cmp fu1,1
jnz fuhao
neg bx
fuhao:lea dx,string2
mov ah,09h
int 21h
mov shu1,bx
mov ah,1
int 21h
mov char,al
mov bx,0
lea dx,CRLF
mov ah,09h
int 21h
lea dx,string3
mov ah,09h
int 21h
newchar2:
mov ah, 1
int 21h
cmp al,13
jz panduan2
cmp al,'-'
jz fuzhi2
sub al, 30h
jle exit ; <0退出
cmp al, 9
jg exit ; >9退出
cmp al,'0'
jz exit
cbw
xchg ax, bx
mov cx, 10
mul cx
xchg ax, bx
add bx, ax
jmp newchar2
fuzhi2:mov fu2,1
mov al,0
jmp newchar2
panduan2:cmp fu2,1
jnz jisuan
neg bx
jisuan:mov cx,bx
mov bx,shu1
cmp char,'+'
jz jia
cmp char,'-'
jz jian
cmp char,'*'
jz cheng
cmp char,'/'
jz chu
jia: add bx,cx
jmp result
jian:sub bx,cx
jmp result
cheng: mov ax,bx
mul cx
mov bx,ax
jmp result
chu: neg bx
mov ax,bx
div cx
neg ax
mov bx,ax
jmp result
result:lea dx,string4
mov ah,09h
int 21h
cmp bx,0
jnl f1
neg bx
mov AH,2 ;进行输出
MOV DL,'-'
INT 21H
f1:call binidec
exit: MOV AH,4CH
INT 21H
binidec proc near ; 2?10
mov cx, 10000d
call dec_div
mov cx, 1000d
call dec_div
mov cx, 100d
call dec_div
mov cx, 10d
call dec_div
mov cx, 1d
call dec_div
ret
binidec endp
dec_div proc near
mov ax, bx
mov dx, 0
div cx
mov bx, dx
mov dl, al
add dl, 30h
mov ah, 2
int 21h
ret
dec_div endp
CODES ENDS
END START
统计输入数正数和 负数数量
DATAS SEGMENT
string1 db 'imput your date:','$'
string2 db 'fushu de ge shu shi:','$'
string3 db 'zheng shu zong he wei:','$'
he dw ?
sl db ?
fu1 db ?
CRLF DB 0AH,0DH,"$"
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
lea dx,string1
mov ah,09h
int 21h
mov ch,20
mov he,0
mov sl,0
newchar: mov ah, 1
int 21h
cmp al,' '
jz panduan1
cmp al,'-'
jz fuzhi1
sub al, 30h
jl exit ; <0退出
cmp al, 9
jg exit ; >9退出
cbw
xchg ax, bx
mov cl, 10
mul cl
xchg ax, bx
add bx, ax
jmp newchar
fuzhi1:mov fu1,1
mov al,0
jmp newchar
panduan1:cmp fu1,1
jnz chuli
neg bx
chuli: cmp bx,0
jnl f1
jl f2
f1: mov ax,he
add ax,bx
mov he,ax
mov bx,0
jmp en ;计算和
f2: mov al,sl
inc al
mov sl,al ;数量+1
mov bx,0
en: dec ch
mov fu1,0
jnz newchar
lea dx,CRLF
mov ah,09h
int 21h
lea dx,string2
mov ah,09h
int 21h
mov dl,sl
add dl,30h
mov ah,2
int 21h
lea dx,CRLF
mov ah,09h
int 21h
lea dx,string3
mov ah,09h
int 21h
mov bx,he
call binidec
exit:MOV AH,4CH
INT 21H
binidec proc near ; 2?10
mov cx, 10000d
call dec_div
mov cx, 1000d
call dec_div
mov cx, 100d
call dec_div
mov cx, 10d
call dec_div
mov cx, 1d
call dec_div
ret
binidec endp
dec_div proc near
mov ax, bx
mov dx, 0
div cx
mov bx, dx
mov dl, al
add dl, 30h
mov ah, 2
int 21h
ret
dec_div endp
CODES ENDS
END START
运用宏
DATAS SEGMENT
;此处输入数据段代码
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
nn MACRO F1,F2
add F1,F2
ENDM
mov ax,25
mov bx,25
nn AX,BX
mov dl,al
mov ah,2
int 21h
MOV AH,4CH
INT 21H
CODES ENDS
END START
dos MACRO n,buf
ife n
exitm
endif
ifdef buf
lea dx,buf
mov ah,n
int 21h
endif
ENDM
堆栈使用
DATAS SEGMENT
;此处输入数据段代码
DATAS ENDS
STACKS SEGMENT
db 128 dup(0)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
mov al,50
push ax
pop dx
mov ah,2
int 21h
MOV AH,4CH
INT 21H
CODES ENDS
END START
字符串处理
DATAS SEGMENT
BUF DB 20
DB ?
DB 20 DUP (?)
shuru db 'enter data:','$'
tishi db 'then:','$'
CRLF DB 0AH,0DH,"$"
DATAS ENDS
STACKS SEGMENT
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
dos MACRO n,buf
ife n
exitm
endif
ifdef buf
lea dx,buf
mov ah,n
int 21h
endif
ENDM
bj MACRO F1,F2
cmp dl,F1
jle F2
ENDM
dos 9,shuru
dos 10,BUF
dos 9,CRLF
dos 9,tishi
MOV CL,BUF+1
LEA SI,BUF+2
NEXT: MOV DL,[SI]
bj '/',qita
bj '9',shuzi
bj '@',qita
bj 'Z',daxie
bj 96,qita
bj 'z',xiaoxie
bj 127,qita
chuli:MOV AH,2
INT 21H
INC SI
DEC CL
JNZ NEXT ;循环输出
jmp en
xiaoxie:sub dl,32
jmp chuli
daxie:add dl,32
jmp chuli
shuzi:mov dl,78
jmp chuli
qita:mov dl,79
jmp chuli
en:MOV AH,4CH
INT 21H
CODES ENDS
END START
带*的字符串处理
DATAS SEGMENT
string db 128
db ?
db 128 dup(?)
tishi db 'imput your data:','$'
tishi2 db 'decide your choice:1qm,2zj,3hm,4qb,5tc','$'
tishi3 db 'out your data:','$'
tishi4 db 'there is no result','$'
qms db ?
hms db ?
CRLF DB 0AH,0DH,"$"
DATAS ENDS
STACKS SEGMENT
db 200 dup(?)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
dos MACRO n,buf
ife n
exitm
endif
ifdef buf
lea dx,buf
mov ah,n
int 21h
endif
ENDM
bj MACRO F1,F2
cmp al,F1
jz F2
ENDM
dos 9,tishi
dos 10,string
en: dos 9,CRLF
dos 9,tishi2
dos 9,CRLF
mov ah,1
int 21h
dos 9,CRLF
dos 9,tishi3
MOV CL,string+1
LEA SI,string+2
bj '1',qm
bj '2',zj
bj '3',hm
bj '4',qb
bj '5',tc
qm:call chuli1
jmp en
zj:call chuli2
jmp en
hm:call chuli3
jmp en
qb:call chuli4
jmp en
tc:dos 9,tishi4
MOV AH,4CH
INT 21H
chuli1 proc near
f1:mov dl,[si]
cmp dl,'*'
jnz nn1
inc si
dec cl
jmp f1
nn1:call shuchu
ret
chuli1 endp
chuli2 proc near
SUB cl,1
add si,cx
mov al,0
f2:mov dl,[si]
cmp dl,'*'
jnz nn2
inc bl;后面的*数量
dec si
dec cl
jmp f2
nn2:inc cl
LEA SI,string+2
mov al,0
f2a: mov dl,[si]
cmp dl,'*'
jnz nn2a
inc al;前面的*数量
inc si
dec cl
jmp f2a
nn2a: mov qms,al
mov hms,bl
mov dl,'*'
mov bl,qms
again1: mov ah,2
int 21h
dec bl
jnz again1
LEA SI,string+2
mov ah,0
mov al,qms
add si,ax
call chuli4
mov dl,'*'
mov bl,hms
again: mov ah,2
int 21h
dec bl
jnz again
ret
chuli2 endp
chuli3 proc near
SUB cl,1
add si,cx
f3:mov dl,[si]
cmp dl,'*'
jnz nn3
dec si
dec cl
jmp f3
nn3:add cl,1
LEA SI,string+2
call shuchu
ret
chuli3 endp
chuli4 proc near
NEXT4: MOV DL,[SI]
cmp dl,'*'
jz nn4
MOV AH,2
INT 21H
nn4:INC SI
DEC CL
JNZ NEXT4
ret
chuli4 endp
shuchu proc near
NEXT: MOV DL,[SI]
MOV AH,2
INT 21H
INC SI
DEC CL
JNZ NEXT
ret
shuchu endp
CODES ENDS
END START
add al,30h
mov AH,2 ;进行输出
MOV DL,al
INT 21H
字符串统计处理
DATAS SEGMENT
BUF DB 100
DB ?
DB 100 DUP (?)
BUF2 DB 200
DB ?
DB 200 DUP (?)
shuru db 'Imput data:','$'
tishi db 'The statistical result is:','$'
tishi2 db 'the number of qita daxie xiaoxie shuzi is :','$'
sl db ?
ybsl db ?
zds db ?
qts db ?
dxs db ?
xxs db ?
szs db ?
CRLF DB 0AH,0DH,"$"
DATAS ENDS
STACKS SEGMENT
db 200 dup(?)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
dos MACRO n,buf
ife n
exitm
endif
ifdef buf
lea dx,buf
mov ah,n
int 21h
endif
ENDM
dos0 macro f1
mov dl,f1
mov ah,2
int 21h
endm
dos 9,shuru
dos 10,buf
dos 9,crlf
call tj ;调用统计函数
MOV CL,BUF+1
LEA SI,BUF+2
lea di,buf2+2
mov dl,[si]
mov [di],dl
mov bl,1
mov [di+1],bl;赋初值
mov sl,0
again:call bjzx
inc si
loop again
dos 9,tishi
MOV CL,sl
LEA di,BUF2+2
NEXT0: MOV DL,[dI]
MOV AH,2
INT 21H
INC dI
DEC CL
JNZ NEXT0 ;循环输出
mov al,sl
mov cl,1
SAR al,cl
mov ybsl,al
call zzd ;找最大数量
call jysc ;减一输出
MOV AH,4CH
INT 21H
bjzx proc near
lea di,buf2+2
mov al,sl
cmp al,0
jz n
push cx
mov cl,1
SAR al,cl
pop cx
next:
mov dl,[di]
cmp dl,[si]
jz xt
add di,2
dec al
jnz next
mov dl,[si];不同增加新项
mov [di],dl
mov bl,1
mov [di+1],bl
n:mov al,sl
add al,2
mov sl,al
rs:ret
xt:mov bl,[di+1]
add bl,1
mov [di+1],bl;相同则在后面+1
jmp rs
bjzx endp
zzd proc near ;找最大给dl
lea di,buf2+2
mov dl,[di+1]
add di,3
next3:cmp dl,[di]
jnl xy
mov dl,[di]
xy:add di,2
dec al
jnz next3
ret
zzd endp
jysc proc near
mov zds,dl
mov bh,zds
next5:mov bl,bh
mov cl,ybsl
lea di,buf2+3
next6:cmp bl,[di]
jnz bsc1
push bx
dos 9,crlf
mov bl,bh
mov bh,0
call binidec
pop bx
dos0 ':'
jmp fur
bsc1:add di,2
dec cl
jnz next6
dec bh
jnz next5
jmp en1 ;判断有没有个数为bh的数
fur: mov cl,ybsl
lea di,buf2+3
next4:cmp bl,[di]
jnz bsc
dec di
dos0 [di] ;输出个数
inc di
dos0 ' '
bsc:add di,2
dec cl
jnz next4
dec bh
jnz next5
en1:ret
jysc endp
tj proc near
bj MACRO F1,F2
cmp dl,F1
jle F2
ENDM
jy macro f1
mov al,f1
inc al
mov f1,al
endm
spsc macro f1
mov bl,f1
mov bh,0
call binidec
dos0 ' '
endm
mov al,0
mov qts,al
mov dxs,al
mov xxs,al
mov szs,al
MOV CL,BUF+1
LEA SI,BUF+2
NEXT7: MOV DL,[SI]
bj '/',qita
bj '9',shuzi
bj '@',qita
bj 'Z',daxie
bj 96,qita
bj 'z',xiaoxie
bj 127,qita
chuli: inc si
DEC CL
JNZ NEXT7
dos 9,tishi2
spsc qts
spsc dxs
spsc xxs
spsc szs
dos 9,crlf
ret
xiaoxie:jy xxs
jmp chuli
daxie:jy dxs
jmp chuli
shuzi:jy szs
jmp chuli
qita: jy qts
jmp chuli
tj endp
binidec proc near ; 2?10
mov cx, 10000d
call dec_div
mov cx, 1000d
call dec_div
mov cx, 100d
call dec_div
mov cx, 10d
call dec_div
mov cx, 1d
call dec_div
ret
binidec endp
dec_div proc near
mov ax, bx
mov dx, 0
div cx
mov bx, dx
mov dl, al
add dl, 30h
mov ah, 2
int 21h
ret
dec_div endp
CODES ENDS
END START
播放音乐
data segment
CRLF DB 0AH,0DH,"$"
tishi db 'make your choice:',0ah,0dh
db 'A:music1,B:music2,C:music3,space:exit','$'
tishi2 db 'imput error!','$'
infor1 db 0Dh, 0AH, "welocom you to come here listeng! $"
mus_freg dw 330,294,262,294,3 dup (330) ;频率表
dw 3 dup (294),330,392,392
dw 330,294,262,294,4 dup (330)
dw 294,294,330,294,262,-1
mus_time dw 6 dup (25),50 ;节拍表
dw 2 dup (25,25,50)
dw 12 dup (25),100
mus_freg2 dw 330,392,330,294,330,392,330,294,330
dw 330,392,330,294,262,294,330,392,294
dw 262,262,220,196,196,220,262,294,332,262,-1
mus_time2 dw 3 dup(50),25,25,50,25,25,100
dw 2 dup(50,50,25,25),100
dw 3 dup(50,25,25),100
mus_freg3 dw 262,294,330,262
dw 262,294,330,262
dw 330,349,392
dw 330,349,392
dw 392,440,392,349,330,262
dw 392,440,392,349,330,262
dw 294,196,262
dw 294,196,262,-1
mus_time3 dw 50,50,100,100,100
dw 100,100,50,50,100,100
dw 100,100,100,50,50,100
dw 100,100,100,100,100,50
dw 50,100,100,100,100,100
dw 50,100,100,100,100,100
data ends
;栈段定义
stack segment stack
db 200 dup(?)
stack ends
;--------字符串输出宏----------
SHOWBM MACRO b
LEA DX,b
MOV AH,9
INT 21H
ENDM
;----------音乐地址宏-----------
ADDRESS MACRO A,B
LEA SI,A
LEA BP,DS:B
ENDM
;-------------------------------
bj macro f1,f2
cmp al,f1
jz f2
endm
;代码段定义
code segment
assume ds:data, ss:stack, cs:code
start:
mov ax, data
mov ds, ax
mov ax, stack
mov ss, ax
mov sp, 200
showbm infor1
again:
showbm crlf
showbm tishi
showbm crlf
mov ah,1
int 21h
bj ' ',exit
bj 'A',chuli2
bj 'B',chuli2
bj 'C',chuli3
showbm crlf
showbm tishi2
jmp again
then:call music
jmp again
chuli1:address mus_freg, mus_time
jmp then
chuli2:address mus_freg2, mus_time2
jmp then
chuli3:address mus_freg3, mus_time3
jmp then
exit:
mov ah, 4cH
int 21h
;--------------发声调用函数----------------
music proc near
xor ax, ax
freg:
mov di, [si]
cmp di, 0FFFFH
je end_mus
mov bx, ds:[bp]
call gensound
add si, 2
add bp, 2
jmp freg
end_mus:
ret
music endp
;------------发声-------------
gensound proc near
push ax
push bx
push cx
push dx
push di
mov al, 0b6H
out 43h, al
mov dx, 12h
mov ax, 34dch
div di
out 42h, al
mov al, ah
out 42h, al
in al, 61h
mov ah, al
or al, 3
out 61h, al ;打开扬声器
wait1:
mov cx, 3000
call waitf ;调节中间循环次数,从而调节播放速度
dec bx
jnz wait1
mov al, ah
out 61h, al;关闭扬声器
pop di
pop dx
pop cx
pop bx
pop ax
ret
gensound endp
;--------------------------
waitf proc near
push ax
waitf1:
in al,61h
and al,10h
cmp al,ah
je waitf1
mov ah,al
loop waitf1
pop ax
ret
waitf endp
code ends
end start
小车
DATAS SEGMENT
;此处输入数据段代码
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
WR MACRO CHA,ATR,NUM
MOV AH,2
INT 10H
MOV AL,CHA
MOV CX,NUM
MOV BL,ATR
MOV AH,9
INT 10H
ENDM
CODE SEGMENT
ASSUME CS:CODE
MAIN PROC FAR
CAR:
mov ah,0
mov al,3
INT 10H
routh: mov cx,18
LOP1:
MOV SI,0102h
LOP2:push cx
MOV DX,SI
WR 0DBH,0ch,5
INC DH
SUB DL,4
WR 0dbH,30h,2
add dl,2
wr 0DBH,0ch,8
add dl,8
wr 001h,30h,2
INC DH
sub dl,7
WR 09H,8EH,1
ADD DL,6
WR 9,8EH,1
CALL DELAY
JMP CURSER_XY
OVER: MOV AH,4CH
INT 21H
CURSER_XY:
MOV DX,SI
CALL CLEAR
MOV DX,SI
INC DH
add dl,4
MOV SI,DX
pop cx
dec cx
jz routh
CMP SI,5050H
JB LOP2
MAIN ENDP
CLEAR PROC NEAR
WR 0,0,5
INC DH
SUB DL,4
WR 0,0,2
add dl,2
wr 0,0,8
add dl,8
wr 0,0,2
INC DH
sub dl,7
WR 0,0,1
ADD DL,6
WR 0,0,1
RET
CLEAR ENDP
DELAY PROC NEAR
MOV CX,0FFFFH
LOOP $
MOV CX,0FFFFH
LOOP $
MOV CX,0FFFFH
LOOP $
MOV CX,0FFFFH
LOOP $
MOV CX,0FFFFH
LOOP $
MOV CX,0FFFFH
LOOP $
MOV CX,0FFFFH
LOOP $
RET
DELAY ENDP
CODE ENDS
END MAIN