hfgsl 发表于 2022-12-3 20:23:40

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

DATA SEGMENT
ARRAYDB 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 ,00H      
      LOOPE A            
COOD ENDS
END START
;执行行后不循环,不知怎么回事

不二猫猫 发表于 2023-3-25 16:14:45

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

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

DATA SEGMENT         ; 数据段的开始
    ARRAYDB 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    ; 声明一个名为 ARRAY 的数组,包含 50 个字节元素
DATA ENDS            ; 数据段的结束

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

END START            ; 程序的结束

在这个修改后的程序中,当找到第一个 0 元素时,程序将跳转到 END_LOOP 标签处,然后在标签处执行循环结束后需要做的操作。
页: [1]
查看完整版本: 初学汇编语言,关于LOOPE循环问题