Деление 8байт на 8 байт. Алгоритм!?

Тема в разделе "WASM.ASSEMBLER", создана пользователем AlexCorvis, 29 мар 2007.

  1. AlexCorvis

    AlexCorvis New Member

    Публикаций:
    0
    Регистрация:
    7 фев 2007
    Сообщения:
    3
    Столкнулся с такой вот проблемой!
    Необходимо разделить 8 байт на 8 байт
    числа целые, беззнаковые... пытаюсь делить их "как на листочке"
    хочу реализовать школьный алгоритм в коде, но пока безрезультатно =(
    пробовал разделить эти несчастные 8 байт хотя бы на 10 для вывода числа на экран в десятичной форме, но получаю переполнение (дивайд оверфлоу)
    использовать могу только команды 8086 никаких там MMX, 32 разрядных регистров, сопроцессоров и тд...
    помогите, пожалуйста, исходником если у кого готовый завалялся или описанием алгоритма, который позволяет это реализовать...
    Большое Спасибо!
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    что получаешь при делении на 10? может ты dx не обнулил перед делением? попробуй обнулять dx и делить, как и говоришь - "на листике"
     
  3. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    AlexCorvis
    похожее было в BEGINNERS->"16 битовое деление используя 8 битные регистры"
    по-моему в Юрове "Практикум по ассемблеру" есть деление m-байтного числа на n-байтное
     
  4. lcrowl

    lcrowl New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2006
    Сообщения:
    72
    [deleted]

    хы, погнал спросонок =)
     
  5. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    lcrowl
    8 байт, а не 8 бит.
     
  6. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Деление через вычитание - прямо в лоб.
     
  7. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    алгоритм деления без восстановления Из делимого вычитается делитель, умноженный на степень двойки. Произведение числа на 2**n эквивалентно сдвигу этого числа на n разрядов влево. Если знак результата положительный, то нужно прибавить 2**n к частному, если знак результата отрицательный — частное не увеличивается. Когда знак результата меняется на отрицательный, вычитание заменяется сложением. Так повторяется при уменьшающихся степенях двойки до тех пор, пока не будет достигнута степень равная нулю. Остатком считается последний положительный результат
     
  8. AlexCorvis

    AlexCorvis New Member

    Публикаций:
    0
    Регистрация:
    7 фев 2007
    Сообщения:
    3
    Спасибо всем за советы!
    сделал пока деление вычитанием...
    работает! но если значение у делисого очень большое, к пример, во всех 8 байт 0FFFFh, а делитель 10, то это убицца можно ждать! очень долго считает, хотя это и понятно! много раз вычитать нужно...
    вот исходник
    Код (Text):
    1. del8bytes   proc    
    2. next:          
    3.             mov CX, 4
    4.             xor SI, SI
    5. sr:          
    6.             mov AL, byte ptr a[SI]
    7.             mov AH, byte ptr a[SI+1]
    8.             mov BL, byte ptr b[SI]
    9.             mov BH, byte ptr b[SI+1]
    10.             inc SI
    11.             inc SI
    12.             cmp AX, BX    
    13.             jb  a_menshe
    14.             ja  b_menshe
    15.             loop sr
    16. b_menshe:
    17.             clc              
    18.             mov CX, 4
    19.             mov SI, 8
    20. vi4AB:      
    21.             dec SI
    22.             dec SI  
    23.             mov AL, byte ptr a[SI]
    24.             mov AH, byte ptr a[SI+1]
    25.             mov BL, byte ptr b[SI]
    26.             mov BH, byte ptr b[SI+1]
    27.             sbb AX, BX
    28.             mov byte ptr a[SI], AL
    29.             mov byte ptr a[SI+1], AH
    30. loop vi4AB  
    31.            
    32.             mov CX, 3
    33.             mov SI, 6
    34.             mov AL, byte ptr del[SI]
    35.             mov AH, byte ptr del[SI+1]
    36.             add ax, 1
    37.             mov byte ptr del[SI], AL
    38.             mov byte ptr del[SI+1], AH
    39. incRez:    
    40.             dec SI
    41.             dec SI
    42.             mov AL, byte ptr del[SI]
    43.             mov AH, byte ptr del[SI+1]
    44.             adc ax, 0
    45.             mov byte ptr del[SI], AL
    46.             mov byte ptr del[SI+1], AH
    47. loop incRez
    48.  
    49.             jmp next
    50. a_menshe:              
    51.             ret
    52. del8bytes   endp
    тут я делю "a" на "b" и результат в "c" заношу...

    помогите оптимизировать эту процедурку, чтобы по-быстрее работала...
    на ее основе написал процедуру вывода чисел в десятичной форме.... так она вобще практически вешается как только числа больше FFFF FFFFh!!! все восемь байт так вобще наверно пол жизни считать будет
    хотя мне кажется тут нужен другой подход... какой-нить алгоритм по-умнее
    Mikl__, хотелось бы попробовать этот алгоритм
    не могу пока в него врубиться...
    какая степень двойки в начале должна быть?

    процедурку я написал по блок-схеме http://khpi-iip.mipk.kharkiv.edu/library/datastr/book_sod/structura/s5.gif взятой вот тут http://khpi-iip.mipk.kharkiv.edu/library/datastr/book_sod/structura/chapter3.htm
     
  9. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    разделим 125 на 11. Делитель укладывается в байт (11<255) поэтому начинаем с 2**7. В начале вычисления частное всегда равно 0:
    125 – 11 * 2**7 = –1283
    –1283 +11 * 2**6 = –579
    –579 +11 * 2**5 = –227
    –227 +11 * 2**4 = –51
    –51 + 11 * 2**3 = 37 ;результат положительный, поэтому складываем 2**3 с частным, частное равно 8+0=8
    37 – 11 * 2**2 = – 7
    –7 + 11 * 2**1 = 15 ;результат положительный, поэтому складываем 2**1 с частным, частное равно 8+2=10
    15 –11 * 2**0 = 4 ;результат положительный, поэтому складываем 2**0 с частным, частное равно 10+1=11, остаток равен 4