Я делаю подпрограмму для факториальной операции. Все мои локальные переменные имеют размер слова, так как я использую стек для передачи по значению.
[ebp+4] is the counter/decrementing multiplier
[ebp-2] is the multiplicand
В настоящее время у меня есть этот блок кода следующим образом:
while1:
cmp byte[ebp+4], 1
je exit1
dec word[ebp+4]
mov ax, [ebp-2]
mov dx, 0
mul byte[ebp+4]
mov word[ebp-2], ax
jmp while1
И он имеет следующие входные и выходные результаты:
1 -> 02561
2 -> 2
3 -> 6
4 -> 24
5 -> 120
6 -> 208
7 -> 176
8 -> 128
Это правильно только от 2 до 5. Я понял, что делаю байтовое умножение из-за mul byte[ebp+4]
, тем самым препятствуя результату 6! = 720. Поэтому я изменил mul byte[ebp+4]
на mul word[ebp+4]
:
while1:
cmp byte[ebp+4], 1
je exit1
dec word[ebp+4]
mov ax, [ebp-2]
mov dx, 0
mul word[ebp+4]
mov word[ebp-2], ax
jmp while1
Затем он имеет следующие входные и выходные результаты:
1 -> 02561
2 -> 07682
3 -> 28166
4 -> 62488
5 -> 46200
6 -> 60112
7 -> 35760
8 -> 15744
Что я делаю не так? Я уже очистил dx перед операцией mul, но почему он не работает должным образом?
Примечание. У меня есть правильная процедура печати переменной размера слова до 5 символов в ASCII для стандартного вывода. Кроме того, у меня есть особый случай 0! выполняется в cmp перед блоком кода итерации.
Я использую Ubuntu 13 x86 и NASM.
Обновить. вот блок кода прямо поверх while1:
fact:
mov ebp, esp
sub esp, 2
mov ax, [ebp+4]
mov word[ebp-2], ax
; checks if num is zero
cmp byte[ebp+4], 0
je one
word[ebp+4]
, чтобы оно былоword
, а неbyte
? Кроме того,cmp byte[ebp+4], 1
должно бытьcmp word[epb+4], 1
, но это не является причиной вашей текущей проблемы. - person lurker   schedule 06.08.2013cmp word[ebp+4], 1
не работает, это означает, что то, что находится вword[ebp+4]
, может быть не тем, что вы ожидаете, или тем, чем оно должно быть. Старший байт слова, очевидно, не равен 0. Вместо этого использование сравнения байтов где-то скрывает проблему. - person lurker   schedule 06.08.2013