|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
02.05.2013, 18:58 | #1 |
Новичок
Джуниор
Регистрация: 02.05.2013
Сообщений: 1
|
Умножение чисел используя SHL и ADD
Всем привет! В программе нужно ввести два числа и перемножить их только с использованием функций шифтинга в лево SHL и сложения ADD. Я попытался это сделать и вроде бы логически все правильно, но прога зацикливается и вылетает с ошибкой. ПОМОГИТЕ, не знаю в чем дело! Посмотрел листинг и ужаснулся, что в EDX записываются страшные цифры.
Мой код: INCLUDE Irvine32.inc .data s1 byte "enter your multiplayer2: ",0 s2 byte "enter your multiplayer1: ",0 s3 byte "The result of multiplication is: ",0 mult DWORD ? mult2 DWORD ? temp DWORD 0 count BYTE 0 countStack BYTE 0 multTEMP DWORD 0 multTfin DWORD ? storemul2 DWORD ? two DWORD 2 .code main PROC mov EAX,0 mov EBX,0 mov ECX,0 call Clrscr call promtforInt call promtforInt2 call howMuchShift call FastMultiply call display exit main ENDP ;--------------------0 promtforInt PROC ;USES EDX mov edx, OFFSET s2 call WriteString call ReadInt mov mult,EAX mov storemul2, EAX call Crlf ret call DumpRegs exit promtforInt ENDP ;--------------------1 promtforInt2 PROC ;USES edx mov edx, OFFSET s1 call WriteString call ReadInt mov mult2,EAX ;mov edx, eax call Crlf call DumpRegs ret exit promtforInt2 ENDP ;--------------------2 howMuchShift PROC ;identify how many times we need to shift the multiplayer mov countStack,0 ;clear the numbeк of value in stack L0: call DumpRegs inc countStack ;how many elements in STACK mov count,1 ;clear count mov ECX, 32 ;set the LOOP mov EAX, 2 ;set EAX by 2 L1: mul two ;multiply by 2 until loop is over cmp EAX, mult ;comparison eax to multiplayer2 jg M1 ;finish LOOP if eax>multiplayer2 inc count ;counting how many times loop is repeated mov multTEMP,EAX ;store max value je EX ;finish LOOP if eax=multiplayer2 LOOP L1 ;END of loop M1: mov ECX,0 movzx ECX, count push ECX ;save COUNT for the first mov EBX, mult ;set EBX by multiplayer sub EBX, multTEMP ;difference between multiplayer and MAX value mov mult,EBX ;set MULT for new LOOP by that difference cmp EBX,1 ;if differense=1 je M2 cmp EBX,2 ;if differense=2 je M3 cmp EBX,3 ;if differense=3 je M4 jmp L0 ;GO to L0 M2: push 0 inc countStack exit M3: push 1 inc countStack ret exit M4: push 1 push 0 inc countStack inc countStack ret exit call Crlf call DumpRegs EX: movzx ECX, count push ECX mov ecx,0 ret exit ;call DumpRegs howMuchShift ENDP ;--------------------3 FastMultiply PROC ;USES edx mov EDX,0 movzx ECX,countStack L1: mov EBX,0 mov EBX,mult2 mov eax,0 pop EAX mov cl,al shl EBX, cl add EDX,EBX LOOP L1 call Crlf ret call DumpRegs exit FastMultiply ENDP ;-------------4 display PROC ;USES edx mov eax,0 mov eax,edx mov edx,0 mov edx, OFFSET s3 call WriteString call WriteInt call Crlf ret call dumpregs exit display ENDP END main |
02.05.2013, 19:26 | #2 |
Участник клуба
Регистрация: 11.01.2010
Сообщений: 1,139
|
zaninpsih,
не стоит создавать одни и те же темы на всех ассемблерных форумах подряд, здесь те же люди, что и на cyberforum.ru |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Возведение в 6 степень, используя только умножение не более 3-х раз | webber9989 | C# (си шарп) | 2 | 09.10.2011 01:44 |
Умножение больших чисел | Relrin | Помощь студентам | 13 | 22.10.2010 20:44 |
Умножение огромных чисел | Pedro | Помощь студентам | 3 | 19.04.2009 21:32 |
умножение 16-разрядных чисел | deeeman | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 3 | 12.12.2007 13:26 |