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

出现问题,求助!

冰_山 发布于 2007-06-28 23:46, 1147 次点击
功能:实现数组A输入15个不等数,B输入20个不等的数,求出A,B相同的数并输出
调试时当输完数组AB后就 <<编译框>>消失了.
data segment
a db 30 dup(?),'$'
b db 40 dup(?),'$'
c db 30 dup(?),'$'
p db 'please input 15(00-99) in A:$'
q db 'please input 20(00-99) in B:$'
r db 'the same in the A and B is:$'
data ends
code segment
assume ds:data,cs:code
CRLF macro
mov ah,2
mov dl,0dh
int 21h
mov dl,0ah
int 21h
endm
start: mov ax,data
mov ds,ax
lea dx,p
mov ah,9
int 21h
CRLF
mov si,0
lea bx,a
mov cx,30
a1: mov ah,1
int 21h
mov [bx][si],al
inc si
mov ax,si
mov dl,2
div dl
cmp ah,0
jnz a2
mov dl,' '
mov ah,2
int 21h
a2: loop a1
CRLF
lea dx,q
mov ah,9
int 21h
CRLF
mov si,0
lea bx,b
mov cx,40
a3: mov ah,1
int 21h
mov [bx][si],al
inc si
mov ax,si
mov dl,2
div dl
cmp ah,0
jnz a4
mov dl,' '
mov ah,2
int 21h
a4: loop a3

CRLF
mov si,0
mov dh,0
lea bx,a

a6: mov dl,0
mov ah,[bx][si]
inc si
mov al,[bx][si]
lea di,b

a7: SCASW
jz a5
inc dl
cmp dl,20
inc si
jz a6
jmp a7
a5: add dh,2
mov c,ah
inc c
mov c,al
inc c
inc si
cmp si,30
jz a8
jmp a6

a8: mov cl,dh
mov ch,0
lea bx,c
mov si,0
a9: mov dl,[bx][si]
inc si
mov ax,si
mov dl,2
div dl
cmp ah,0
jnz a10
mov dl,' '
mov ah,2
int 21h
a10: loop a9
mov ah,4ch
int 21h
code ends
end start
15 回复
#2
冰_山2007-06-29 08:59
回复:又找出点小毛病,但还是不行!急
data segment
a db 30 dup(?),'$'
b db 40 dup(?),'$'
c db 30 dup(?),'$'
p db 'please input 15(00-99) in A:$'
q db 'please input 20(00-99) in B:$'
r db 'the same in the A and B is:$'
data ends
code segment
assume ds:data,cs:code
CRLF macro
mov ah,2
mov dl,0dh
int 21h
mov dl,0ah
int 21h
endm
start: mov ax,data
mov ds,ax
lea dx,p
mov ah,9
int 21h
CRLF
mov si,0
lea bx,a
mov cx,30
a1: mov ah,1
int 21h
mov [bx][si],al
inc si
mov ax,si
mov dl,2
div dl
cmp ah,0
jnz a2
mov dl,' '
mov ah,2
int 21h
a2: loop a1
CRLF
lea dx,q
mov ah,9
int 21h
CRLF
mov si,0
lea bx,b
mov cx,40
a3: mov ah,1
int 21h
mov [bx][si],al
inc si
mov ax,si
mov dl,2
div dl
cmp ah,0
jnz a4
mov dl,' '
mov ah,2
int 21h
a4: loop a3

CRLF
mov si,0
mov dh,0
lea bx,a

a6: mov dl,0
cmp si,30
jz a8
mov ah,[bx][si]
inc si
mov al,[bx][si]
lea di,b
CLD
a7: SCASW
jz a5
inc dl
inc si
cmp dl,20
jz a6
jmp a7
a5: add dh,2
mov c,ah
inc c
mov c,al
inc c
inc si
jmp a6

a8: mov cl,dh
mov ch,0
sub c,dh
lea bx,c
mov si,0
a9: mov dl,[bx][si]
mov ah,2
int 21h
inc si
mov ax,si
mov dl,2
div dl
cmp ah,0
jnz a10
mov dl,' '
mov ah,2
int 21h
a10: loop a9
mov ah,4ch
int 21h
code ends
end start
#3
冰_山2007-06-29 09:05
版主!麻烦帮忙解决一下
#4
herbert_19872007-06-29 10:47
我编译的时候 c 变量提示有错的,
你的是不是?
#5
冰_山2007-06-29 11:48
我的没提示!编译就没错
#6
爱以走远2007-06-29 17:42

你比较输出是那段
好象没有

你把程序注释一哈 本来这个语言的程序都不好看

#7
冰_山2007-06-29 19:03
data segment ;目的是将A的15个不等的整数,B的20个整数,比较AB相同

的数输出
a db 30 dup(?),'$'
b db 40 dup(?),'$'
c db 30 dup(?),'$'
p db 'please input 15(00-99)different in A:$'
q db 'please input 20(00-99)different in B:$'
r db 'the same in the A and B is:$'
data ends
code segment
assume ds:data,cs:code
CRLF macro ;宏 目的回车
mov ah,2
mov dl,0dh
int 21h
mov dl,0ah
int 21h
endm
start: mov ax,data
mov ds,ax
lea dx,p
mov ah,9
int 21h
CRLF
mov si,0
lea bx,a
mov cx,30
a1: mov ah,1 ;输入15个数到A中
int 21h
mov [bx][si],al
inc si
mov ax,si
mov dl,2
div dl
cmp ah,0
jnz a2
mov dl,' ' ;每两个数中间输出一空格
mov ah,2
int 21h
a2: loop a1
CRLF
lea dx,q
mov ah,9
int 21h
CRLF
mov si,0
lea bx,b
mov cx,40
a3: mov ah,1 ;输入20个数到B中
int 21h
mov [bx][si],al
inc si
mov ax,si
mov dl,2
div dl
cmp ah,0
jnz a4
mov dl,' '
mov ah,2
int 21h
a4: loop a3

CRLF
mov si,0
mov dh,0
lea bx,a

a6: mov dl,0
cmp si,30
jz a8
mov ah,[bx][si] ;去A的第一个数放入AX中
inc si
mov al,[bx][si]
lea di,b ;放B的首地址放入B中
CLD
a7: SCASW ;比较A中第一个数与B中的所有数比较
jz a5
inc dl
inc si
cmp dl,20
jz a6
jmp a7
a5: add dh,2 ;比较结果放入C中
mov c,ah
inc c
mov c,al
inc c
inc si
jmp a6

a8: cmp dh,0
jz a11
mov cl,dh
mov ch,0
sub c,dh
lea bx,c
mov si,0
a9: mov dl,[bx][si] ;输出C
mov ah,2
int 21h
inc si
mov ax,si
mov dl,2
div dl
cmp ah,0
jnz a10
mov dl,' '
mov ah,2
int 21h
a10: loop a9
a11: mov ah,4ch
int 21h
code ends
end start
#8
hero20072007-06-29 22:53
我也在看,应该是比较部分的问题。
SCASW前面的重复前缀怎么没有?
......

还在看ing...
#9
hero20072007-06-29 23:09
mov c,ah
inc c
mov c,al
inc c

上面可以么?
我知道寄存器不够用了,但这样不行吧?
#10
hero20072007-06-29 23:26
看不出来这句sub c,dh的作用。有用的话,和楼上的一样的问题。
a9: mov dl,[bx][si]上面应该有:

lea dx,r ;输出提示 the same in the A and B is:
mov ah,9
int 21h


[此贴子已经被作者于2007-6-29 23:28:09编辑过]

#11
hero20072007-06-29 23:43

cmp dl,20
jz a6
jmp a7
这个我没想明白。

[此贴子已经被作者于2007-6-29 23:49:36编辑过]

#12
hero20072007-06-29 23:53
睡觉了
#13
冰_山2007-06-30 00:51
一:sub c,dh 是当c的值加了好多次以后就变了,所以要剪掉那边了的几个。
二:cmp dl,20
jz a6
jmp a7
是想知道比较完20次没有 完了的话就a++, 没完的话就继续往后找。
三: 哦对 我那个输出提示没写不过也不影响大局
( a9: mov dl,[bx][si]上面应该有:

lea dx,r ;输出提示 the same in the A and B is:
mov ah,9
int 21h )
四:你那个重复前缀是什么意思 (SCASW前面的重复前缀怎么没有?)
不是di自动加吗 di<-di-2
五:那个是寄存器不够用了 我也不知道能不能
mov c,ah
inc c
mov c,al
inc c
补充:就是那个编译执行的现象是CPU占用99% 可能是进入了死循环!
#14
hero20072007-06-30 11:05

重复前缀指的REP或者REPE/REPZ或者REPNE/REPNZ

那个输出提示没写的确不影响大局,但这是漏洞
( a9: mov dl,[bx][si]上面应该有:

lea dx,r ;输出提示 the same in the A and B is:
mov ah,9
int 21h )

明确的告诉你,下面这样是错误的,想想用BP吧。
mov c,ah
inc c
mov c,al
inc c

#15
hero20072007-06-30 11:21

另外 SCASW的条件有一条是:
目的串是在附加数据段ES定义的。
不知道你注意到没?
像你这样定义的,在代码段开头得有es:data(和ds一样)

#16
冰_山2007-06-30 17:27
好了!这下看看
data segment
a db 30 dup(?),'$'
b db 40 dup(?),'$'
c db 30 dup(?),'$'
p db 'please input 15(00-99)different in A:$'
q db 'please input 20(00-99)different in B:$'

data ends
code segment
assume ds:data,cs:code,es:data
CRLF macro
mov ah,2
mov dl,0dh
int 21h
mov dl,0ah
int 21h
endm
start: mov ax,data
mov ds,ax
mov es,ax
lea dx,p
mov ah,9
int 21h
CRLF
mov si,0
lea bx,a
mov cx,30
a1: mov ah,1
int 21h
mov [bx][si],al
inc si
mov ax,si
mov dl,2
div dl
cmp ah,0
jnz a2
mov dl,' '
mov ah,2
int 21h
a2: loop a1
CRLF
lea dx,q
mov ah,9
int 21h
CRLF
mov si,0
lea bx,b
mov cx,40
a3: mov ah,1
int 21h
mov [bx][si],al
inc si
mov ax,si
mov dl,2
div dl
cmp ah,0
jnz a4
mov dl,' '
mov ah,2
int 21h
a4: loop a3

CRLF
mov si,0
mov dh,0
lea bx,a
mov bp,0
a6: mov dl,0
cmp si,30
jz a8
mov ah,[bx][si]
inc si
mov al,[bx][si]
lea di,b
CLD
a7: SCASW
jz a5
inc dl
inc si
cmp dl,20
jz a6
jmp a7
a5: add dh,2

mov ds:c[bp],ah

inc bp

mov ds:c[bp],al

inc bp
inc si
jmp a6

a8: cmp dh,0
jz a11
mov cl,dh
mov ch,0

lea bx,c
mov si,0
a9: mov dl,[bx][si]
mov ah,2
int 21h
inc si
mov ax,si
mov dl,2
div dl
cmp ah,0
jnz a10
mov dl,' '
mov ah,2
int 21h
a10: loop a9
a11: mov ah,4ch
int 21h
code ends
end start
1