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

[讨论]这个程序有错吗?

曾小 发布于 2006-11-29 19:08, 1027 次点击
这个程序是将字符 '&' 替换成 空格,但得不到预想的结果.
帮忙该一下.谢谢!
dseg segment
result dw ?
dseg ends
eseg segment
string db 'the data is FEB&03'
eseg ends
cseg segment
assume cs:cseg,ds:dseg,es:eseg
start: mov ax,dseg
mov ds,ax
mov ax,eseg
mov es,ax
lea si,string
mov al,'&'
mov cx,18
mov result,cx
sign: cld
repz scasb
sub result,cx  ;将原来的cx 即 result 的值与现在的cx 的值相减,得到所要找的字符的位置
mov [result][di],20H;将找到的位置里的内容换成空格
loop sign
ret
cseg ends
end start

[此贴子已经被作者于2006-11-30 14:09:12编辑过]

15 回复
#2
hu9jj2006-11-29 20:04

很久没有接触汇编,可能说的不对。会不会是你的mov cx,18有问题?“&”的ASCII码是26H,十进制数是38。而你将18(PgUp键值)存入了result单元中了。

dseg segment
result dw ?
dseg ends
eseg segment
string db 'the data is FEB&03'
eseg ends
cseg segment
assume cs:cseg,ds:dseg,es:eseg
start: mov ax,dseg
mov ds,ax
mov ax,eseg
mov es,ax
lea si,string
mov al,'&'
mov cx,18
mov result,cx ;PgUp的键值存入resul单元中
sign: cld
repz scasb
sub result,cx
mov [result][di],20H
loop sign
ret
cseg ends
end star

#3
菜鸟上路2006-11-29 20:06
mov [result][di],20H是什么意思啊?
#4
hu9jj2006-11-29 20:08
应该有个加号吧,如下:
mov [result]+[di],20H
#5
曾小2006-11-29 20:17
我是想通过这条指令:

mov [result][di],20H

将空格(20h)替换到[result][di]这个单元中去!

有问题?

我将 cx放到result中去和字符 '& '没有关系!
#6
hu9jj2006-11-29 20:19
直接数能够MOV到内存单元吗?可能要通过寄存器转存吧!
#7
曾小2006-11-29 20:25
不可以吗?
我没注意!错误在:19行:must be index or base register
是这个的原因吗?
#8
hu9jj2006-11-29 20:34

我记得立即数是不能MOV到内存单元和段寄存器中的,应该通过通用寄存器转存。

#9
曾小2006-11-29 20:39
我刚才改了,还是达不到预想的结果.
其他地方有什么问题吧/要不然怎么没结果!!!
#10
菜鸟上路2006-11-29 20:41
以下是引用hu9jj在2006-11-29 20:34:36的发言:

我记得立即数是不能MOV到内存单元和段寄存器中的,应该通过通用寄存器转存。

同意!

#11
duhuan272006-11-29 22:21
版主可不可以把正确的写出来啊
我就是mov cx,18
mov result,cx 看不懂
为什么要把18给result
#12
wchx2152006-11-30 12:32
eseg segment
string db 'the data is FEB&03','$'
eseg ends
cseg segment
assume cs:cseg,es:eseg
start:
mov ax,eseg
mov es,ax
lea di,string
mov al,'&'
mov cx,18
sign: cld
repnz scasb
mov byte ptr es:[di-1],20H
assume ds:eseg
mov ax,eseg
mov ds,ax
lea dx,string
mov ah,09h
int 21h
mov ax,4c00h
int 21h
cseg ends
end start
你的程序我看不大懂,我就改了比较多了,供参考!
#13
曾小2006-11-30 14:02
我把 18 放到 result 中是想方便mov [result][di],20H
指令的执行.我也不怎么确定.
12楼的同学:你的程序运行了不?我怕我又弄不出来.
希望更多的同学提出更多的方法!
谢谢!
我现在试着解释一下我的程序吧!
#14
srl99732006-11-30 15:06
dseg segment
result dw ?
dseg ends
eseg segment
string db 'the data is FEB&03'
eseg ends
cseg segment
assume cs:cseg,ds:dseg,es:eseg
start: mov ax,dseg
mov ds,ax
mov ax,eseg
mov es,ax
lea di,string
mov al,'&'
mov cx,18
mov result,cx
sign: cld
repnz scasb
jcxz ll
mov es:[di-1],byte ptr 20h


; sub result,cx  ;将原来的cx 即 result 的值与现在的cx 的值相减,得到所要找的字符的位置
;mov [result][di],20H;将找到的位置里的内容换成空格
jmp sign
mov ah,4ch
int 21h
cseg ends
end start
#15
wchx2152006-11-30 18:07

首先说一下,我的程序自己已经运行过了。
楼主的程序是有错的,14楼的解释是对的。
楼主估计是这个意思,但是在repnz scasb过程中di已经变化了,不是0,所以可以加一句lea si,string
mov [result-1][si],20h还有顺便说一下,直接运行mov byte ptr es:[result-1][si],20h是不行的,链接不通过
我按楼主的意思又改了一下,我已经运行过了。
dseg segment
result dw ?
dseg ends
eseg segment
string db 'the data is FEB&03','$'
eseg ends
cseg segment
assume cs:cseg,ds:dseg,es:eseg
start: mov ax,dseg
mov ds,ax
mov ax,eseg
mov es,ax
lea di,string
lea si,string
mov al,'&'
mov cx,18
mov result,cx
sign: cld
repnz scasb
jcxz show
sub result,cx ;将原来的cx 即 result 的值与现在的cx 的值相减,得到所要找的字符的位置
mov bx,result
mov byte ptr es:[bx-1][si],20H ;将找到的位置里的内容换成空格

jmp sign
show: assume ds:eseg
mov ax,eseg
mov ds,ax
lea dx,string
mov ah,09h
int 21h

mov ah,4ch
int 21h
cseg ends
end start

#16
曾小2006-12-01 16:03
我已经按12楼的意思运行出来了
我意识到di是会变的。
谢谢各位!!呵呵!
1