2014-09-15 3 views
0

Например, код должен в принципе сделать это: (1 * 10) + (2 * 10) + (3 * 10) + (4 * 10) = итогоКак получить произведение умножения в сборке?

xor bx, bx 
    mov bx, 1 

    loopHere: 
     mov al, bx 
     mov bl, 10 
     mul bl 
     ; add total, <product of bx and 10> 
     inc bx 
    cmp bx, 4 
    jle loopHere 

    ;some code to print the total 

Я прочитал, что продукт проходит к AX. Однако я не знаю, как получить продукт в AX. Сначала я попробовал печатать

add total, ax 

, потому что это была первая очевидная вещь, что пришло мне в голову, но, видимо, я не прав. : P Обнаружена ошибка, указывающая «неверные операнды команд» в командной строке (я использую masm32). Пожалуйста, помогите мне понять. Я просто новичок в сборке.

Кроме того, если есть более эффективный способ сделать код, я бы с радостью принял ваш совет. :) Спасибо.

ответ

0

Поскольку вы используете al и bl для умножения, вам понадобится третий регистр для хранения суммарной суммы.

add cx, ax ; don't forget to make sure cx is zero before you start 

По сути, вы не определить total переменные, так что вы не можете использовать его в вашем коде. Если бы была метка с именем total, указывающая на переменную в памяти, я думаю, вы тоже можете ее использовать.

add [total], ax 

В этом случае вам, вероятно, не нужна переменная в памяти, так как регистр будет достаточным и быстрее.

+0

У меня есть следующий вопрос, потому что я забыл, что mov al, bx также имеет ошибку, почему это ошибка? Есть ли способ обойти это? – wema

+0

'bx' - 16 бит, а' al' - 8 бит. Ширина обоих операндов должна соответствовать, или она не будет знать, сколько данных на самом деле нужно переместить. –

0

Это рабочий раствор на 32 бита:

xor esi, esi  ;// Clear esi (lower DWORD result) 
xor edi, edi  ;// Clear edi (higher DWORD result) 
mov ecx, 4   ;// Multiplicant 
mov ebx, 10   ;// Multiplicator 
COUNTER_LOOP: 
    mov eax, ebx ;// eax = Multiplicator 
    mul ecx   ;// eax = Multiplicant * eax (Multiplicator) 
    add esi, eax ;// add lower DWORD result ("total") to esi 
    adc edi, edx ;// add higher DWORD result ("total") to edi 
loop COUNTER_LOOP ;// Multiplicant = Multiplicant - 1 => next loop 

Результат сохраняется в ESI (нижняя DWORD) и электронного обмена данными (выше DWORD). Но я рекомендую сначала прочитать хорошую ассемблерную книгу, потому что это может быть трудно понять детали для новичков.

 Смежные вопросы

  • Нет связанных вопросов^_^