STACK1 SEGMENT STACK
DW 200 DUP(?)
STACK1 ENDS
DATA SEGMENT
MESG1 DB 'zhangjukuo ',0ah,0dh
DB 'Exit with Esc',0ah,0dh,'$'
freq dw 2 dup(262,294,330,262) ;"两只老虎"乐曲中,音符的频率(音阶)
dw 2 dup(330,349,392) ;其中,0频率表示结尾
dw 2 dup(392,440,392,349,330,262)
dw 2 dup(294,196,262),0
time dw 10 dup(8),16,8,8,16 ; "两只老虎"乐曲中,音符的延时(节拍)
dw 2 dup(4,4,4,4,8,8) ;其中4,8,16表示延时的次数
dw 2 dup(8,8,16)
INT0A_OFF DW ?
INT0A_SEG DW ?
NUM dw 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AH,09H
MOV DX,OFFSET MESG1
INT 21h ;显示提示信息
MOV DX,303H ;初始化8255
MOV AL,10011000B
OUT DX,AL
MOV DX,301H ;LED灯熄灭
MOV AL,00H
OUT DX,AL
MOV AX,3572H ;获取原中断向量,35为DOS功能号,72为中断向量号
INT 21H ;ES:BX为存放向量处
MOV INT0A_OFF,BX ;保存原中断向量
MOV BX,ES
MOV INT0A_SEG,BX ;INT0A_OFF=bx,INT0A_SEG=es
CLI ;关中断
MOV AX,2572H ;25为设置中断向量,DS:DX=中断向量 ; AL为中断类型号
MOV DX,SEG HANDLER ;设置新的中断向量
PUSH DS
MOV DS,DX
MOV DX,OFFSET HANDLER
INT 21H
POP DS
STI ;开中断
IN AL,0A1H ;打开IRQ10
AND AL,0FBH
OUT 0A1H,AL
IN AL,21H ;打开IRQ2
AND AL,0FBH
OUT 21H,AL
L1:
MOV AH,0BH ;检查是否有’ESC’键按下
INT 21H
INC AL
JNZ LL0 ; 若无键按下,则程序往下执行
MOV AH,08H ;如有’ESC’键按下,则程序退出
INT 21H
CMP AL,1bH
JZ EXIT
LL0: MOV CL,50 ;检测是否是稳定状态
MOV DX,300H
LL1: IN AL, DX
CMP AL,16H
JNE LL0;
DEC CL;
JNZ LL1;
MOV DX,303H ;按下SW3,则PC0=1申请中断
MOV AL,00000001B
OUT DX,AL
PUSH CX
MOV CX,100
WT: LOOP WT
POP CX
MOV DX,303H ;置PC0=0
MOV AL,00000000H
OUT DX,AL
JMP L1
EXIT:
MOV AX,2572H ;恢复中断向量
MOV DX,INT0A_SEG
PUSH DS
MOV DS,DX
MOV DX,INT0A_OFF
INT 21H
POP DS
IN AL,0A1H ;屏蔽IRQ10
OR AL,04H
OUT 0A1H,AL
IN AL,21H ;屏蔽IRQ2
OR AL,04H
OUT 21H,AL
MOV AX,4C00H ;程序退出
INT 21H
HANDLER proc far ;程序开始
push di ;寄存器压栈
push si
push bp
push bx
CLI ;关中断
mov al,0ch ;关闭8253的T2计数器(8255的PC6=0)
mov dx,303h
out dx,al
mov al,00h ;关闭喇叭(8255的PC0=0)
mov dx,303h
out dx,al
mov al,0b6h ;10110110 ;8253初始化
mov dx,307h
out dx,al
mov dx,307H
mov al,0111110B
out dx,al
mov dx,303H
mov al,00001001B
out dx,al
mov si,offset freq ;设置频率指针→si
mov bp,offset time ;设置延时指针→bp
PP: mov di,[si] ;取1个音符的频率→di
cmp di,0 ;检测是否是乐曲结尾
je end_sing ;若是,则结束演凑
MOV DX,301H ;闪光
MOV AL,10
OUT DX,AL
MOV AL,00001001b
MOV DX,303H
OUT DX,AL
PUSH CX
MOV CX,500
LOOP1: LOOP LOOP1
POP CX
MOV AL,00001000b
MOV DX,303H
OUT DX,AL
mov dx,12h ;计算音符的频率所对应的8253计数初值
mov ax,34dch ;1.19318MHz
div di
mov dx,306h ;向8253装入计数初值
out dx,al ;先装低字节
mov al,ah
out dx,al ;再装高字节
mov dx,303h ;打开喇叭(8255的PC0=1)
mov al,01h
out dx,al
mov al,0dh ;打开8253的T2(PC6=1),开始发声
out dx,al
mov dx,303H
mov al,00001000B
out dx,al
mov bx,ds:[bp] ;取1个音符的延时次数→bx
mov dx,305H
mov al,bl
out dx,al
mov al,dh
out dx,al
delay: mov dx,303h
in al,dx
test al,00010000B
jne delay
add si,2 ;取下1 个音符的频率
add bp,2 ;取下1 个音符的延时次数
inc num
test num,00000001B
jz second
mov dx,301H
mov al,10
out dx,al
jmp afterflash
second:mov dx,301H
mov al,12
out dx,al
afterflash: mov dx,303h ;关闭8253的T2(PC6=0)
mov al,0ch
out dx,al
mov al,00h ;关闭喇叭(PC0=0)
out dx,al
MOV AL,00001000b ;PC4复位pc4=0
MOV DX,303H
OUT DX,AL
jmp PP
end_sing:
mov dx, 303h ;关闭8253的T2
mov al, 0ch
out dx, al
mov al, 00h ;关闭喇叭
out dx, al
MOV AL,62H ;发中断结束命令
MOV DX,0A0H
OUT DX,AL ;向从片8259发EOI命令
OUT 020H,AL ;向主片8259发EOI命令
STI ;开中断
pop bx ;寄存器出栈
pop bp
pop si
pop di
IRET
HANDLER ENDP
CODE ENDS
END START
13 个解决方案
#1
有什么提示没有啊生成EXE时候。
对于OBJ文件不能生成EXE
我记不清了。好像是要把OBJ文件放到编译器目录下,再编译就有了。
对于OBJ文件不能生成EXE
我记不清了。好像是要把OBJ文件放到编译器目录下,再编译就有了。
#2
没有提示,就说了个‘没有生成EXE文件’,下面的提示是unable to open file 'tf\.map.我用的是微机原理实验平台集成开发环境。那我先来试下看
#3
不行,还是那样子
#4
用MASM6.15可生.EXE可执行文件.
#5
我们现在在做实验,用的是实验室的机子
#6
是什么样的集成开发软件?
#7
应该是编译环境的问题
#8
用的什么编译器?
#9
把源文件拷到编译器所在的目录底下,用命令行CD到此目录,直接用命令编。
不要用啥集成开发环境。
不要用啥集成开发环境。
#10
假设你的源程序叫1.asm
如果你用tasm,那么在命令行:
tasm 1.asm (或者tasm32 1.asm也可以)
tlink 1.obj
如果用masm类似,使用masm和link程序,或者直接用ml 1.asm也可以。
如果你用tasm,那么在命令行:
tasm 1.asm (或者tasm32 1.asm也可以)
tlink 1.obj
如果用masm类似,使用masm和link程序,或者直接用ml 1.asm也可以。
#11
你用的是什么汇编程序和连接程序呢?
最好用MASM 5之类的汇编程序和连接程序
最好用MASM 5之类的汇编程序和连接程序
#12
谢谢大家,我用命令提示符就可以了,可能真跟编译环境有关吧
#13
我用MASM6.15的,可不能生成.exe是怎么回事啊 是不是没装好啊
#1
有什么提示没有啊生成EXE时候。
对于OBJ文件不能生成EXE
我记不清了。好像是要把OBJ文件放到编译器目录下,再编译就有了。
对于OBJ文件不能生成EXE
我记不清了。好像是要把OBJ文件放到编译器目录下,再编译就有了。
#2
没有提示,就说了个‘没有生成EXE文件’,下面的提示是unable to open file 'tf\.map.我用的是微机原理实验平台集成开发环境。那我先来试下看
#3
不行,还是那样子
#4
用MASM6.15可生.EXE可执行文件.
#5
我们现在在做实验,用的是实验室的机子
#6
是什么样的集成开发软件?
#7
应该是编译环境的问题
#8
用的什么编译器?
#9
把源文件拷到编译器所在的目录底下,用命令行CD到此目录,直接用命令编。
不要用啥集成开发环境。
不要用啥集成开发环境。
#10
假设你的源程序叫1.asm
如果你用tasm,那么在命令行:
tasm 1.asm (或者tasm32 1.asm也可以)
tlink 1.obj
如果用masm类似,使用masm和link程序,或者直接用ml 1.asm也可以。
如果你用tasm,那么在命令行:
tasm 1.asm (或者tasm32 1.asm也可以)
tlink 1.obj
如果用masm类似,使用masm和link程序,或者直接用ml 1.asm也可以。
#11
你用的是什么汇编程序和连接程序呢?
最好用MASM 5之类的汇编程序和连接程序
最好用MASM 5之类的汇编程序和连接程序
#12
谢谢大家,我用命令提示符就可以了,可能真跟编译环境有关吧
#13
我用MASM6.15的,可不能生成.exe是怎么回事啊 是不是没装好啊