Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.05.2013, 18:58   #1
zaninpsih
Новичок
Джуниор
 
Регистрация: 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
zaninpsih вне форума Ответить с цитированием
Старый 02.05.2013, 19:26   #2
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

zaninpsih,
не стоит создавать одни и те же темы на всех ассемблерных форумах подряд, здесь те же люди, что и на cyberforum.ru
Mikl___ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Возведение в 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