吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 443|回复: 2
收起左侧

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

[复制链接]
djdgf4 发表于 2023-11-26 18:48
背景是学校作业:
求无符号字节序列中的最大值和最小值
设有一字节序列, 存放在数据段变量地址为BUF, 长度为08h。利用子程序的方法编程求出该序列中的最大值和最小值
我编写的代码如下:
[Asm] 纯文本查看 复制代码
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,[BX]    ; SET MIN = BUF[0]
     MOV AH,[BX]    ; SET MAX = BUF[0]
 LOOP_FIND:
     
     CMP AL,[BX]  ; IF MIN > BUF[I],MIN = BUF[I] 
     JNA NEXT2MAX ; ELSE CMPARE MAX
     MOV AL,[BX]  ; JA
  NEXT2MAX:
     CMP AH,[BX]  ; IF MAX <  ...
     JNB CMP_END 
     MOV AH,[BX]  ; JB 
  CMP_END: 
     INC BX
     LOOP LOOP_FIND
     
     POP CX
     POP BX
        
  OUT_FUN:   RET
FIND_MINMAX ENDP

CODE ENDS
     END MAIN

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

自己的代码

自己的代码
image.png

但是,老师给的示例代码:
[Asm] 纯文本查看 复制代码
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	SEGMENT  PARA  STACK  ‘STACK’   ;堆栈段
STAPN	DB     100 DUP (00H)	;定义100字节空间
TOP	EQU  LENGTH  STAPN
STACK	ENDS
           
 
           
CODE	SEGMENT			
MAIN	PROC   FAR			;过程定义语句
				;说明4个段寄存器分别与哪些段有关
		ASSUME  CS: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
        
        CALL  FIND_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, [SI]
         MOV BL, [SI]
    
   STRAT_LOOP:  MOV AL,[SI]
                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: LOOP  STRAT_LOOP 
    
            POP CX
            POP SI
    
    
    OUT_P:  RET        
FIND_MAXMIN ENDP       
        

CODE 	ENDS	          	;代码段结束
    END   MAIN	;整个源代码结束
          

就没有这种问题,程序能正常退出

老师的代码

老师的代码

在HLT处停止

在HLT处停止



发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Hamon 发表于 2023-11-26 19:40
每 loop 一次 AX 寄存器的值减 1 ,好像你的 AX 寄存器存储了当前的最大值、最小值,loop 的时候在变,更新最大值最小值的时候也在变
nis415 发表于 2023-11-26 20:51
应该是你没定义栈段,导致栈溢出修改了代码部分,你看你两个图片的CS、IP,第二个的CS、IP跳到未知的地方去了。增加栈段的定义试试。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-19 08:18

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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