Я пытаюсь создать программу на языке ассемблера, основанную на теории «3n + 1», где, если число нечетное, умноженное на 3 и добавление 1 или даже четное, разделите на 2 и продолжайте движение до тех пор, пока не будет достигнуто число 1. Программа запрашивает у пользователя положительное целое число, а затем запускает программу 3n + 1, и как только она достигает 1, она возвращается к началу (еще не совсем поняла шляпу, так как я продолжаю получать сообщение об ошибке «относительный прыжок из диапазона на 0021h» байт "и чтобы программа останавливалась, когда пользователь вводит 0. во время работы программы, она должна распечатывать каждое число в последовательности (включая введенную пользователем) и продолжать работу до тех пор, пока она не напечатает 1. Проблема что я проверил мой код много раз и успешно собрал его в DosBox с помощью команды TASM без ошибок или предупреждений, но когда я запускаю его, программа, кажется, останавливается, и dosbox не дает мне подсказки для команды как это было бы, когда программа выйдет. Это мой код:Программа случайным образом останавливается без видимой причины
INCLUDE io.h
Cr EQU 0DH ; carriage return
Lf EQU 0AH ; line feed
TheStack SEGMENT STACK
DW 100H DUP (?)
TheStack ENDS
Data SEGMENT
Number Dw ?
Prompt1 DB 'Please enter the positive integer of your choice: ', 0
String DB 40 DUP (?)
New DB 6 DUP (?), 0
Int2 DB '2'
Data ENDS
Code SEGMENT
ASSUME Cs:Code, Ds:Data
Start: Mov Ax, SEG Data ; Load Data Segment Number.
Mov Ds, Ax
Prompt: Output Prompt1 ; Prompt for first number.
Inputs String, 40 ; Read the ASCII characters.
AToI String
Mov Number, Ax ;stops here i think
atoi int2
mov Ax, number
xor cx,cx
loop1: mov bx, 2
mov cx, 1
mov dx, 3
div int2
cmp ah,1
je isodd
cmp ah,0
je nextinst
xor cx,cx
nextinst: mov ax, number
div bx
add ax, cx
mov number, ax
cmp ax, number
Je loop2
xor cx,cx
isodd: mov ax, number
mul dx
add ax, cx
mov number, ax
xor cx,cx
loop2: itoa new, Ax
output new
mov Ax, number
cmp Ax,1 ; Compare cx to the limit
jg loop1 ; Loop while less or equal
Quit: Mov Al, 0 ; Put return code of zero in Al.
Mov Ah, 4CH ; Put DOS function call in Ah.
int 21H ; Call DOS
Code ENDS
END Start
Это просто так расстраивает, как у меня есть все мои петли, казалось бы, настроены правильно и внесли разные изменения в программу в отчаянных попытках заставить ее работать правильно, но безуспешно! Похоже, я бегаю по кругу, чтобы исправить то, что должно быть легко исправить. Что мне нужно сделать, чтобы программа работала правильно? Что в моем коде приведет к тому, что это произойдет? Или это просто проблема с DOSbox?
Есть ли ** номер строки ** для ошибки «относительного перехода ...»? Это 'jg loop1'? –
Вы должны отлаживать это в отладчике, так как многие вещи вас удивят ... (например, 'div int2' не делает то, что вы считаете). – Ped7g
Кстати, программа хотя бы отображает подсказку и вы можете ввести номер, и он показывает некоторые цифры? Из вашего описания неясно, где именно он останавливается. – Ped7g