【发布时间】:2017-11-25 17:41:40
【问题描述】:
程序是作业的一部分,问题是 - 程序卡住(冻结)。
通过使用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
【问题讨论】:
-
在调试器中运行时,卡在哪里了?
-
另外,注释您的代码,特别是如果您希望其他人提供帮助。此外,仔细检查您的操作数大小,您无处不在。更不用说每次你
MUL或DIV两个,一只小猫死了。 -
它没有。它在 TurboDebugger 中完美运行。
-
hhhh tnx。这是我第一次来这里,只是第一次学习ASM.. DIV 或 MUL 有什么问题?这么糟糕?
-
mul/div做 *2 /2 就像纸上的人会通过计算完全乘法并对结果求和来做 2345*10,而不是在 2345 的末尾加零。二进制值“*10”是*2,“/10”是/2,所以你只需在末尾添加/删除一位。这就是左移/右移对二进制值的作用。 ...div HELP是我看到的第一个错误(您没有将dx设置为任何东西,但div r/m16确实将dx:ax除以r/m16,检查x86.renejeschke.de/html/file_module_x86_id_72.html)...也许TD 更宽容用 dx=0 开始你的代码,而 DOS 不是。