汇编代码,同样的功能,一份会死循环
背景是学校作业:求无符号字节序列中的最大值和最小值
设有一字节序列, 存放在数据段变量地址为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 ;整个源代码结束
就没有这种问题,程序能正常退出
每 loop 一次 AX 寄存器的值减 1 ,好像你的 AX 寄存器存储了当前的最大值、最小值,loop 的时候在变,更新最大值最小值的时候也在变 应该是你没定义栈段,导致栈溢出修改了代码部分,你看你两个图片的CS、IP,第二个的CS、IP跳到未知的地方去了。增加栈段的定义试试。
页:
[1]