注册 登录
编程论坛 汇编论坛

[求助]怎样使程序发出“警报”?

双面人 发布于 2007-04-28 13:43, 1933 次点击
要求:输入无效数据时,发出警报声,然后提示重新输入
大家帮我出出主意,谢谢啦!
程序代码:
DATA SEGMENT
X DB ?
Y DB ?
S DB ?,?
mess1 db "Input x=(0 quit)","$"
mess3 db 'Input y=','$'
mess2 db 'x+y=$'
DATA ENDS
stack segment para stack 'stack'
dw 100 dup(?)
stack ends
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ss:stack
START: MOV AX,DATA
MOV DS,AX
l1: lea dx,mess1
mov ah,9
int 21h
MOV AH,1
INT 21H
cmp al,'0'
je l2
MOV X,AL
call cr_lf
lea dx,mess3
mov ah,9
int 21h
MOV AH,1
INT 21H
MOV Y,AL
MOV AL,X
AND AL,0FH
MOV BL,Y
AND BL,0FH
ADD AL,BL
cbw
mov bl,10
div bl
or al,30h
mov s,al
or ah,30h
mov [s+1],ah
call cr_lf
mov dx,offset mess2
mov ah,9
int 21h
MOV AH,2
MOV DL,s
INT 21H
mov ah,2
mov dl,[s+1]
int 21h
call cr_lf
jmp l1
l2: MOV AH,4CH
INT 21H
cr_lf proc
push ax
push dx
mov ah,2
mov dl,0ah
int 21h
mov ah,2
mov dl,0dh
int 21h
pop dx
pop ax
ret
cr_lf endp
CODE ENDS
END START

30 回复
#2
双面人2007-04-28 23:59
为什么总是没人理啊!论坛人真的少了
#3
爱以走远2007-04-29 00:12

我不晓得怎么发出警报 我只知道我们老师讲过的 忘拉
但是当输入错误的时候可以先用一个比较指令 如不复合 就用一个转移指令转到输出字符串撒(首先定义一个字符串哈 ) 在在转移到重新输入那里
可能我说得不是很清楚哈 呵呵 语文不好

#4
双面人2007-04-29 00:32
谢谢啦!不过我真的需要再具体点啊!我初学者

#5
爱以走远2007-04-29 12:46
比如你想输入的是数字 你就用
cmp ax,'0' (我们把输入的数放到ax中)
jl exit
cmp ax,'9'
ja exit
下面就到exit去 输出开始定义的一个字符串错误
就这样







#6
I喜欢c2007-04-29 13:11
我记得扬声器控制字地址好象是61H

在想想都...
#7
爱以走远2007-04-29 14:07
我查看看
#8
爱以走远2007-04-29 14:14
是的哈  呵呵  
#9
双面人2007-04-30 13:40
如何加到我发的那段程序中去呢?
#10
爱以走远2007-05-04 08:00
就加到转移到exit的地方撒   
#11
双面人2007-05-05 20:04
?我还不是很清楚,麻烦你再耐心给我说说好吗?
#12
爱以走远2007-05-05 20:20
对于你的这个程序 好象不是数字就是无效数据吧
#13
爱以走远2007-05-05 20:25
DATA SEGMENT
X DB ?
Y DB ?
S DB ?,?
mess1 db "Input x=(0 quit)","$"
mess3 db 'Input y=','$'
mess2 db 'x+y=$'
DATA ENDS
stack segment para stack 'stack'
dw 100 dup(?)
stack ends
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ss:stack
START: MOV AX,DATA
MOV DS,AX
l1: lea dx,mess1
mov ah,9
int 21h
MOV AH,1
INT 21H
cmp al,'0'
jl exit
cmp al,'9'
ja exit ;当输入的不是数字时
je l2
MOV X,AL
call cr_lf
lea dx,mess3
mov ah,9
int 21h
MOV AH,1
INT 21H
MOV Y,AL
MOV AL,X
AND AL,0FH
MOV BL,Y
AND BL,0FH
ADD AL,BL
cbw
mov bl,10
div bl
or al,30h
mov s,al
or ah,30h
mov [s+1],ah
call cr_lf
mov dx,offset mess2
mov ah,9
int 21h
MOV AH,2
MOV DL,s
INT 21H
mov ah,2
mov dl,[s+1]
int 21h
call cr_lf
jmp l1
exit : mov ah,61h
int 21h
goto l1 ; 发出警报 转移到l1重新输入
l2: MOV AH,4CH
INT 21H
cr_lf proc
push ax
push dx
mov ah,2
mov dl,0ah
int 21h
mov ah,2
mov dl,0dh
int 21h
pop dx
pop ax
ret
cr_lf endp
CODE ENDS
END START
好象就这样
#14
双面人2007-05-05 21:16
我试试看

#15
双面人2007-05-05 21:38

我的怎么生成不了 OBJ文件了?
#16
双面人2007-05-05 21:49
程序哪了好象有错?帮忙改改,谢谢啦!

#17
爱以走远2007-05-05 21:52
哦  我没调   我调 看看  
#18
爱以走远2007-05-05 22:00
我的错 呵呵 怎么去用汇编里有goto哦 呵呵
把goto改为jmp 不好意思 混拉
#19
双面人2007-05-05 23:13
我再试试看哦!~
#20
双面人2007-05-05 23:15
add3.asm(60): Out of memory 还是不通,出现了这样的提示!
#21
爱以走远2007-05-05 23:16
不是哦  我都通过拉的  
#22
爱以走远2007-05-05 23:19
DATA SEGMENT
X DB ?
Y DB ?
S DB ?,?
mess1 db "Input x=(0 quit)","$"
mess3 db 'Input y=','$'
mess2 db 'x+y=$'
DATA ENDS
stack segment para stack 'stack'
dw 100 dup(?)
stack ends
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ss:stack
START: MOV AX,DATA
MOV DS,AX
l1: lea dx,mess1
mov ah,9
int 21h
MOV AH,1
INT 21H
cmp al,'0'
jl exit
cmp al,'9'
ja exit
je l2
MOV X,AL
call cr_lf
lea dx,mess3
mov ah,9
int 21h
MOV AH,1
INT 21H
MOV Y,AL
MOV AL,X
AND AL,0FH
MOV BL,Y
AND BL,0FH
ADD AL,BL
cbw
mov bl,10
div bl
or al,30h
mov s,al
or ah,30h
mov [s+1],ah
call cr_lf
mov dx,offset mess2
mov ah,9
int 21h
MOV AH,2
MOV DL,s
INT 21H
mov ah,2
mov dl,[s+1]
int 21h
call cr_lf
jmp l1
exit : mov ah,61h
int 21h
jmp l1
l2: MOV AH,4CH
INT 21H
cr_lf proc
push ax
push dx
mov ah,2
mov dl,0ah
int 21h
mov ah,2
mov dl,0dh
int 21h
pop dx
pop ax
ret
cr_lf endp
CODE ENDS
END START
#23
双面人2007-05-05 23:25
程序通过了,谢谢啦!
不过还有2处得帮忙改改:1)是不发出警报声啊?2)是只对X进行出错判断,没对Y进行出错判断啊?
#24
爱以走远2007-05-05 23:29
警报应该要发 只是声音很小 我记得是我们老师说的
在输入y 那里一样的加那个就行拉

[此贴子已经被作者于2007-5-5 23:30:26编辑过]

#25
双面人2007-05-05 23:30
我一会得下了,能留一下你的QQ吗?我把你加上,有问题好问啊!
#26
爱以走远2007-05-05 23:30
312544154
#27
爱以走远2007-05-05 23:39
DATA SEGMENT
X DB ?
Y DB ?
S DB ?,?
mess1 db "Input x=(0 quit)","$"
mess3 db 'Input y=','$'
mess2 db 'x+y=$'
DATA ENDS
stack segment para stack 'stack'
dw 100 dup(?)
stack ends
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ss:stack
START: MOV AX,DATA
MOV DS,AX
l1: lea dx,mess1
mov ah,9
int 21h
MOV AH,1
INT 21H
cmp al,'0'
jl exit
cmp al,'9'
ja exit
je l2
MOV X,AL
call cr_lf
lea dx,mess3
l4: mov ah,9
int 21h
MOV AH,1
INT 21H
cmp al,'0'
jl l3
cmp al,'9'
ja l3
je l2
MOV Y,AL
MOV AL,X
AND AL,0FH
MOV BL,Y
AND BL,0FH
ADD AL,BL
cbw
mov bl,10
div bl
or al,30h
mov s,al
or ah,30h
mov [s+1],ah
call cr_lf
mov dx,offset mess2
mov ah,9
int 21h
MOV AH,2
MOV DL,s
INT 21H
mov ah,2
mov dl,[s+1]
int 21h
call cr_lf
jmp l1
exit : mov ah,61h
int 21h
jmp l1
l3: mov ah,61h
int 21h
jmp l4
l2: MOV AH,4CH
INT 21H

cr_lf proc
push ax
push dx
mov ah,2
mov dl,0ah
int 21h
mov ah,2
mov dl,0dh
int 21h
pop dx
pop ax
ret
cr_lf endp
CODE ENDS
END START
改好拉
#28
双面人2007-05-05 23:44
又有新问题了,原先“X=0”的话就会退出程序,现在不能实现了!
#29
爱以走远2007-05-05 23:50
不好意思 我真的有点
DATA SEGMENT
X DB ?
Y DB ?
S DB ?,?
mess1 db "Input x=(0 quit)","$"
mess3 db 'Input y=','$'
mess2 db 'x+y=$'
DATA ENDS
stack segment para stack 'stack'
dw 100 dup(?)
stack ends
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ss:stack
START: MOV AX,DATA
MOV DS,AX
l1: lea dx,mess1
mov ah,9
int 21h
MOV AH,1
INT 21H
cmp al,'0'
jl exit
cmp al,'9'
ja exit
cmp al,'0'
je l2
MOV X,AL
call cr_lf
lea dx,mess3
l4: mov ah,9
int 21h
MOV AH,1
INT 21H
cmp al,'0'
jl l3
cmp al,'9'
ja l3
MOV Y,AL
MOV AL,X
AND AL,0FH
MOV BL,Y
AND BL,0FH
ADD AL,BL
cbw
mov bl,10
div bl
or al,30h
mov s,al
or ah,30h
mov [s+1],ah
call cr_lf
mov dx,offset mess2
mov ah,9
int 21h
MOV AH,2
MOV DL,s
INT 21H
mov ah,2
mov dl,[s+1]
int 21h
call cr_lf
jmp l1
exit : mov ah,61h
int 21h
jmp l1
l3: mov ah,61h
int 21h
jmp l4
l2: MOV AH,4CH
INT 21H

cr_lf proc
push ax
push dx
mov ah,2
mov dl,0ah
int 21h
mov ah,2
mov dl,0dh
int 21h
pop dx
pop ax
ret
cr_lf endp
CODE ENDS
END START

[此贴子已经被作者于2007-5-5 23:55:48编辑过]

#30
爱以走远2007-05-05 23:57

这次一定没拉

#31
双面人2007-05-06 19:19
好了,谢谢了!

1