鱼C论坛

 找回密码
 立即注册
查看: 788|回复: 1

初学汇编语言,关于LOOPE循环问题

[复制链接]
发表于 2022-12-3 20:23:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
DATA SEGMENT
ARRAY  DB 12H,34H,45H,46H,87H,36H,97H,19H,32H,29H,86H,00H,25H,99H,11H,76H   
        DB 87H,13H,34H,87H,80H,73H,90H,99H,40H,12H,55H,77H,96H,83H,67H,81H
        DB 26H,96H,00H,75H,65H,98H,41H,87H,35H,83H,40H,74H,91H,44H,87H,12H
        DB 14H,87H
  DATA ENDS
COOD SEGMENT
     ASSUME DS:DATA,CS;COOD
START:      MOV AX,DATA
           MOV DS,AX
        MOV BX,OFFSET ARRAY   
       DEC BX
       MOV CX,50
       MOV AX,0
A: INC BX  
        CMP [BX],00H      
        LOOPE A            
  COOD ENDS
END START
;执行行后不循环,不知怎么回事
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-25 16:14:45 | 显示全部楼层
  1. 根据提供的代码,程序在数组中查找值为0的元素,并在找到第一个0元素后停止循环。但是,代码中使用的指令 LOOPE 指令只在 CX 寄存器的值不为零且 ZF 标志位为 1 时才会循环,因此只有当 CX 寄存器的值不为零时,循环才会继续。由于将 CX 寄存器的值设置为 50,因此即使找到了第一个 0 元素,程序也会继续循环直到 CX 寄存器的值减为 0。

  2. 要解决这个问题,可以在找到第一个 0 元素后,使用 JMP 指令跳转到程序的结束处,以避免继续循环。修改后的程序如下所示:

  3. DATA SEGMENT           ; 数据段的开始
  4.     ARRAY  DB 12H,34H,45H,46H,87H,36H,97H,19H,32H,29H,86H,00H,25H,99H,11H,76H   
  5.            DB 87H,13H,34H,87H,80H,73H,90H,99H,40H,12H,55H,77H,96H,83H,67H,81H
  6.            DB 26H,96H,00H,75H,65H,98H,41H,87H,35H,83H,40H,74H,91H,44H,87H,12H
  7.            DB 14H,87H    ; 声明一个名为 ARRAY 的数组,包含 50 个字节元素
  8. DATA ENDS              ; 数据段的结束

  9. COOD SEGMENT           ; 代码段的开始
  10.      ASSUME DS:DATA, CS:COOD    ; 指定段寄存器的默认值
  11. START:
  12.      MOV AX, DATA       ; 将数据段的段地址加载到 AX 寄存器
  13.      MOV DS, AX         ; 将数据段的段地址存储到 DS 寄存器
  14.      MOV BX, OFFSET ARRAY   ; 将数组 ARRAY 的偏移地址存储到 BX 寄存器
  15.      DEC BX             ; 将 BX 寄存器的值减 1,指向数组的第一个元素
  16.      MOV CX, 50         ; 将 CX 寄存器的值设置为 50,表示需要查找 50 个元素
  17.      MOV AX, 0          ; 将 AX 寄存器的值设置为 0,作为计数器
  18. A:   INC BX             ; 将 BX 寄存器的值加 1,指向下一个数组元素
  19.      CMP [BX], 00H      ; 比较当前元素的值是否为 0
  20.      JE END_LOOP        ; 如果当前元素的值为 0,则跳转到 END_LOOP 标签处
  21.      LOOP A             ; 循环,继续查找下一个元素
  22. END_LOOP:
  23.      ; do something after loop  ; 循环结束后需要执行的代码
  24. COOD ENDS              ; 代码段的结束

  25. END START              ; 程序的结束

  26. 在这个修改后的程序中,当找到第一个 0 元素时,程序将跳转到 END_LOOP 标签处,然后在标签处执行循环结束后需要做的操作。
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 08:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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