2 / 2 / 1
Регистрация: 28.09.2012
Сообщений: 34
1

Длинная арифметика

13.10.2013, 00:00. Показов 422. Ответов 0
Метки нет (Все метки)

Здравствуйте. пытаюсь написать инициализацию следующей структуры:
Assembler
1
2
3
4
5
6
7
BigNum struct
 
    sizeNum DWORD ?   ;размер числа
    signNum BYTE ?      ;знак числа
    buf     DWORD ?   ;указатель на массив разбитых по 4 байта частей длинного числа
    
BigNum ends
Инициализируется из строки символов цифр в 16-тиричной СС. ну что-то вроде 11112222333344445555 (так что бы явно больше двойного слова). написал следующее
Кликните здесь для просмотра всего текста

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
;на входе ссылка на структуру, и сслка на строку с цифрами
BigNum_init proc c uses esi edi ebx eax ecx, ptr_BigNum:ptr BigNum, ptr_char:ptr byte
 
    local strSize   :DWORD
    local i         :DWORD
    
    invoke strlen, dword ptr [ptr_char]
    
    mov [strSize], eax
    
    invoke BigNum_init_null, dword ptr [ptr_BigNum], [strSize] ;заполнили весь массив нулями
    
    ;invoke BigNum_show, dword ptr [ptr_BigNum]
    
    mov ebx, [ptr_char]
    mov esi, 0
    mov edi, 0
    
         ;проверим знак числа
    .if byte ptr [ebx] == '-'
            mov eax, [ptr_BigNum]
            mov [eax].BigNum.signNum, 1
            inc esi
    .endif
    
    mov eax, [ptr_BigNum]
    mov ebx, [eax].BigNum.buf
    mov [i], ebx
    
    CLC
    ;бежим по тсроке
    .while esi < [strSize]
        
        mov ecx, [i]
        sal dword ptr [ecx], 4              ;каждое hex-овое число занимает не более 4 бит. сдвигаемся
        
        mov ebx, [ptr_char]
        add ebx, esi
        
                ;получаем код символа
        mov bl, byte ptr [ebx]
        sub bl, 30h
        
        add [ecx], bl
        
        invoke BigNum_show, ptr_BigNum
        
        inc esi
        
    .endw
    
    mov eax, [ptr_BigNum]
    mov [eax].BigNum.sizeNum, edi
    
    ret
    
BigNum_init endp



и на всякий случай инициализация нулями
Кликните здесь для просмотра всего текста

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
BigNum_init_null proc c uses esi edi ebx eax ecx, ptr_BigNum:ptr BigNum, sizeN: DWORD
 
    
    mov ecx, [ptr_BigNum]
    
    mov eax, [sizeN]
    
    mov ebx, 8
    
    xor edx, edx
    
    div ebx
    
    .if edx != 0
        add eax, 1
    .endif
    
    mov [ecx].BigNum.sizeNum, eax 
    
    imul eax, 4
    
    invoke malloc, eax
    
    mov ecx, [ptr_BigNum]
    mov [ecx].BigNum.buf, eax
    
    mov [ecx].BigNum.signNum, 0
    
    mov eax, [ecx].BigNum.buf
    
    mov ebx, [ecx].BigNum.sizeNum
    imul ebx, 4
    
    invoke crt_memset, eax, 0, ebx
    
    ret  
BigNum_init_null endp


в итоге при выводе, вижу что все мои сдвиги действуют только на первое двойное слово, в остальном массиве непонятный мусор(в принципе логично, т.к. и никак не перехожу к ним). и никак не могу придумать алгоритм сдвига в следующее 4байта. буду очень благодарен за советы или примеры
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.10.2013, 00:00
Ответы с готовыми решениями:

Assembler длинная арифметика
Пишу прогу для лабы(студент 1 курс). Задача: Пользователь вводит два знаковых числа X и Y....

Длинная арифметика: проверить, делится ли число на 101
Здравствуйте) помогите пожалуйста:(дано очень большое число, состоящее из более 2000 цифр ....

Арифметика
Здравствуйте. Программа считает выражение F = (A + B ) / C - D * E, но из-за значений D и E,...

Арифметика на Ассемблере
Начинаю программировать на ассемблере в институте, 1 неделя. Нужна программа для арифметических...

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.10.2013, 00:00

Длинная арифметика: как реализовать код функций и операторов
Добавлено через 17 минут Задача: сделать типы длинных чисел, например, знаковое 256-ти битное...

арифметика
b - данное размеров в байт; w - данное размером в слово (2 байта); dw - данное размером в двойное...

арифметика. a*b +a^3/3 +b^3/2+b
Люди прошу можете слегка помочь,так сказать указать на ошибки просто уже не пойму где и что делаю...

Арифметика на сопроцессоре
Помогите написать программу с арифметическими командами(+,-,*,/). Если можно с коментарием.Например...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru