主题:调试通过,但是运行程序无法通过
清华大学出版社出版的 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
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