主题:各位大虾看下这个程序哪错了
banboooo
[专家分:20] 发布于 2007-05-28 11:39:00
这是我编写的一个程序,功能是:输入两个字符串,判断所含字符是否相同,相同则输出:MATCH,不相同则输出:NOMATCH,我现在不懂的是如何给输入的字符串分配存储空间
DATA SEGMENT
INFOR1 DB 0AH,0DH,"MATCH! $"
INFOR2 DB 0AH,0DH,"NOMATCH! $"
INFOR3 DB 0AH,0DH,"please input the first one: $"
infor4 DB 0AH,0DH,"please input the second one: $"
IBUF DB 7,0,6 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
LEA DX,INFOR3
MOV AH,09H
INT 21H
LEA DX,IBUF
MOV AH,0AH
INT 21H
MOV BX,DX
PUSH BX
LEA DX,INFOR4
MOV AH,09H
INT 21H
LEA DX,IBUF
MOV AH,0AH
INT 21H
POP BX
CMP BX,DX
JZ MATCH
LEA DX,INFOR2
MOV AH,09H
INT 21H
JMP PEND
MATCH:LEA DX,INFOR1
MOV AH,09H
INT 21H
PEND:MOV AH,4CH
INT 21H
CODE ENDS
END START
回复列表 (共3个回复)
沙发
banboooo [专家分:20] 发布于 2007-05-28 12:44:00
改了下,如下,这个又错在哪了,我运行时,总在
NEXT: CMP DX,BX
JZ NEXT
死循环
DATA SEGMENT
INFOR1 DB 0AH,0DH,"MATCH! $"
INFOR2 DB 0AH,0DH,"NOMATCH! $"
INFOR3 DB 0AH,0DH,"please input the first one: $"
infor4 DB 0AH,0DH,"please input the second one: $"
IBUF DB 7,0,6 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
LEA DX,INFOR3
MOV AH,09H
INT 21H
LEA DX,IBUF
MOV AH,0AH
INT 21H
MOV CL,IBUF+1
LEA SI,IBUF+2
LEA DX,INFOR4
MOV AH,09H
INT 21H
LEA BX,IBUF
MOV AH,0AH
INT 21H
MOV CH,IBUF+1
LEA DI,IBUF+2
CMP CH,CL
JNZ NOMATCH
MOV DX,[SI]
MOV BX,[DI]
NEXT: CMP DX,BX
JZ NEXT
JNZ NOMATCH
INC SI
INC DI
DEC CL
JZ MATCH
NOMATCH:LEA DX,INFOR2
MOV AH,09H
INT 21H
JMP PEND
MATCH:LEA DX,INFOR1
MOV AH,09H
INT 21H
PEND:MOV AH,4CH
INT 21H
CODE ENDS
END START
板凳
塞北江南 [专家分:1350] 发布于 2007-05-28 20:45:00
;功能是:输入两个字符串,判断所含字符是否相同,相同则输出:MATCH,不相同则输出:NOMATCH
DATA SEGMENT
INFOR1 DB 0AH,0DH,"MATCH! $"
INFOR2 DB 0AH,0DH,"NOMATCH! $"
INFOR3 DB 0AH,0DH,"please input the first one: $"
infor4 DB 0AH,0DH,"please input the second one: $"
string1 db 20,0,20 DUP(?) ;用于输入第一个字符串,假设不超过20个
string2 db 20,0,20 DUP(?) ;用于输入第二个字符串
DATA ENDS
STACK SEGMENT STACK PARA 'STACK'
DW 256 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:MOV AX,DATA
MOV DS,AX
mov es,ax
LEA DX,INFOR3
MOV AH,09H
INT 21H
LEA DX,string1
MOV AH,0AH
INT 21H
LEA DX,INFOR4
MOV AH,09H
INT 21H
LEA DX,string2
MOV AH,0AH
INT 21H
mov al,string1[1]
CMP al,string2[1] ;比较两次输入的字符数是否相等
Jne NOMATCH ;不相等则不匹配
LEA SI,STRING1[2]
LEA DI,STRING2[2]
MOV CL,AL
MOV CH,0
REPE CMPSB ;字符串比较
JNZ NOMATCH
LEA DX,INFOR1
MOV AH,09H
INT 21H
JMP PEND
NOMATCH:LEA DX,INFOR2
MOV AH,09H
INT 21H
PEND:MOV AH,4CH
INT 21H
CODE ENDS
END START
;在MASM615下汇编通过无误,功能正确
3 楼
塞北江南 [专家分:1350] 发布于 2007-05-28 20:45:00
(1)从键盘读入一个字符
功能号:1
入口参数:无
出口参数:AL=输人字符的ASCII码
功能:等待从键盘读入一个字符,将字符的ASCII码送给AL,同时将该字符显示在屏幕上。
调用方法:
MOV AH,l ;AH中存放的是功能号
INT 21H
说明:在输入一个字符后,不需要键入回车。若只键入回车,则出口参数AL得到的是回车符的ASCII码0DH。
(2)显示一个字符
功能号:2
入口参数:DL=要显示字符的ASCII码
出口参数:无
功能:在当前光标位置显示DL中的字符,然后光标右移。
调用方法示例: 下列指令序列用来显示字符’A’
MOV DL,‘A’
MOV AH,2
INT 2lH
(3)显示一个字符串
功能号;9
入口参数;DS:DX=欲显示的字符串在内存的首地址。字符串必须以’$’作为结束标志,’$’不属于被显示的字符串。
出口参数:无
功能:在当前光标位置,显示由DS:DX所指的、以’$’为结束标志的字符串,然后光标右移。
调用方法示例:
…
STRING DB ‘Hello world!’,’$’
…
下列指令序列用来显示String中的字符串‘Hello world!’。
MOV AX,SEG STRING
MOV DS,AX
LEA DX,STRING
MOV AH,9
INT 21H
(4)从键盘读入一个字符串
功能号:0AH
入口参数:DS:DX=输人缓冲区的首地址
输入缓冲区格式:第0个字节给出输入缓冲区最多能容纳的字符个数(1~255,包括回车符),由应用程序设置;第1个字节将存放实际输人的字符个数(不包括回车符),由系统在读入字符串后自动设置;从第2个字节开始存放实际输入的字符串,最后为回车符的ASCII码0DH。
出口参数;无
功能:从键盘读入一个字符串,存入由DS:DX所指的输入缓冲区。
说明:
•在输入字符串后,必须以回车结束。
•当输人的字符数达到了输入缓冲区所能容纳的字符个数减l时,随后的输入将不被系统接收,且响铃警告。
调用方法示例:
……
BUF DB 80 ;定义输入缓冲区,最多容纳79个字符与1个回车符
DB ? ;存放实际输入的字符个数,由系统自动设置
DB 80 DUP (?) ;存放实际输入的字符串
……
下列指令序列将从键盘读人字符串(长度<80,并存入输入缓冲区BUF中
MOV AX,SEG BUF
MOV DS,AX
MOV DX,OFFSET BUF
MOV AH,0AH
INT 21H
假定的字符串为’ABC’,则输入缓冲区BUF的内容如下:
BUF+1: 3 ; 输入字符个数为3
BUF+2: 61H ;’A’的ASCII码
BUF+3: 62H ;’B’的ASCII码
BUF+4: 63H ;’C’的ASCII码
BUF+5: 0DH ;回车符的ASCII码
我来回复