проблема в понимании множества инструкций языка ассемблера
м учиться 80386 изСборка ПК Полом Кауртером
mul source
Если операнд имеет размер в байтах, он умножается на байт в регистре AL ирезультат сохраняется в 16 битах AX.хорошо.
Если источник 16-битный, он умножается на слово в AX, а 32-битный результат сохраняется в DX: AX.Q1: Почему DX: AX? Почему можнохранить в EAX / EDX?
imul
действительно сбивает с толку
imul dest, source1
imul dest, source1, source2
альтернативный текст http://img697.imageshack.us/img697/8976/imul.gifI '
У нас проблема в понимании таблицы.
Q2: во 2-й записи таблицы. Опять же, почему DX: AX. Почему не EAX или EDX?
Теперь рассмотрим следующий фрагмент кода:
imul eax ; edx:eax = eax * eax
mov ebx, eax ; save answer in ebx
mov eax, square_msg ; square_msg db "Square of input is ", 0
call print_string ; prints the string eax
mov eax, ebx
call print_int ; prints the int stored in eax
call print_nl ; prints new line
Q3: Его предварительно сказано, чтоThe notation EDX:EAX means to think of the EDX and EAX registers as one 64 bit register with the upper 32 bits in EDX and the lower bits in EAX.
Так что ответ также хранится в edx, верно? в приведенном выше коде мы неНе думайте о EDX, о котором мы только что говорили, о EAX. Как это все еще работает?
Q4: яУ нас проблема с остальными записями в таблице. наихудший результат умножения двух n битовых чисел (n = 8/16/32 битов) составляет 2n битов. Почему происходит сохранение результата двух 16/32-битных результатов умножения в регистре самого размера?