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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.08.2010, 13:14   #1
Tronix
Форумчанин
 
Аватар для Tronix
 
Регистрация: 15.06.2010
Сообщений: 740
По умолчанию Деление 8bit на 8bit без DIV

Привет, пишу компилятор паскале-подобный для CHIP-8 , и застрял на банальшине:

нужно реализовать деление/умножение, используя только SHR,SHL,SUB и ADD. Подскажите пожалуйста, я что-то себе всю голову уже поломал.

Заранее спасибо.
Чтобы понять рекурсию, сперва нужно понять рекурсию.
Tronix вне форума Ответить с цитированием
Старый 09.08.2010, 13:54   #2
aRise
Пользователь
 
Регистрация: 06.08.2010
Сообщений: 11
По умолчанию

http://radiomagazine.ru/content/view/472/33/
aRise вне форума Ответить с цитированием
Старый 09.08.2010, 15:47   #3
Tronix
Форумчанин
 
Аватар для Tronix
 
Регистрация: 15.06.2010
Сообщений: 740
По умолчанию

Цитата:
Сообщение от aRise Посмотреть сообщение
Спасибо. Это видимо то, что нужно. Но... Видимо толи спать нужно больше, толи математику в школе я прогуливал часто.. Если не трудно - можно как для дибилов: в каком-нибуть псевдокоде или на 8086 ассеблере, но использую тлько 8-битные регистры и операциями SHR,SHL,SUB.

Вообще, в CHIP8 ассемблере есть следующее - 16 8битных регистров V0-VF. Регистр VF - carry flag после SUB или ADD. Операции SHR,SHL,OR, XOR, ADD,SUB.
Чтобы понять рекурсию, сперва нужно понять рекурсию.

Последний раз редактировалось Tronix; 09.08.2010 в 15:54.
Tronix вне форума Ответить с цитированием
Старый 09.08.2010, 17:03   #4
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

SHR - Поразрядное деление на степень происходит по сдвигу вправо, пример:
SHR Opr1_8bit, Opr2_8bit; Opr1_8bit - регистр или адрес памяти, Opr2_8bit - число позиций на которое нужно сдвинуть
Аналог и SHL, только SHL умножает на степень .

Последний раз редактировалось coNsept; 09.08.2010 в 17:07.
coNsept вне форума Ответить с цитированием
Старый 09.08.2010, 17:34   #5
Tronix
Форумчанин
 
Аватар для Tronix
 
Регистрация: 15.06.2010
Сообщений: 740
По умолчанию

Цитата:
Сообщение от coNsept Посмотреть сообщение
SHR - Поразрядное деление на степень происходит по сдвигу вправо, пример:
SHR Opr1_8bit, Opr2_8bit; Opr1_8bit - регистр или адрес памяти, Opr2_8bit - число позиций на которое нужно сдвинуть
Аналог и SHL, только SHL умножает на степень .
Это то понятно, Вы наверно не так меня поняли. Мне нужна функция деления любого 8-ми битного числа на любое 8-ми битное число (в том числе нечетное).

Пока получилось реализовать только остаток от деления (MOD). Выглядит так (здесь вычисляем 227 mod 135, результат получается равный 92):
PHP код:

    ld v0
227      в регистр v0 227
    ld v1
135      в регистр v1 135
divlp
:
    
ld v2,v0         сохраним текущее значение v0 в регистре v2
    sub v0
,v1       v0 := v0 v1
    se vf
,0          пропустить следующую инструкцию (jp), 
                               ; 
если произошло переполнение.
    
jp divlp          повторяем цикл
    ld v0
,v2         восстановить предыдущее значение v0
всев v0 содержится результат 92 
Это можно записать на сях примерно так:
PHP код:
mod(ab){
   
int r a
   
while(>= b){
      
b
   
}
   return 
r

Как быть с делением и умножением пока не додумал. Пробовал сдвигать бинарно но что-то намудрил там.... Не могу осилить (
Чтобы понять рекурсию, сперва нужно понять рекурсию.
Tronix вне форума Ответить с цитированием
Старый 09.08.2010, 20:54   #6
Tronix
Форумчанин
 
Аватар для Tronix
 
Регистрация: 15.06.2010
Сообщений: 740
По умолчанию

Придумал:
PHP код:
Var
      
x,y,a,b,b1,q,r,counter byte;
begin
      x 
:= 20;
      
:= 4;
      
:= 0;
      while 
>= do
            
Begin
                  a 
:= x shr 1;
                  
:= y;
                  
counter := 1;
                  while 
>= do
                        
begin
                              b 
:= b shl 1;
                              
counter := counter shl 1;
                        
end;
                  
:= x-b;
                  
:= counter;
            
End;
       
WriteLn(q);
end
В моем ассеблере выглядит так:
PHP код:
DIV:
        
ld    v6,0        := 0
__wh1
:
        
ld    v2,v0     
        
sub   v2,v1    test
        se    vf
,1
        jp    __dfin    
finish
        ld    v3
,v0    := x shr 1
        shr   v3
        ld    v4
,v1    := y
        ld    v5
,1        counter := 1
__wh2
:
        
ld    v2,v3
        sub   v2
,v4
        se    vf
,1
        jp    __wh2_done
        shl   v4
        shl   v5
        jp    __wh2
__wh2_done
:
        
sub v0,v4
        add v6
,v5
        jp __wh1
__dfin
:
    
ld v0,v6
    ret 
А умножение просто тупо реализовал сложением в цикле )))
Чтобы понять рекурсию, сперва нужно понять рекурсию.
Tronix вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
div тег как нижний слой для второго div тега dadli HTML и CSS 2 30.07.2010 01:12
Как отменить прозрачность div в прозрачном div zeharon HTML и CSS 0 24.07.2010 16:56
Позиционирование двух плавающих DIV внутри одного DIV allocator HTML и CSS 5 22.07.2009 13:48
Деление без арифметических операций imera Общие вопросы C/C++ 2 14.11.2008 03:02
Растягивающийся DIV и толкающий в низ следующий DIV Суриков HTML и CSS 6 29.08.2008 12:01