2017-01-24 4 views
-4

Как добавить два регистра вместе без add, adc, sub, sbb, inc и dec?Ассамблея [ASM]: Добавление без использования арифметических операторов

+3

Вы забыли упомянуть о какой архитектуре. Для x86 вы можете использовать 'LEA'. – Jester

+0

@Jester Для x86 –

+0

@Jester Как насчет 'movd mm0, eax; movd mm0, ecx; paddd мм0, мм1; movd eax, mm0'? – fuz

ответ

0

Честно говоря, я просто взял this answer и перевел его сборку, номер на сумму в ax и bx, в то время как регистры cx и dx используются для получения промежуточных результатов, конечный результат в dx:

mov ax, 12801 ;◄■■ FIRST NUMBER. 
    mov bx, 2017 ;◄■■ SECOND NUMBER. 

l1: 

    mov cx, ax 
    and cx, bx 

    mov dx, ax 
    xor dx, bx 

    mov ax, cx 
    shl ax, 1 

    mov bx, dx 

    cmp ax, 0 ;◄■■ IF AX != 0 REPEAT. 
    jne l1 

;RESULT IN DX = 14818 
+1

Очень сложный. Как насчет 'mov si, ax; lea dx, [bx + si] '(если мы придерживаемся 16 бит, о которых никто не говорил). – Jester

+3

У меня есть это горячее желание оптимизировать код, который вы здесь представляете, за исключением того, что это было бы абсолютно абсурдно, потому что если вы действительно хотели оптимального кода, вы бы использовали 'add'! –

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