回 帖 发 新 帖 刷新版面

主题:调试通过,但是运行程序无法通过

清华大学出版社出版的 80X86汇编语言程序设计教程 杨季文 著

4.6  习题
题 4.31 请编写一个能够在最低端的640K内存区域内搜索指定信息的小型工具,使用说明自定。


我的大概思路是通过  DOS 调用 请求输入一串字符,然后在内存中查找与输入字符串相符合的内存地址通过屏幕输出。

下面是我的程序: 
问题是---如果输入的字符串在内存中无法找到,那么每次都会显示一组固定不变的内存地址

经过检测  发现 : 本意是比较  段地址从 0000到段 地址0009 的内存数据,但是程序每次只比较 0000:0000---0000:FFFF的数据,其它的数据根本没有比较

经过多次调试,发现问题 具体出现在 next2 标号 后面的一段程序,但是始终无法发现问题所在,请问有谁可以帮帮我,实在感激不尽。


   dseg segment
msg db 10
    db ?
    db 10 dup(0)
stg db 'no string$'
h1  db 5 dup('$')

flog db 0
  dseg ends

  cseg segment

assume ds:dseg,cs:cseg

start:
mov ax,dseg
mov ds,ax
xor ax,ax
mov es,ax

mov dx,offset msg
mov ah,0ah
int 21h



call pd

cmp byte ptr flog,1
jnz jx
mov dx,offset stg
mov ah,09h
int 21h
jmp ok
jx:
push di
mov ax,es
mov si,offset h1

call disp

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



pop di
mov cl,[bx+1]
mov ch,0
sub di,cx
mov ax,di
mov si,offset h1
call disp
mov dx,offset h1
mov ah,09h
int 21h

ok:
mov ah,4ch
int 21h

  pd proc 

xor cx,cx
xor si,si
xor di,di
xor bx,bx
mov bx,offset msg
xor bp,bp
mov cl,[bx+si+1]
mov ch,0
mov bp,cx

next4:
clc

  next1:                         / 内存中的数据逐个比较,目的地址di每次加1
jc next2                         当di为0FFFFH时,加上1变为0,那么根据CF的值进
mov al,[bx+si+2]                    进行跳转/
cmp es:[bx+di],al
jz next
cmp si,0
jnz next8
add di,1
mov cx,bp
jmp next1
next8:
xor si,si
mov cx,bp
jmp next1

next:
clc              
inc si
add di,1
next9:
   loop next1

mov byte ptr flog,0

  next7:
ret

 next2:                      / 比较段地址 ES 有没有到达0009 /

 mov ax,es
 cmp ax,09h
 jae next3
 inc ax
 mov es,ax
xor si,si 
xor di,di
 jmp next4
 next3:
   mov byte ptr flog,1        / 如果没有找到符合的数据,flog 置位,做标记/

  jmp next7
pd endp



disp proc         /显示 找到的数据的 内存地址/

mov cx,4

next5:

rol ax,1
rol ax,1
rol ax,1
rol ax,1
mov dl,al
call ato
loop next5
ret

 disp endp

ato proc
and dl,0fh
cmp dl,09h
jbe bc
add dl,07h
bc: add dl,30h
mov [si],dl
inc si
ret
ato endp

cseg ends
end start

回复列表 (共6个回复)

沙发

没有人可以帮我吗?谢谢

板凳

你 jc next2前面没有建立标志阿

3 楼

建立标志?? 使用  jc 命令需要建立什么标志?不吝赐教

4 楼

jc是 if(carray) jmp 的意思
carray 是flag(即标志),它一般是cpu自己设的,但也可以手工设置像stc,clc之类的。

5 楼

已经建立标志了,这个问题困扰了我好几个月了

现在仍然没有解决啊,痛苦ing.....

6 楼

没有人可以帮我吗?谢谢

我来回复

您尚未登录,请登录后再回复。点此登录或注册