大会家庭作业

时间:2017-11-25 17:41:41

标签: assembly x86-16 tasm

该程序是家庭作业的一部分,问题是 - 程序卡住(冻结)。

使用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

1 个答案:

答案 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)”。