Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/34: Рейтинг темы: голосов - 34, средняя оценка - 4.91
2 / 2 / 2
Регистрация: 10.04.2018
Сообщений: 36
NASM

Сложение длинных чисел

03.06.2019, 21:04. Показов 6775. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно сложить два больших числа. Большое число это 512 разрядов. Сложение происходит с помощью 64-х разрядные арифметические инструкции ADD и ADC. Т.е. как я понимаю это число надо разбить на восемь 64-х разрядных чисел. Лично я представляю себе сложение вот так:
Assembler
1
2
3
4
5
6
7
8
clc
%assign i 0
%rep 8
mov rax, [A+8*i]
adc rax, [B+8*i]
mov [C+8*i], rax
%assign i i+1
%endrep
Где A, B - массивы, в которых записаны сами числа. C - массив в который пишется результат.
Вопрос в следующем - Как реализовать собственно сами эти массивы и инициализацию чисел в них?
Крайне желательно было бы увидеть код. Заранее спасибо.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.06.2019, 21:04
Ответы с готовыми решениями:

Сложение "длинных" чисел (Ассемблерная вставка в g++ на линуксе)
Вообщем проблема с ассемблерное вставкой. Компилируется нормально(g++), но при выполнении программы (во время выполнения ассемблерной...

Произведение длинных чисел
vital792, не поможете? задачка того же направления. Есть немного косячное решение для почти аналогичной задачи, но...

Умножение длинных чисел (512)
Добрый вечер, необходимо реализовать умножение двух 512 битовых чисел. Функция вывода есть, проблема с основной программой. Выдает ошибки...

11
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
03.06.2019, 21:14
Об объявлении массивов в конкретном компиляторе нужно смотреть в описании компилятора.
Что-то вроде
Assembler
1
2
A resq 512/8
B resq 512/8
Инициализация нулями rep stosq
Если не нулями - нужно "огород городить" и придумывать формат длинных чисел - это или бинарный или каждое слово ограничено 1000 (т.е. подобие BCD).
Просто объявить массив
Assembler
1
A qword 1,2,3,4,5,6,7,8
1
2 / 2 / 2
Регистрация: 10.04.2018
Сообщений: 36
03.06.2019, 21:19  [ТС]
Спасибо, Павел.
А как вы сами считаете, может есть какой то другой вариант инициализации, без массива? Вариант в котором не надо, как вы выразились "городить огород". Массив просто сразу пришел мне в голову, вот я его и упомянул.
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
03.06.2019, 21:25
Это к преподавателю - он принимает.

Вы сделайте хоть на C/C++ реализацию длинных чисел. Например для решения "знаменитой" задачки №11 "Зайчик" на acmp.
Тогда и поймёте, зачем нужен формат "длинных чисел".

А так - объявите массив
Assembler
1
A qword 1,2,3,4,5,6,7,8
1
2 / 2 / 2
Регистрация: 10.04.2018
Сообщений: 36
04.06.2019, 21:42  [ТС]
Написал вот такой код. Решил сначала проверить сам факт сложения, без вывода. Не работает.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        SECTION .text
        GLOBAL _start
_start:
clc
%assign i 0
%rep 8
mov rax, [A+8*i]
adc rax, [B+8*i]
mov [C+8*i], rax
%assign i i+1
%endrep
;==============
       SECTION .data
A db 0x0000FFFF, 0x00000FFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 ,0x00000001
B db 0x00000001, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000001
C db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
Что не так в нём?
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
05.06.2019, 05:46
Лучший ответ Сообщение было отмечено чудач как решение

Решение

Отсутствует код завершения программы и передачи управления операционной системе
Assembler
1
2
xor rax, rax
ret
Данные определяются директивой не требуемого размера - нужно dq

Собрал в SASM с макросами вывода (они там неудачные - без вывода лидирующих нулей)
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
%include "io64.inc"
 
section .text
global CMAIN
CMAIN:
    ;write your code here
    
    clc
    %assign i 0
    %rep 8
        mov rax, [A+8*i]
        adc rax, [B+8*i]
        mov [C+8*i], rax
        %assign i i+1
    %endrep
    
    %assign i 0
    %rep 8
        PRINT_HEX 8, [A+8*i]
        PRINT_CHAR ' '
        %assign i i+1
    %endrep
    NEWLINE
    %assign i 0
    %rep 8
        PRINT_HEX 8, [B+8*i]
        PRINT_CHAR ' '
        %assign i i+1
    %endrep
    NEWLINE
    %assign i 0
    %rep 8
        PRINT_HEX 8, [C+8*i]
        PRINT_CHAR ' '
        %assign i i+1
    %endrep
    NEWLINE
    
    xor rax, rax
    ret
 
section .data
A dq 0x0000FFFF, 0x00000FFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 ,0x00000001
B dq 0x00000001, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000001
C dq 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
Добавлено через 1 минуту
Хотя, ваше решение непривычное - я бы делал при помощи циклов, а не макросов.
1
2 / 2 / 2
Регистрация: 10.04.2018
Сообщений: 36
05.06.2019, 13:52  [ТС]
Спасибо за замечания
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Отсутствует код завершения программы и передачи управления операционной системе
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Данные определяются директивой не требуемого размера - нужно dq
Если не сложно, можете чуть чуть пояснить за эту строчку или ссылку на ресурс. Интернет не выдает ничего путёвого.
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
%include "io64.inc"
Узнал только (с другой темы) что это библиотека с функциями или подключаемыми файлами
upd. Скорее всего там определены два макроса PRING_HEX и PRINT_CHAR. Верно?
0
2 / 2 / 2
Регистрация: 10.04.2018
Сообщений: 36
05.06.2019, 15:34  [ТС]
Составил вот такую программку, тут нет NEWLINE (убрал для упрощения поиска ошибок).
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
%include "marco.mac"
;==========================================
    SECTION .text
    global _start
_start:
    clc
    %assign i 0
    %rep 8
        mov rax, [A+8*i]
        adc rax, [B+8*i]
        mov [C+8*i], rax
        %assign i i+1
    %endrep
        PRINT_HEX A, 8
        PRINT_HEX B, 8
        PRINT_HEX C, 8
    xor rax, rax
    ret
;==================================================
    SECTION .data
A dq 0x0000FFFF, 0x00000FFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 ,0x00000001
B dq 0x00000001, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000001
C dq 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
hexdigits:  db '0123456789abcdef'
    SECTION .bss
hexstr:
    RESB    4096/4+1
.len:   EQU $ - hexstr
marco.mac
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
%macro  PRINT_HEX 2
    mov ebx, 0
    std
    mov
    eax, 10
    lea rdi, [hexstr + hexstr.len - 1]
    stosb
.oncemore:
    mov al, [%1+rbx]
    and eax, 0x0F
    mov al, [hexdigits+rax]
    stosb
    mov al, [%1+rbx]
    and eax, 0xF0
    shr eax, 4
    mov al, [hexdigits+rax]
    stosb
    inc rbx
    cmp rbx, %2
    jne .oncemore
    mov rax, 1
    inc rdi
    mov %1, rdi 
    lea rdx, [hexstr + hexstr.len]
    sub rdx, %1
    mov rdi, 1
    syscall
    ret
%endmacro
%macro  NEWLINE 0
org 0x100
    mov as, 0x0A00D
    mov bh, 0
    mov cx, 0x1
    int 0x10
    mov ah, 0x2
    mov dx, 0x1
    int 0x10
    mov ax, 0x0A0A
    int 0x10
    mov ax, 0x4c00
    int 0x21
%endmacro
Скриншот ошибок приложу ниже.
Бью голову и не могу понять в чем я не прав. Почти на 100% уверен что ошибка в макрсое вывода, не могу понять где.
Миниатюры
Сложение длинных чисел  
0
2 / 2 / 2
Регистрация: 10.04.2018
Сообщений: 36
05.06.2019, 15:49  [ТС]
В marco.mac исправил ошибку в 4 строке. Теперь просто выдает ошибку о том что .oncemore переопределён.
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
05.06.2019, 22:42
Вы для DOS делаете?
Тогда там нет инструкций с 64-разрядными операторами - процессор не поддерживает их в этом режиме. Переделывайте под 16-разрядные регистры.
1
2 / 2 / 2
Регистрация: 10.04.2018
Сообщений: 36
07.06.2019, 20:13  [ТС]
С этим заданием разобрался, спасибо за помощь. Теперь вот весит второй день вопрос об умножении, результат у меня не сходится. Но это уже совсем другая история)
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
08.06.2019, 16:17
Вот и хорошо, что разобрались.

А так, одна тема - один вопрос.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.06.2019, 16:17
Помогаю со студенческими работами здесь

Сложение длинных чисел
Составить программу, суммирующую два натуральных многозначных числа с количеством знаков более 20.

Сложение длинных чисел
Мне нужно сложить в паскале длинные числа (до 255 символов в строке). Исходные данные: в двух строках по одному длинному целому...

Сложение длинных чисел
Здравствуйте, помогите пожалуйста. Даны два числа любого знака длиной до 254 символов,которые могут быть дробными.Найти их сумму с...

Сложение длинных чисел
Помогите срочно! Нужно составить программу, суммирующую два натуральных n-значных числа ,где n>20. Думал такprogram lab15; uses crt; ...

Сложение длинных чисел
Задачка: Сложить два 50-значных десятичных числа. Она довольно-таки простая и я её сделал, она работает, но хотелось бы ее как-нибудь...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru