Размер слова mul в сборке

Я делаю подпрограмму для факториальной операции. Все мои локальные переменные имеют размер слова, так как я использую стек для передачи по значению.

[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

person Kevin Lloyd Bernal    schedule 06.08.2013    source источник
comment
Когда вы изменили его для обработки слов, не могли бы вы показать полностью обновленный цикл while? Вам нужно будет внести изменения в пару мест, и из вашего описания неясно, что вы сделали.   -  person lurker    schedule 06.08.2013
comment
@mbrach обновил его. Извини за это. Единственная строка, которая изменилась, — это mul byte[ebp+4] на mul word[ebp+4].   -  person Kevin Lloyd Bernal    schedule 06.08.2013
comment
Вы изменили код (который вы не показываете), который инициализирует значение word[ebp+4], чтобы оно было word, а не byte? Кроме того, cmp byte[ebp+4], 1 должно быть cmp word[epb+4], 1, но это не является причиной вашей текущей проблемы.   -  person lurker    schedule 06.08.2013
comment
@mbrach Я снова обновил сообщение, вставив блок кода перед while1. Я заметил, что если я сделал cmp word[epb+4], 1 вместо cmp byte[ebp+4], 1, он не идет в je даже если он один. Поэтому вместо этого я использовал байт.   -  person Kevin Lloyd Bernal    schedule 06.08.2013
comment
Если cmp word[ebp+4], 1 не работает, это означает, что то, что находится в word[ebp+4], может быть не тем, что вы ожидаете, или тем, чем оно должно быть. Старший байт слова, очевидно, не равен 0. Вместо этого использование сравнения байтов где-то скрывает проблему.   -  person lurker    schedule 06.08.2013
comment
@mbratch Уууууууу!!! Спасибо приятель!!! Вот что произошло: у меня была переменная num размером в слово из _start, а затем она съела возврат каретки моего стандартного ввода. Я обрезал свой ввод, имея второй буфер во время стандартного ввода. Это решило это! :D   -  person Kevin Lloyd Bernal    schedule 06.08.2013
comment
Введите ответ, чтобы я мог дать вам репутацию! :)   -  person Kevin Lloyd Bernal    schedule 06.08.2013


Ответы (1)


Если cmp word[ebp+4], 1 не работает, это означает, что в слове [ebp+4] может быть не то, что вы ожидаете, или то, что должно быть. Старший байт слова явно не 0. Вместо этого использование сравнения байтов где-то скрывает проблему. Поэтому вам нужно изучить, что происходит со словом в этом месте.

person lurker    schedule 06.08.2013