该程序是家庭作业的一部分,问题是 - 程序卡住(冻结)。
使用Turbo Debugger
我知道该程序有效,并返回correct value (0)
。但是,不知道为什么,输出没有显示在屏幕上,程序卡住了。
.MODEL SMALL
.STACK 100h
.DATA
ANSWER_OUTPUT DB 'The last digit is : x',13,10,'$'
ARR1 DB 1 DUP(123,2,65)
ARR2 DB 1 DUP(1,15,54)
ARR3 DW 3 DUP(0)
MIN_NUMBER DW 0
TEN DW 10
HELP DW 0
TWO DB 2
.CODE
.386
START:
MOV AX,@DATA ; DS can be written to only through a register
MOV DS,AX ; Set DS to point to data segment
MOV DI,0
MOV SI,2
GET_ARR3:
MOV AL,ARR1[SI]
CMP AL,ARR2[DI]
JAE BIGGER
JMP SMALLER
BIGGER:
MOV AX,0
MOV AL,ARR2[DI]
MOV HELP,AX
MOV AX,0
MOV AL,ARR1[SI]
DIV HELP
MOV CX,DX
MOV AX,DI
MUL TWO
MOV DI,AX
MOV ARR3[DI],CX
DIV TWO
MOV DI,AX
INC DI
SUB SI,1
CMP DI,3
JNE GET_ARR3
JMP FIND_MIN
SMALLER:
MOV AX,0
MOV AL,ARR2[DI]
MOV HELP,AX
MOV AX,0
MOV AL,ARR1[SI]
MUL HELP
MOV CX,AX
MOV AX,DI
MUL TWO
MOV DI,AX
MOV ARR3[DI],CX
DIV TWO
MOV DI,AX
INC DI
SUB SI,1
CMP DI,3
JNE GET_ARR3
MOV AX,0
MOV AX,ARR3[0]
MOV MIN_NUMBER,AX
FIND_MIN:
MOV AX,0
MOV AX,ARR3[1]
CMP AX,MIN_NUMBER
JB CASE_1
JMP CASE_11
CASE_1:
MOV MIN_NUMBER,AX
CASE_11:
MOV AX,0
MOV AX,ARR3[2]
CMP AX,MIN_NUMBER
JB CASE_2
JMP FIND_DIGIT
CASE_2:
MOV MIN_NUMBER,AX
FIND_DIGIT:
MOV AX,0
MOV AX,MIN_NUMBER
CMP AX,TEN
JB End_Asm
DIV TEN
MOV AL,AH
MOV AH,0
MOV MIN_NUMBER,AX
MOV AX,0
JMP FIND_DIGIT
End_Asm:
MOV AX,MIN_NUMBER
ADD AL,'0'
MOV ANSWER_OUTPUT[20],AL
MOV DX,OFFSET ANSWER_OUTPUT ; Set DS:DX to point to question_output
MOV AH,9 ; Set print option for int 21h
INT 21h ; Print question_output
MOV AH,4Ch ; Set terminate option for int 21h
INT 21h ; Return to DOS (terminate program)
END START
答案 0 :(得分:2)
因为您将 HELP 定义为单词(HELP DW 0
),指令DIV HELP
会将DX:AX
除以帮助的。因此,您需要归零DX
:
xor dx, dx
DIV HELP
因为您将 TEN 定义为单词(TEN DW 10
),指令DIV TEN
会将DX:AX
除以 TEN 。因此,您需要归零DX
:
xor dx, dx <-- You need to change the code (remainder is in DX)
DIV TEN
但是在这种情况下,您只需将 TEN 的定义更改为一个字节并保留现有代码。这就是现有代码所期待的!
TEN db 10 <-- You can keep existing code (remainder is in AH)
因为您将 ARR3 数组定义为单词(ARR3 DW 3 DUP(0)
),您可以使用0,2和4等偏移来处理其元素。
您的程序错误地使用
MOV AX,ARR3[1]
其中mov ax, ARR3[2]
是正确的MOV AX,ARR3[2]
其中mov ax, ARR3[4]
是正确的考虑到上述错误,我发现很难相信“它在TurboDebugger中完美运行”。
你可能纯粹偶然得到了“正确的价值(0)”。