Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > Работа с большими числами...


Автор: Lеstat 9.2.2007, 00:46
Возникла необходимость провернуть четыре основные математические операции с огромными числами
числа 8-ми байтные... 
бегая в поиске инфы я наткнулся на то, что нужно использовать флаги переноса для создания цепочки регистров под свое число.
почитав о флаге переноса вычитал, что этот флаг служит для переноса единички, если число не влезло в регистр, но толком не понял как с этим работать. 
Как собрать цепочку регистров и как с ней работать?
Нету ли где-нибудь примера работы с большими числами? 
как провернуть сложение двух 8-ми байтных числа к примеру?
еще вот тонкость...  к примеру мы умножаем два 8-ми байтных числа, насколько я понимаю, можем получить 16 байтное число! куда же его... в умной книге было написано, что регистров всего 16, юзать все нельзя... регистров-то хватит?
Буду благодарен за любую информацию! 

Автор: W4FhLF 9.2.2007, 10:04
Ну во-первых числа делятся на целые и вещественные, расширенный формат вещественного числа может хранить значения от 10^-4932 до 10^4932. Если речь идёт о целых числах, то в природе существуют команды mmx расширения и регистры этого набора команд имеют размерность 64 бита(8 байт), одной командой ты можешь складывать, вычитать, умножать и делить эти числа. Если же ты хочешь ограничиться основным набором команд для целочисленных вычислений, то при работе с 64 разрядными числами следует учитывать флаг переноса(CF, я так понял о нём ты уже слышал), просто прочти справку по командам: adc, sbb, imul, idiv. 

Автор: Lеstat 22.3.2007, 16:48
Складывать и умножать уже научился... 
Подскажите алгоритм деления пожалуйста... 
числа целые в 8 байт, беззнаковые... в проге могу юзать только 16-ти разрядные регистры... проц 8086

вот как умножать получилось если кому в будущем понадобится: 
Код

a dw 1010110110111100b, 1101110111011101b, 1100110010110101b, 0011001110101011b  
b dw 0010001110101011b, 0101011000010010b, 0011010001101000b, 1001110010111101b              
c dw 8 dup (0) 


    ;======================== 4 slovo
    mov AX, a[6]
    mul b[6]    
    add c[14], AX
    adc c[12], DX
    adc c[10], 0
    
    mov AX, a[4]
    mul b[6]
    add c[12], AX   
    adc c[10], DX 
    adc c[8], 0
    
    mov AX, a[2]
    mul b[6]
    add c[10], AX   
    adc c[8], DX 
    adc c[6], 0    
    
    mov AX, a[0]
    mul b[6]
    add c[8], AX   
    adc c[6], DX 
    adc c[4], 0     
    
    ;======================== 3 slovo 
    mov AX, a[6]
    mul b[4]    
    add c[12], AX
    adc c[10], DX
    adc c[8], 0
    
    mov AX, a[4]
    mul b[4]
    add c[10], AX   
    adc c[8], DX 
    adc c[6], 0
    
    mov AX, a[2]
    mul b[4]
    add c[8], AX   
    adc c[6], DX 
    adc c[4], 0    
    
    mov AX, a[0]
    mul b[4]
    add c[6], AX   
    adc c[4], DX 
    adc c[2], 0 
    
    ;======================== 2 slovo 
    mov AX, a[6]
    mul b[2]    
    add c[10], AX
    adc c[8], DX 
    adc c[6], 0
    
    mov AX, a[4]
    mul b[2]
    add c[8], AX   
    adc c[6], DX 
    adc c[4], 0
    
    mov AX, a[2]
    mul b[2]
    add c[6], AX   
    adc c[4], DX 
    adc c[2], 0    
    
    mov AX, a[0]
    mul b[2]
    add c[4], AX   
    adc c[2], DX 
    adc c[0], 0   
    
    ;======================== 1 slovo 
    mov AX, a[6]
    mul b[0]    
    add c[8], AX
    adc c[6], DX
    adc c[4], 0
    
    mov AX, a[4]
    mul b[0]
    add c[6], AX   
    adc c[4], DX 
    adc c[2], 0
    
    mov AX, a[2]
    mul b[0]
    add c[4], AX   
    adc c[2], DX 
    adc c[0], 0    
    
    mov AX, a[0]
    mul b[0]
    add c[2], AX   
    adc c[0], DX 

понимаю... без циклов не очень, но кое как работает
помогите алгоритмом деления плз!
пробую делить "как на бумаге руками", но не получается
выскакивает "divide overflow"
как с этим бороться можно? нужно к примеру DX:AX  -  FFFFh:FFFFh разделить на слово 0001h
частное в AX ну никак не влезает... что с этим делать?

Автор: Akina 22.3.2007, 17:16
Используй сдвиговое деление вычитанием... для этого напиши процедуры LongCompare и LongShift, a LongAdd и LongSub у тебя, как я понимаю, уже есть.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)