Проблемы умножения в MASM32

Привет. В настоящее время я использую MASM32, и у меня возникают проблемы с умножением. Я прочитал документацию, и не понимаю, почему она не работает.

    mov eax, input("X coordinate: ")
    mov ebx, input("Y coordinate: ")
    imul ebx, eax

    mov x, ebx
    print x

Он должен умножить содержимое ebx и eax и сохранить результат в ebx, но это не так. Скажем, вы ввели 3 и 6 — все, что он напечатает, — это 6.


person user2747058    schedule 15.05.2014    source источник
comment
Вы проверили этот вопрос?   -  person iTech    schedule 15.05.2014
comment
@iTech, этот вопрос относится к mul. Этот вопрос относится к imul.   -  person lurker    schedule 15.05.2014


Ответы (1)


Согласно документации Intel, при умножении двух 32-битных регистров результат сохраняется в комбинации регистров edx:eax, которая представляет собой 64-битное произведение. Это реализовано даже в процессорах x86-64, из соображений совместимости, ведь на момент создания процессоры Intel поддерживали только 32-битные.

Прежде всего, в вашем коде вы печатаете ebx, а не eax, что ожидалось с вашей стороны, даже если вы не знакомы с документальным фильмом Intel. Это причина, по которой ваш код печатает только 6, так как 6 было множимым в ebx. Однако, чтобы получить правильный ответ, вы все равно должны напечатать только edx:eax.

Итак, чтобы исправить это, вы должны либо сократить размер множителя и множимого до 16 бит (рекомендуемый способ), либо найти способ напечатать все edx:eax (может оказаться трудным в зависимости от импорта библиотеки).

Надеюсь это поможет.

person Pyromaster    schedule 17.05.2014