500分求解??先到先得!给分决不手软!!

kenfyk 2003-07-03 08:49:13
用TPC-H微机接口实验台实现音乐设计
要求:利用8255、8253芯片实现对乐谱的播放

下面是本人写的小程序:(用的是《友谊地久天长》的谱)
data segment use16
tabf dw -1,262,350,352,350,441,393,350,393,441
dw 350,352,441,525,589,588,589,525,441
dw 440,350,393,350,393,441,350,293,294,262
dw 350,589,525,441,440,350,393,350,393,589
dw 525,441,440,525,589,700,525,441,440,350
dw 393,350,393,441,350,294,292,262,350,0
tabt db 4,4,6,2,4,4,6,2,4,4
db 6,2,4,4,12,1,3,6,2
db 4,4,6,2,4,4,6,2,4,4
db 12,4,6,2,4,4,6,2,4,4
db 6,2,4,4,12,4,6,2,4,4
db 6,2,4,4,6,2,4,4,12
n equ 150000
data ends
code segment use16
assume cs:code,ds:data
beg: mov ax,data
mov ds,ax

open: in al,61h
or al,00000011b
out 61h,al
aga: mov si,offset tabf
mov di,offset tabt
last: cmp word ptr [si],0
je aga
mov dx,12h
mov ax,34deh
div word ptr [si]
out 42h,al
mov al,ah
out 42h,al
call delay
add si,2
inc di
mov ah,1
int 16h
jz last

close: in al,61h
and al,11111100b
out 61h,al
mov ah,4ch
int 21h
;---------------
delay proc
mov eax,0
mov al,[di]
imul eax,eax,n
mov dx,ax
rol eax,16
mov cx,ax
mov ah,86h
int 15h
ret
delay endp
code ends
end beg
运行时有错误,请高手给以改正,或者提供你自己的程序(高分)
另一个问题就是:电路的连接
哪位高手可以给出电路图,那就更好了(高分)


...全文
63 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
kenfyk 2003-07-09
  • 打赏
  • 举报
回复
谢谢支持
欢迎大家以后光临我的帖
kenfyk 2003-07-08
  • 打赏
  • 举报
回复
结帖
wylen 2003-07-08
  • 打赏
  • 举报
回复
cui(蚊子王) 厉害。
紫郢剑侠 2003-07-07
  • 打赏
  • 举报
回复
好, 收藏!
蚊子王 2003-07-06
  • 打赏
  • 举报
回复
用tasm编译成.com文件:
tasm music.asm
tlink /t music.obj

我这个刚好也是《友谊地久天长》,原先数据从一个C程序里弄来的,不过为了节省空间,我把频率和时间合在一块,还有我是用1CH中断来控制时间,而不是用15h中断来实现
蚊子王 2003-07-06
  • 打赏
  • 举报
回复
我在以前曾经写过,开始也是发杂音的,后来排除了,但时间长久了,忘记到底是怎么回事。
我现在对我的程序改写(本来是调用我自己编写的库函数,而且要在我自己的编译环境下编译的)了一下,参考一下:

.model tiny
.286

.code
org 100h
start:
mov ax,351ch
int 21h
mov word ptr old1ch+2h,es
mov word ptr old1ch,bx

mov dx,offset Prompt
mov ah,09h
int 21h

mov ax,251ch
mov dx,offset new1ch
int 21h

mov ah,0h
int 16h

mov ds,word ptr old1ch+2h
mov dx,word ptr old1ch
mov ax,251ch
int 21h

call NoSound
mov ah,4ch
int 21h

new1ch proc near
dec byte ptr cs:Count
jg @Return
;
pusha
push ds
push cs
pop ds
;
mov si,Pointer
mov cx,[si]
mov Count,cl
add Pointer,02h
cmp Pointer,MUSIC_END
jg @First
and Count,3fh
shr cx,06h
call Sound
@End:
pop ds
popa
@Return:
db 0eah ;jmp xxxx:xxxx
old1ch dd ?
@First:
mov Pointer,offset MUSIC
mov Count,24h
call NoSound
jmp @End
new1ch endp

NoSound proc near
in al,61h
and al,0fch
out 61h,al
ret
NoSound endp

Sound proc near
mov ax,34ddh
mov dx,0012h
cmp dx,cx
jnb @soundend
div cx
mov cx,ax
in al,61h
test al,03h
jne @soundskip
or al,03h
out 61h,al
mov al,0b6h
out 43h,al
@soundskip:
mov al,cl
out 42h,al
mov al,ch
out 42h,al
@soundend:
ret
Sound endp

MUSIC dw 196*64+2*MULT,262*64+3*MULT,262*64+1*MULT,262*64+2*MULT
dw 330*64+2*MULT,294*64+3*MULT,262*64+1*MULT,294*64+2*MULT
dw 330*64+1*MULT,294*64+1*MULT,262*64+4*MULT,330*64+2*MULT
dw 394*64+2*MULT,440*64+4*MULT,440*64+2*MULT,394*64+3*MULT
dw 330*64+1*MULT,330*64+1*MULT,262*64+1*MULT,294*64+3*MULT
dw 262*64+1*MULT,294*64+2*MULT,330*64+1*MULT,294*64+1*MULT
dw 262*64+3*MULT,230*64+1*MULT,230*64+2*MULT,196*64+2*MULT
dw 262*64+7*MULT,440*64+2*MULT,394*64+3*MULT,330*64+1*MULT
dw 330*64+1*MULT,262*64+1*MULT,294*64+3*MULT,262*64+1*MULT
dw 294*64+2*MULT,440*64+2*MULT,394*64+3*MULT,330*64+1*MULT
dw 330*64+2*MULT,394*64+2*MULT,440*64+7*MULT,523*64+2*MULT
dw 394*64+3*MULT,330*64+1*MULT,330*64+1*MULT,262*64+1*MULT
dw 294*64+3*MULT,262*64+1*MULT,294*64+2*MULT,330*64+1*MULT
dw 294*64+1*MULT,262*64+3*MULT,230*64+1*MULT,230*64+2*MULT
dw 196*64+2*MULT,262*64+7*MULT,440*64+2*MULT,394*64+3*MULT
dw 330*64+1*MULT,330*64+1*MULT,262*64+1*MULT,294*64+3*MULT
dw 262*64+1*MULT,294*64+2*MULT,440*64+2*MULT,394*64+3*MULT
dw 330*64+1*MULT,330*64+2*MULT,394*64+2*MULT,440*64+7*MULT
dw 523*64+2*MULT,394*64+3*MULT,330*64+1*MULT,330*64+1*MULT
dw 262*64+1*MULT,294*64+3*MULT,262*64+1*MULT,294*64+2*MULT
dw 330*64+1*MULT,294*64+1*MULT,262*64+3*MULT,230*64+1*MULT
dw 230*64+2*MULT,196*64+2*MULT,262*64+7*MULT
MUSIC_END = offset $
MULT = 08h

Count db 00h
Pointer dw MUSIC_END
Prompt db 'Press any key to quit...$'

end start
kenfyk 2003-07-06
  • 打赏
  • 举报
回复
真的没人吗??
kenfyk 2003-07-05
  • 打赏
  • 举报
回复
我顶
殷切期盼高手中
kenfyk 2003-07-05
  • 打赏
  • 举报
回复
上面的大哥
你可以复制下来
运行一下拉
BraveHeart2222 2003-07-05
  • 打赏
  • 举报
回复
不想看程序,先把运行时有什么问题贴出来吧!!!!
zorroforever 2003-07-05
  • 打赏
  • 举报
回复
有意思,看看
wylen 2003-07-05
  • 打赏
  • 举报
回复
小二,把贴贴到硬件里的单片机去,一会就ok.
wylen 2003-07-05
  • 打赏
  • 举报
回复
那是他的课程课题。呵呵。
jerky 2003-07-04
  • 打赏
  • 举报
回复
EAX 是标准寄存器, 不需要定义阿
dreamboy329 2003-07-04
  • 打赏
  • 举报
回复
呵呵
没人来
想偷学点东西都不行
蚊子王 2003-07-04
  • 打赏
  • 举报
回复
楼主要这个程序干什么用,不是作业吧
dreamboy329 2003-07-04
  • 打赏
  • 举报
回复
程序应如下吧:

data segment use16
tabf dw -1,262,350,352,350,441,393,350,393,441
dw 350,352,441,525,589,588,589,525,441
dw 440,350,393,350,393,441,350,293,294,262
dw 350,589,525,441,440,350,393,350,393,589
dw 525,441,440,525,589,700,525,441,440,350
dw 393,350,393,441,350,294,292,262,350,0
tabt db 4,4,6,2,4,4,6,2,4,4
db 6,2,4,4,12,1,3,6,2
db 4,4,6,2,4,4,6,2,4,4
db 12,4,6,2,4,4,6,2,4,4
db 6,2,4,4,12,4,6,2,4,4
db 6,2,4,4,6,2,4,4,12
n equ 150000
data ends
code segment use16
assume cs:code,ds:data
beg: mov ax,data
mov ds,ax

open: in al,61h
or al,00000011b
out 61h,al
aga: mov si,offset tabf
mov di,offset tabt
last: cmp word ptr [si],0
je aga
mov dx,12h
mov ax,34deh
div word ptr [si]
out 42h,al
mov al,ah
out 42h,al
call delay
add si,2
inc di
mov ah,1
int 16h
jz last

close: in al,61h
and al,11111100b
out 61h,al
mov ah,4ch
int 21h
;---------------
delay proc
mov eax,n
mov al,[di]
imul n
mov dx,ax
rol eax,16
mov cx,ax
mov ah,86h
int 15h
ret
delay endp
code ends
end beg
vcshcn 2003-07-04
  • 打赏
  • 举报
回复
用eax要加上.386
vcshcn 2003-07-04
  • 打赏
  • 举报
回复
那本清华的汇编语言程序设计上有放音乐的程序
dreamboy329 2003-07-03
  • 打赏
  • 举报
回复
imul eax,eax,n
这句明显错误吧
应为:
imul n
不过上面好多要改
eax好象也没定义

小弟道行也不深,献丑了
还是清高手出招吧
加载更多回复(1)

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧