2014-09-03 3 views
3

Я составил код для определения всех факториалов заданного числа на ассемблере 8086. Но проблема в том, что я ошибаюсь. Например: когда ввод равен 54, я получаю результат как 6, но результат должен быть 8. Он также дает ошибки для некоторых других входов. Но я не могу узнать проблему в своем коде.Ошибка при поиске всех факторов заданного числа

Вот мой код:

.MODEL SMALL 
.STACK 100 

.DATA 

NUMBER DW 54 

.CODE 

MAIN PROC 

MOV AX,@DATA 
MOV DS,AX 

MOV AX,NUMBER 
MOV BX,1 
MOV CX,0 

WHILE_: 
DIV BX 
CMP DX,0 
JE CHECK 

MOV AX,NUMBER 
INC BX 
CMP BX,AX 
JL WHILE_ 
JMP END_ 



CHECK: 
CMP AX,BX 
JG INC_ 
JE INC2_ 
JMP END_ 


INC_: 
ADD CX,2 
MOV AX,NUMBER 
INC BX 
CMP BX,AX 
JL WHILE_: 
JMP END_ 


INC2_: 
INC CX 
JMP END_ 



END_: 
ADD CX,48 
MOV AH,2 
MOV DX,CX 
INT 21H 



MOV AH,4CH 
INT 21H 




MAIN ENDP 

END MAIN 
RET 

Какие изменения я должен сделать, чтобы получить правильный вывод (как 8 для 54)

+0

Я не знаю, в какой среде вы работаете. Но в любом случае, первое, что вы должны сделать, это отладить вашу программу. Для сборки 8086 вы можете использовать Borland Turbo Debuger и идти шаг за шагом. Кроме того, вы можете увидеть [этот пост] (http://stackoverflow.com/questions/2844703/algorithm-to-find-the-factors-of-a-given-number-shortest-method) об алгоритмическом подходе для решения проблемы проблема, но находится в C. – JosEduSol

+0

Кроме того, вы должны прокомментировать свой код, для других и для себя. Легче следовать логике. – JosEduSol

ответ

2

Вам нужно обнулить dx перед div

WHILE_: 
; something here to zero dx 
DIV BX 
CMP DX,0 
JE CHECK 

Исправив это, я получаю правильные результаты для многих чисел. В вашем выпуске все еще будет проблема, если число больше 9. Ваш код работает с одиночными цифрами, для более чем одной цифры (скажем, для коэффициентов 72), вам нужно преобразовать полученную строку в ASCII.

Он также помогает размещать код без ошибок!

INC_: 
ADD CX,2 
MOV AX,NUMBER 
INC BX 
CMP BX,AX 
JL WHILE_: ; <<<<< What is this colon?!?! 
JMP END_ 

Научитесь комментировать свой код! Это важно в сборке и поможет поймать ошибки. Кроме того, вы отправляете 16-битный код, он старый и мертвый! Многие из нас не использовали его много лет!

Смежные вопросы