2015-04-26 2 views
0
NOTICE: This question does relate to my homework/classwork. The textbook is poorly written so I can't really rely on it. 

Я использую Linux x86 ассемблер, и я пытаюсь выяснить, как умножить два 32-разрядных чисел вместе с помощью сдвига операнда. Мне также нужно найти способ хранения 64-битного ответа на два отдельных регистра, так как каждый регистр имеет всего 32 бита. Я знаю, что переход налево один раз эквивалентен умножению на два, а смещение вправо - на два, но на этот раз я уверен. Любая помощь будет оценена, объяснения более чем ответы.x86 ассемблер: Shift умножение с 64 битным ответом

+1

См. Http://courses.cs.vt.edu/~cs1104/BuildingBlocks/multiply.040.html –

ответ

1

Я думаю, что это нужно сделать, это:

mult: 
     #save all caller-saved regs 
     #move arg1 to %edi, arg2 to %esi 

     xorl %eax, %eax   #\ 
     xorl %edx, %edx   #--clear a 64-bit accumulator 
     movl $31, %ecx   #set up shift-count 

.L1: movl %edi, %ebx   #copy of arg1 
     xorl %ebp, %ebp   #zero scratch-register 
     shll %cl, %ebx   #isolate bit from arg1 
     sarl $31, %ebx   #and turn into mask 
     andl %esi, %ebx   #AND arg2 with bitmask 
     xorl $31, %ecx   #invert shift-count 
     shldl %cl, %ebx, %ebp #shift upper bits into scratch-reg 
     shll %cl, %ebx   #adjust lower bits 
     addl %ebx, %eax   #\ 
     addl %ebp, %edx   #-- accumulate results 
     xorl $31, %ecx   #restore shift-count 
     decl %ecx    #change shift to next bit 
     jno .L1      #if ecx == -1, done! 

     #restore caller-saved regs 
     #done, return value in edx:eax 

Обратите внимание, что это относится аргументы, как беззнаковое.

+0

Хорошо, что до сих пор хорошая информация, но как бы я сделал что-то вроде 5 миллионов * 2 миллиона и сохранил их результат в eax и edx? (Младшие биты в eax и верхние биты в edx). – ProgrammingNoob

+0

@ProgrammingNoob: Если в начале моего кода '% edi' содержит 5 миллионов, а'% esi' 2 миллиона, то в конце функции '% edx' будут содержать высокие бит результата,'% eax' низкие разряды. – EOF

+0

О, ладно, извините за то, что мои способности по пониманию чтения в последнее время сильно меня не впечатляют. – ProgrammingNoob

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