Похоже, я иду бесконечный цикл, идущий в MASM x86!Я думаю, что мне нужна помощь, чтобы понять, что именно происходит - PullRequest
0 голосов
/ 04 октября 2018

Итак, у меня есть свой код, и хотя мне нужна некоторая помощь с ним, я действительно хочу помочь понять, что он делает вместо того, что я хочу, чтобы он делал.Кто-нибудь может дать мне краткое изложение чтения языка кода?

fibSeq:
mov     ecx, userNum            ;takes user number for loop count
mov     eax, 0                  ;x = 0
mov     ebx, 1                  ;y = 1

fibSeq2:
mov     edx, eax 
add     edx, ebx                ;sum = x + y
mov     eax, ebx                ;x = y
mov     ebx, edx                ;x = sum
mov     edx, ebx
call    writeint                ;prints the value of fib seq
mov     edx, OFFSET spaces      ;adds five spaces inbetween each number
call    writestring             
mov     eax, count              ;moves count into eax register
add     eax, 1                  ;adds 1 to count
jmp     divbyFive               ;jump to check if count is divisible by 5

JMP     done                    ;once ecx is 0, jmp should go to done

divbyFive:                      ;check if count is divisible by 5
mov     edx, 0                  ;clearing the edx register
mov     eax, count              ;moving count into eax
mov     ecx, 5                  ;count / 5
div ecx
cmp     edx, 0                  ;if the remainder = 0, jump to new line
JE      newLine
JNE     fibSeq2                 ;otherwise go back to the sequence

newLine:
call crlf                       ;if the count is divisible by 5 with no remainder, prints a new line
jmp fibSeq2                     ;afterwards, jumps back up to fibSeq2

loop    fibSeq2     

done:

Прямо сейчас это просто печатать +1 снова и снова, но я хочу, чтобы это печатало числа в последовательности Фибоначчи, покаecx = 0, и начинайте новую строку каждые 5 цифр.

Пример:

0 1 1 2 3

5 8 13 21 34

искоро!

1 Ответ

0 голосов
/ 05 октября 2018

Есть несколько проблем с этим кодом.

  1. Он использует одни и те же регистры для нескольких целей.eax используется для хранения x, а также для увеличения количества и деления.ecx используется для счетчика цикла, но также и в div.

  2. После увеличения счетчика новое значение не сохраняется обратно в переменную, поэтому оно теряется.

  3. Существует несколько недоступных инструкций, поскольку они следуют безусловному переходу и не имеют метки.

Инструкция цикла не очень полезна;Вы можете сделать то же самое с dec, за которым следует jnz, используя любой регистр или ячейку памяти, вместо того, чтобы ограничиваться использованием ecx.

Существует три неиспользуемых регистра, edi, esi и ebp, которые можно использоватьдля х, у и счетчик цикла.Затем вы можете использовать eax, edx и ecx в качестве временных значений для вычисления суммы, приращения и деления.

Вы должны сохранить эти регистры перед их использованием.(Кстати, вы также должны сохранить ebx.) Преимущество любого из них заключается в том, что они будут сохраняться любыми функциями, которые вы вызываете (например, writestring), при соблюдении большинства 32-битных соглашений о вызовах.(Но функции Irvine32 обычно сохраняют все регистры, кроме возвращаемого значения, используя свое специальное соглашение о вызовах.)

...