执行文件无限循环,但汇编程序没有报告任何错误


.MODEL SMALL
.STACK 100H
.DATA

ARRAY DB 1,9,8,3,4,7
.CODE
MAIN PROC
MOV AX,@DATA
MOV DS,AX
MOV SI,OFFSET ARRAY
MOV CX,6
MOV BL, [SI]
LOOPX:
CMP [SI], BL
JGE UPDATE
RESUME:
INC SI
LOOP LOOPX
ADD BL,51
MOV DL,BL
MOV AH,2
UPDATE:
MOV BL,[SI]
JMP RESUME
MAIN ENDP
END MAIN

我想读取数组中最大的数

程序不完整

  • 使用MOV DL,BLMOV AH,2,您已经设置了使用DOS。PrintCharacter函数02h,但是您忘记实际调用它了。只需添加int 21h
  • 你忘记结束程序了!您已经允许代码进入UPDATE,其中跳转到RESUME将创建一个无限循环。使用DOS。终止功能4Ch.

程序有错误/打字错误

要将单个数字转换为可打印的字符,需要添加48,所以ADD BL,51是错误的。

程序不是最优的

  • 第一个数组元素与自身进行比较,并触发BL的冗余重新加载。元素,此代码需要5比较得到结果。

  • 由于您希望通过DL寄存器输出结果,因此最好从一开始就使用DL。

  • 除非您为8086编程,否则最好将loop ...替换为dec cxjnz ...

    MOV  SI, OFFSET ARRAY
    MOV  CX, 6 - 1   ; 5 comparisons
    MOV  DL, [SI]    ; First element
    LOOPX:
    INC  SI
    CMP  [SI], DL
    JLE  DONTUPDATE
    MOV  DL, [SI]
    DONTUPDATE:
    DEC  CX
    JNZ  LOOPX
    ADD  DL, 48      ; You could write this as   ADD DL, '0'
    MOV  AH, 02h
    INT  21h
    MOV  AX, 4C00h
    INT  21h
    

最新更新