Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 06.04.2025
Сообщений: 1

При сложении двухзначных упакованных BCD чисел получается трёхзначное число, не могу его вывести

06.04.2025, 12:37. Показов 1251. Ответов 1

Студворк — интернет-сервис помощи студентам
Здравствуйте

У меня возникли некоторые сложности с трёхзначными числами.
Код работает, если в выражении получается менее 100. И у меня не получилось реализовать ввод с клавиатуры для умножения. Я пыталась решить, но что-то ничего не получается. Буду премного благодарна за помощь)

invoke ReadConsoleA нужно использовать по заданию

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
.386
.model flat,stdcall
option casemap:none
    include includes\kernel32.inc
    include includes\user32.inc
    includelib includes\kernel32.lib
    includelib includes\user32.lib
    
BSIZE equ 19
 
.data
    varA dw ?
    varB dw ?
    varC dw 3
    varD dw 5
 
    
    trash dw ?
    total dw ?
    
    expr_text db 'a+b+cd', 0
    inpA db 'Input a value (01-99): ', 0
    inpB db 'Input b value (01-99): ', 0
    inpC db 'Input c value (01-99): ', 0
    inpD db 'Input d value (01-99): ', 0
 
    result db 'Result ', 0
    
    msg1310 byte 13, 10 ; перевод каретки
    
    ifmt dw "%d", 0; строка формата
    buf db BSIZE dup(?); буфер
    stdout dd ? ; дескриптор вывода
    stdin dd ? ; дескриптор ввода
    cRead dd ? ; символов прочиталось
    cWritten dd ? ; символов не удалось напечатать
    
.code
    start:
        invoke GetStdHandle, -11
        mov stdout, eax
        invoke GetStdHandle, -10
        mov stdin, eax
        
        ; Печатаем 'Expression: a+b+cd+e+f+g+h+km'
        invoke WriteConsoleA, stdout, addr expr_text, sizeof expr_text, ADDR cWritten, 0
        ; Переносим каретку
        invoke WriteConsoleA, stdout, addr msg1310, sizeof msg1310, ADDR cWritten, 0
        
        ; Печатаем 'Input a value (0-99): '
        invoke WriteConsoleA, stdout, addr inpA, 23, ADDR cWritten, 0
        ; Считываем значение a 
        invoke ReadConsoleA, stdin, addr varA, 2, addr cRead, 0
        ; Очищаем буфер от символа переноса строки и каретки
        invoke ReadConsoleA, stdin, addr trash, 2, addr cRead, 0
        
        ; Печатаем 'Input b value (0-99): '
        invoke WriteConsoleA, stdout, addr inpB, 23, ADDR cWritten, 0
        ; Считываем значение b
        invoke ReadConsoleA, stdin, addr varB, 2, addr cRead, 0
        ; Очищаем буфер от символа переноса строки и каретки
        invoke ReadConsoleA, stdin, addr trash, 2, addr cRead, 0
        
        mov ax, varA
        mov bx, varB
        
        ; уменьшаем на 30h, чтобы перевести в ascii в цифры
        sub ah, 30h
        sub al, 30h
        sub bh, 30h
        sub bl, 30h
        
        ; складываем
        add al, bl
        add ah, bh
        
        ; число задом наперед - переворачиваем
        mov bh, ah
        mov ah, al
        mov al, bh
        
        ; переворачиваем обратно
        mov bh, ah
        mov ah, al
        mov al, bh
        
        ; увеличиваем на 30h, чтобы обратно в ascii цифры
        add al, 30h
        add ah, 30h
        
        ; Прибавляем к общему значению
        add total, ax
 
        ;invoke WriteConsoleA, stdout, addr total, 2, ADDR cWritten, 0
        
        
        mov ax, varC ; множимое в формате неупакованного BCD помещается в регистр AL        
        mov bx, varD ; множитель в формате неупакованного BCD помещается в регистр BL
        
        mul bx       ; AX = 0x03 * 0x09 = 0x001Bh
        
        aam          ; AX = 0x0207h
        or AX,3030H  ; AX = 0x3237h, т.е. AH = '2', AL = '7'
        
        mov bh, ah
        mov ah, al
        mov al, bh
        
        mov varD, ax ;складываем результат умножения с общуую переменную
        ;invoke WriteConsoleA, stdout, addr varD, 10, ADDR cWritten, 0
        mov ax, total
        mov bx, varD
        sub ah, 30h
        sub al, 30h
        sub bh, 30h
        sub bl, 30h
        add al, bl
        add ah, bh
        mov bh, ah
        mov ah, al
        mov al, bh
        aaa
        mov bh, ah
        mov ah, al
        mov al, bh
        add al, 30h
        add ah, 30h
        mov total, ax
        
        
        invoke WriteConsoleA, stdout, addr result, 10, ADDR cWritten, 0
        invoke WriteConsoleA, stdout, addr total, 2, ADDR cWritten, 0
        invoke ExitProcess,0
        
        
end start
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.04.2025, 12:37
Ответы с готовыми решениями:

Вычитание упакованных BCD-чисел
здравствуйте, хотелось бы побольше узнать о правильном вычитании таких чисел, сложение то просто...

Сложение упакованных BCD чисел
Мне требуется сложить два упакованных BCD числа: 5643 и 9127 Вот что я сделал: .model small...

Вычитание двух упакованных BCD чисел A и B
Необходимо реализовать вычитание двух упакованных BCD чисел A и B. A = 56 B = 3909 По...

1
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
06.04.2025, 14:39
Смотря какую тему изучаете...

Если тема - многоразрядные вычисления, то нужно выполнять операции, как на листе бумаги при сложении / умножении "в столбик".
Это похоже на алгоритмы "длинной арифметики" https://ru.wikipedia.org/wiki/... 0%BA%D0%B0
В Wikipedia описано заумно, но это всё алгебраическая запись "школьного сложения / умножения в столбик".
Вы могли это изучать на алгоритмах.

Если тема "знакомство с форматом BCD чисел, то просто подбирайте такие a и b, чтобы не выходить за пределы двух разрядов (0...99).

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

Вычисление с повышенной точностью для упакованных чисел ДДК сложение и умножение
Всем привет! Помогите, пожалуйста, сделать семестровую. Тема: Вычисление с повышенной точностью для...

Сложение и вычитание упакованных чисел
Здравствуйте,нужно сделать две программы на Assembler TASM.Задание в первой программе сложить два...

Как перевести вещественное число в упакованное BCD число
прив! как преобразовать элемент вектора XMM в упакованное BCD двоично-десятичное число..?? в...

2. Дано натуральное число. Найти количество цифр данного числа. Результат в АХ. (Число может быть двухзначным, трехзначным и т.д.)
2. Дано натуральное число. Найти количество цифр данного числа. Результат в АХ. (Число может...

Есть ли информация по работе на сопроцессоре с упакованными числами
есть инфа по работе на сопроцессоре с упакованными числами? типа загрузка, их в сопроцессор,...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
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
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru