LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1281|回复: 5

汇编中repe的疑问

[复制链接]
发表于 2005-7-14 18:18:53 | 显示全部楼层 |阅读模式
照着书写了个在串中查找指定字符的例子:

  1. data segment
  2.   string db 'ABCDEFG'
  3.   strlen equ $-string
  4.   key    db 'E'
  5.   result db ?
  6. data ends

  7. stack1 segment para stack
  8.   db 20h dup(0)
  9. stack1 ends

  10. code segment
  11.      assume cs:code,ss:stack1,ds:data,es:data
  12. start:mov ax,data
  13.       mov ds,ax
  14.       mov es,ax
  15.       cld
  16.       mov di,offset string
  17.       mov cx,strlen
  18.       mov al,key
  19.       repe scasb
  20.       jz found
  21.       mov result,0ffh
  22.       jmp exit
  23. found:dec di
  24.       mov ax,di
  25.       mov result,al
  26. exit: mov ah,4ch
  27.       int 21h
复制代码

repe重复执行串操作指令的条件是(cx)!=0 AND ZF=1
如果某次ZF为1就是说已经在串中找到了指定字符,既然找到了还重复什么啊?
如果ZF不为1,那么条件不满足就该退出,那这条语句不是什么作用都没了吗。
请高手指点
发表于 2005-7-14 21:23:43 | 显示全部楼层
不是这样的.repe重复执行的条件是ZF=0 or cx!=0,当找到时,ZF=1,当然结束了.但当没有找到时,ZF=0,CX=0也是要结束啊.兄弟,好好看书吧.看来你对寄存器这一章还不太熟.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-7-14 23:08:11 | 显示全部楼层
我的理解是cx!=0 AND ZF=0,但是我看的书上面的的确确是写的

  1. REPE/REPZ
  2. 重复执行串操作指令的条件是:(CX)!=0和ZF=1
  3. REPNE/REPNZ
  4. 重复执行串操作指令的条件是:(CX)!=0和ZF=0
复制代码

我看的书是《8086/8088系列微型计算机宏汇编语言程序设计》,电子科技大学出版社出版的,上面那4行在165页上。我在网上搜REPE的结果好像也是书上那样说的。
下面2个是网上搜到的结果:
.REPE/REPZ 当相等/为零时重复串操作
格式:   REPE(或REPZ)   String Primitive
其中String Primitive可为CMPS或SCAS指令.
执行的操作:
1)如(CX)=0或ZF=0(即某次比较的结果两个操作数不等)时退出,否则往下执行
2)(CX)<-(CX)-1
3)执行其后的串指令
4)重复1)~3)
--------------------
REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX<>0时重复
这又怎么解释啊?
回复 支持 反对

使用道具 举报

发表于 2005-7-15 12:16:30 | 显示全部楼层
REPE/Z 若(E)CX!=0 且ZF=1 则重复
REPNE/NZ 若(E)CX=!0 且ZF=0 则重复
我是这么理解:比较时是相减,假如相等 则结果为0 则ZF置1
所以书没有错的,看书时要理解其判断的机理
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-7-15 16:39:12 | 显示全部楼层
真的是书上那个程序有问题啊,我把REPE改成REPNE后,程序就能正确输出4了,修改后的代码:

  1. data segment
  2.   string db 'ABCDEFG'
  3.   strlen equ $-string
  4.   key    db 'E'
  5.   result db ?,'$'
  6. data ends

  7. stack1 segment para stack
  8.   db 20h dup(0)
  9. stack1 ends

  10. code segment
  11.      assume cs:code,ss:stack1,ds:data,es:data
  12. start:mov ax,data
  13.       mov ds,ax
  14.       mov es,ax
  15.       cld
  16.       mov di,offset string
  17.       mov cx,strlen
  18.       mov al,key
  19. [color=red]      repne scasb[/color]
  20.       jz found
  21.       mov result,0ffh
  22.       jmp exit
  23. found:dec di
  24.       mov ax,di
  25.       add ax,30h
  26.       mov result,al
  27. exit: mov dx,offset result
  28.       mov ah,09h
  29.       int 21h
  30.       mov ah,4ch
  31.       int 21h
  32. code  ends
  33.       end start
复制代码

书上那4行话没有错,是举的例子有错,而我以错误的例子为前提对REPE的重复条件产生了疑问,从昨天晚上一直想不通到今天下午,浪费了不少时间,这书真是!@#$%^
回复 支持 反对

使用道具 举报

发表于 2005-7-15 20:28:03 | 显示全部楼层
尽信书不如无书,呵呵。。。!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表