汇编上机实验(泪)

计算两数和

 

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

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值