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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.09.2009, 20:13   #1
AlexKY
Новичок
Джуниор
 
Регистрация: 21.09.2009
Сообщений: 2
По умолчанию Умножение 16х16

Привет Всем!
Возникла проблема с умножением.
Задача была такая, Умножение с предварительным преобразованием сомножителей в модульную форму.
Множитель заносится в AX,множимое в BX.

Если поэтапно обрисовать то получилось вроде этого:
1. SignS = SignA кольцевая сумма SignB (xor)
2. Формирование модуля произведения |S|=|A|*|B|
3. { |S|, если флаг знака после 1пункта равен SF=0
S={
{ не=|S|+1, если флаг SF =1

Числа вводятся в десятичной СС потом переводятся в двоичный шестнадцатиразрядный код
PHP код:
CALC            PROC                 ПРОЦЕДУРА УМНОЖЕНИЯ  (16х16)  ??? правильно или нет ???

        
jmp     start_calc              ;
NULLRES:
        xor     
AX,AX            Обнуление результативных регистровв случае
        
xor     DX,DX            присутствия нулевого сомножителя  
        mov     
[cs:Active], 1      ;
        
mov     [cs:Result1],0;         ;
        
mov     [cs:Result2],0;         ;
        
ret
start_calc
:     
        
mov     bx,[cs:FirstDW]         ; bx -> первое число
        mov     ax
,[cs:SecondDW]    ; ax -> второе число
             
                        
        cmp     BX
,0            Если первое число == 
        je     NULLRES            
То возвращается нулевой результат
                                
        cmp     AX
,0            Если второе число == 0
        je      NULLRES            
То возвращается нулевой результат
        jns     PRE            
Проверка знака
        not     AX            
Если было отрицательное числото инвертируем:
        
not     BX            ; ...
        
inc     AX            ; ...
        
inc     BX            ; ...

PRE:        xor     DX,DX            Подготовка к циклической части
        rcr     DX
,1            Арифметический сдвиг на 1 вправо
        rcr     AX
,1            Циклический сдвиг операнда на 1 вправо через флаг переноса
        mov     CX
,10H            Число циклов 16

                        
Циклическая часть операции умножения.
LOOP0:        jnc     LOOP1            Если CF=0 то перейти на LOOP1
        add     DX
,BX            Сложение (по таблице)
        
jmp     LOOP2            Переход ко второму условию
LOOP1
:        add     DX,0            Пропуск сложения (по таблице)
LOOP2:        jo      LOOP3            Если нет переполнения(OF=0),то переход на LOOP3
        rcr     DX
,1            Сдвиг вправо с сохранением знакового бита(OF=1)
        
rcr     AX,1            Циклический сдвиг вправо (заполнение CX)
        
jmp     LOOP4            Переход к условию окончания
LOOP3
:        rcr     DX,1            Циклический сдвиг вправо для DX (OF=0)
        
rcr     AX,1            Циклический сдвиг вправо для AX
LOOP4
:        loop     LOOP0            Условие окончания (loop уменьшает CX на 1)
        
        
mov     [cs:Active], 1          ;
        
mov     [cs:Result1],ax         ;
        
mov     [cs:Result2],dx         ;
        
ret                             ;
        
CALC        ENDP 
Подскажите что не так в процедуре!!!

Последний раз редактировалось AlexKY; 21.09.2009 в 20:14. Причина: Недописал
AlexKY вне форума Ответить с цитированием
Старый 21.09.2009, 21:01   #2
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

А что не так? Копилируется, работает, даже умножает правильно
Единственно только, что я заметил, что коментарии немного не соответствуют коду. Например:
Код:
jo      LOOP3            ; Если нет переполнения(OF=0),то переход на LOOP3
По идее это команда jno, правда от ее смены ответ не меняется.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4

Последний раз редактировалось Goodwin98; 21.09.2009 в 21:05.
Goodwin98 вне форума Ответить с цитированием
Старый 22.09.2009, 05:44   #3
AlexKY
Новичок
Джуниор
 
Регистрация: 21.09.2009
Сообщений: 2
По умолчанию

Умножатся то умножается но только положительные, а если числа отрицательные то результат не соответствует действительности. Проблема как я понимаю в переводе чисел в модульную форму и обратно
AlexKY вне форума Ответить с цитированием
Старый 22.09.2009, 09:31   #4
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Опять же у меня все нормально. Умножаю, например -16 * 16 получается, как и должно -256, умножаю -16 * -16, получается 256.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Зашифрованное умножение, C++ Xumorist Помощь студентам 2 20.06.2009 22:34
умножение PAWLO1993 Паскаль, Turbo Pascal, PascalABC.NET 4 29.07.2008 18:55
Как наложить иконку с исходным размером 16х16 на битмап с размером 32х32? SkAndrew Мультимедиа в Delphi 1 26.04.2008 14:44