djdgf4 发表于 2023-11-26 18:48

汇编代码,同样的功能,一份会死循环

背景是学校作业:
求无符号字节序列中的最大值和最小值
设有一字节序列, 存放在数据段变量地址为BUF, 长度为08h。利用子程序的方法编程求出该序列中的最大值和最小值
我编写的代码如下:
DATA SEGMENT
    BUF DB 06H,5,3,94,3,156,255,4
    LENGTH EQU $-BUF
    MAX DB 00H
    MIN DB 00H
DATA ENDS

CODE SEGMENT
MAIN PROC FAR   
    ASSUME CS:CODE,DS:DATA
START:
      MOV AX,DATA
      MOV DS,AX
      
      LEA BX,BUF
      MOV CX,LENGTH
      CALL FIND_MINMAX
      MOV MAX,AH
      MOV MIN,AL
      
      RET
MAIN ENDP

FIND_MINMAX PROC
   PUSH BX
   PUSH CX

   JCXZ OUT_FUN ; if length is 0 , out
   
   MOV AL,    ; SET MIN = BUF
   MOV AH,    ; SET MAX = BUF
LOOP_FIND:
   
   CMP AL,; IF MIN > BUF,MIN = BUF
   JNA NEXT2MAX ; ELSE CMPARE MAX
   MOV AL,; JA
NEXT2MAX:
   CMP AH,; IF MAX <...
   JNB CMP_END
   MOV AH,; JB
CMP_END:
   INC BX
   LOOP LOOP_FIND
   
   POP CX
   POP BX
      
OUT_FUN:   RET
FIND_MINMAX ENDP

CODE ENDS
   END MAIN
运行到如图 MAIN 过程的return 处,就会不断死循环



但是,老师给的示例代码:

DATA        SEGMENT                ;数据段               
      BUF DB 8FH,90H,45H,0F9H,20H,23H,11H,01H
      DLEN EQU $ - BUF
      
      MAX DB 00H ;存放最大值
      MIN DB 00H ;存放最小值



DATA        ENDS

EXTRA        SEGMENT        ;        附加段



EXTRA        ENDS
;


STACK        SEGMENTPARASTACK‘STACK’   ;堆栈段
STAPN        DB   100 DUP (00H)        ;定义100字节空间
TOP        EQULENGTHSTAPN
STACK        ENDS
         

         
CODE        SEGMENT                       
MAIN        PROC   FAR                        ;过程定义语句
                                ;说明4个段寄存器分别与哪些段有关
                ASSUMECS:CODE, DS:DATA,ES:EXTRA,SS:STACK

START:
      MOV AX,DATA
      MOV DS,AX   
      
      MOV AX, EXTRA
      MOV ES,AX
      
      MOV AX,STACK
      MOV SS,AX
      
      ; 此处输入代码
      MOV SI, OFFSET BUF
      MOV CX, DLEN
      
      CALLFIND_MAXMIN
      
      MOV MAX,BH
      MOV MIN, BL
      
      
      RET   
MAIN        ENDP                ;MAIN过程结束
      
;输入SI 指向内存单元的指针
;      CX 数据段的长度
;输出BH--->MAX   BL---->MIN      
FIND_MAXMIN PROC NEAR
         PUSH SI
         PUSH CX
         
         
         JCXZ OUT_P
         
         MOV BH,
         MOV BL,
   
   STRAT_LOOP:MOV AL,
                INC SI
               
                CMP AL,BH               
                JA SAVE_MAX
               
                CMP AL,BL
                JB SAVE_MIN
               
                JMP END_LOOP:
               
               
    SAVE_MAX: MOV BH,AL
            JMP END_LOOP                  
         
    SAVE_MIN: MOV BL,AL   
         
   
    END_LOOP: LOOPSTRAT_LOOP
   
            POP CX
            POP SI
   
   
    OUT_P:RET      
FIND_MAXMIN ENDP      
      

CODE         ENDS                        ;代码段结束
    END   MAIN        ;整个源代码结束
         
就没有这种问题,程序能正常退出




Hamon 发表于 2023-11-26 19:40

每 loop 一次 AX 寄存器的值减 1 ,好像你的 AX 寄存器存储了当前的最大值、最小值,loop 的时候在变,更新最大值最小值的时候也在变

nis415 发表于 2023-11-26 20:51

应该是你没定义栈段,导致栈溢出修改了代码部分,你看你两个图片的CS、IP,第二个的CS、IP跳到未知的地方去了。增加栈段的定义试试。
页: [1]
查看完整版本: 汇编代码,同样的功能,一份会死循环