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

Умножение двух больших (~6 разрядов) десятичных чисел. TASM

20.02.2017, 01:09. Показов 2160. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день!
Мучаюсь уже вторую неделю, первый раз пишу на ассемблере, полный ноль, просмотрела все похожие темы, безрезультатно
Нужно написать программу, которая будет запрашивать два больших десятичных числа, перемножать их и выводить результат на экран. Итог моих мучений - программа умножает любое число лишь на одноразрядное число и правильно считает и выдает результат. Никак не получается реализовать умножение двух больших чисел
Комментарии писала для себя т.к. вообще не шарю

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
.model small ; Модель памяти
.stack 256 ; Установка размера стека
 
 .data ; Начало сегмента данных программы
mes0   db  13,10,'Chislo(1):  $'
mes1   db  13,10,'Chislo(2):  $'
mes2   db  13,10,'   Rezult:  $'
buff   db  12 dup('0')       
dig2   db  0      
 
 .code ; Начало сегмента кода
start:
      mov ax,@data   ; Пересылаем адрес сегмента данных в регистр AX
      mov ds,ax      ; Установка регистра DS на сегмент данных
      mov es,ax   ; Установка регистра ES на сегмент данных
      lea   dx,mes0   ; После этого в регистре dx окажется адрес, по которому хранится строка mes0
      call  message      ;Код который вызывается командой call называется процедурой. Процедура написания строки  
      xor   bx,bx   ;в этом регистре будет накапливаться число    устанавливает бит результата в 1, если бит источника отличается от бита приемника.    
      mov   cx,10   ; cx=10        
@@1:  xor   ax,ax   ;вводим без эхо   
      int   16h               ;ожидание клавиши
      cmp   al,13    ;если ENTER -@@2
      je    @@2               
      cmp   al,'0'          ;все что не цифры игнорируем
      jb    @@1             ;все что не цифры игнорируем
      cmp   al,'9'            ;все что не цифры игнорируем
      ja    @@1               ;все что не цифры игнорируем
      int   29h               ;выводим цифру
      push  ax      ;ПОМЕЩАЕТ В СТЕК значение регистра AX         
      inc   bx   ;bx=+1            
      loop  @@1        ;цикл     
 
@@2:  mov   cx,bx      ; cx=накопленное число 
      lea   di,buff+11        
      std      ; Флаг DF=1              
save: pop   ax ; берем из стека ax       
      stosb ;Команда STOS пересылает содержимое регистра AX в  слово в памяти, адресуемое индексным регистром (E)DI в сегменте ES. В качестве индексного регистра при адресации операнда-назначения используется либо регистр DI            
      loop  save ;цикл             
;-------------------------------------------------------------
 
      lea   dx,mes1     ; После этого в регистре dx окажется адрес, по которому хранится строка mes1         
      call  message      ;Код который вызывается командой call называется процедурой. Процедура написания строки       
  xor   bx,bx   ;в этом регистре будет накапливаться число    устанавливает бит результата в 1, если бит источника отличается от бита приемника.    
      mov   cx,10   ; cx=10  
      @@3:  xor   ax,ax   ;вводим без эхо   
      int   16h               ;ожидание клавиши
      cmp   al,13    ;если ENTER -@@2        
      je    @@5       
      cmp   al,'0'    ;все что не цифры игнорируем        
      jb    @@3          ;все что не цифры игнорируем    
      cmp   al,'9'          ;все что не цифры игнорируем 
      ja    @@3               ;все что не цифры игнорируем
      int   29h             ;выводим цифру   
      push  ax      ;ПОМЕЩАЕТ В СТЕК значение регистра AX        
     ; and   al,0fh    ;преобразовываем в число       
      ;mov   [dig2],al    ; dig2=второму числу     
      inc   bx   ;bx=+1            
      loop  @@3        ;цикл 
       
@@5:  mov   cx,bx      ; cx=накопленное число 
      lea   di,buff+11        
      std      ; Флаг DF=1 
      savee: pop   ax ; берем из стека ax   
    
      
      
      
    !!!! ; stosb ;Команда STOS пересылает содержимое регистра AX в  слово в памяти, адресуемое индексным регистром (E)DI в сегменте ES. В качестве индексного регистра при адресации операнда-назначения используется либо регистр DI            
     loop  savee ;цикл  
       
and   al,0fh    ;преобразовываем в число       
      mov   [dig2],al    ; dig2=второму числу    
 ;-------------------------------------------------------------
 
      lea   dx,mes2           ; После этого в регистре dx окажется адрес, по которому хранится строка mes2      
      call  message           ;Код который вызывается командой call называется процедурой. Процедура написания строки  
      std        ; Флаг DF=1                
      mov   cx,12     ;cx=12       
      lea   si,buff+11       
      xor   bx,bx    ;в этом регистре будет накапливаться число          
      add  bl,[dig2]    ; bl = второе число   
      
mix:  lodsb  ;  команда lodsb загружает байт адресованный регистром SI из сегмента данных, и уменьшает SI на 1, если была использована команда STD (установить флаг направления).                
 
      and   ax,0fh    ;преобразовываем в число        
      xor   dx,dx         ;умножаем ax и bl   
      mul   bl            ;   
      aam   ;Команда AAM делит содержимое регистра AL на 10 (шест.0A) и записывает частное в регистр AH,  а остаток в AL. 
      add   al,bh     ; al=al+bh        
      cmp   al,9   ;если код символа больше, чем "9",         
      jbe   @@4           ; то  @@4    
      sub   al,0Ah   ;вычесть без переноса.   Функция DOS 0Ah — Считать строку символов из STDIN в буфер      
      inc   ah  ;ah=+1                  
@@4:  push  ax     ;ПОМЕЩАЕТ В СТЕК значение регистра AX                
      mov   bh,ah       
       
      loop  mix  ; цикл             
;-------------------------------------------------------------
 
      mov   cx,12     ;cx=12        
prn:  pop   ax ; берем из стека ax                 
      or    al,30h    ; Команда выполняет поразрядно логическую операцию ИЛИ (дизъюнкцию) над битами операндов операнд_1 и операнд_2. Результат записывается на место операнд_1.  код чисел начинается с 30h, то есть 30h - 0, значит 35h - 5, то есть надо добавить 30h      
      int   29h         ;выводим цифру          
      loop  prn      
      
;-------------------------------------------------------------
mov ax,4C00h; DOS функция выхода из программы
    int 21h; Выход из программы                      
;-------------------------------------------------------------
 
message:                      
      mov   ah,9   ;      Процедура написания строки      
      int   21h               
    ret
   
 mov ax, 4ch
  int 21h 
end start
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.02.2017, 01:09
Ответы с готовыми решениями:

Деление/умножение больших чисел (TASM)
Имеется выражение F = (12563 - 78) / Х + (Y * 2852), которое нужно подсчитать. Выполняю по...

Умножение двух десятичных чисел
Добрый день! Получил задание изменить код так, чтобы вместо суммы двух десятичных чисел было...

Умножение двух целых десятичных чисел с использованием команд сопроцессора
Составить прграмму умножения двух целых десятичных чисел, вводимых с клавиатуры. Умножение чисел...

Умножение двух больших чисел.
Ребята помогите,надо написать в течение 2-х часов код. Умножение двух больших чисел ручками,т.е....

6
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
20.02.2017, 01:30 2
Вам бы структурировать программу - выделив процедуры.

У вас цель лабораторки - длинная арифметика, или просто результат стал ~6-разрядным?
0
0 / 0 / 0
Регистрация: 20.02.2017
Сообщений: 5
20.02.2017, 01:36  [ТС] 3
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
цель лабораторки - длинная арифметика
Вернее это задание на 1ю лабу по ассемблеру. Задача: перемножение двух больших чисел. У препода уточнила, что "больших" это примерно 6-разрядных.
0
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
20.02.2017, 01:41 4
А формат хранения - 6 байт по одному разряду на байт?
0
0 / 0 / 0
Регистрация: 20.02.2017
Сообщений: 5
20.02.2017, 01:49  [ТС] 5
Не совсем понимаю вопрос. К 6 ничего не привязано. Это просто пример.
В коде
1 число - max 10 разрядов
2 число - max 10 разрядов
результат - max 12 разрядов
0
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
20.02.2017, 21:38 6
-------------------
Попробуйте сначала без ввода данных - вычислить из переменных. Потом сделайте вывод, а потом и ввод.

Результат умножения - 12 разрядное число. Умножаете как обычно - в столбик. Результирующее число можно использовать для хранения промежуточных сумм.

Добавлено через 1 минуту
результат - max 12 20 разрядов

Добавлено через 53 секунды
Уже поздно - завтра вечером посмотрю.

Добавлено через 19 часов 44 минуты
Как-то с наскока не получилось. Скоро будет суббота, возможно, это будет выходной - попробую ещё раз. Надеюсь, что смогу помочь.
0
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
25.02.2017, 01:17 7
Если у числа 6 десятичных разрядов, то оно заведомо влезет в 6 шестнадцатеричных разрядов. Перемножение двух чисел в 6 шестнадцатеричных разрядов каждое даст произведение, которое влезет в 12 шестнадцатеричных разрядов, то есть в 6 байт, то есть в 3 слова.
Отведем и под оба множителя и под результат три слова в порядке от младшего слова к старшему.
Перемножаем:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
; Считаем Var_A := Var_A * Var_B :
mov ax, Var_A       ; A_lo
mov bx, Var_A+2 ; A_me
mov cx, Var_B       ; B_lo
mov si, Var_B+2 ; B_me
push    ax
mul cx          ; A_lo * B_lo
mov Var_A, ax
mov di, dx
pop ax
mul si          ; A_lo * B_me
xor bp, bp
add di, ax
adc bp, dx
mov ax, bx
mul cx          ; A_me * B_lo
add ax, di
adc bp, dx
mov Var_A+2, ax
mov ax, bx
mul si          ; A_me * B_me
add ax, bp
mov Var_A+4, ax
Assembler
1
2
3
; Сосчитается 561234h * BC789Ah:
Var_A       dw  1234h, 56h , 0  ;Порядок слов :
Var_B       dw  789Ah, 0BCh, 0  ;младшее, среднее, старшее
Код
Результат:
0B87:0130              48 53 7F EA-5D 3F 9A 78 BC 00 00 00       HS..]?.x....
То есть 3F5DEA7F5348h
Примерно вот так. То есть вводим оба числа в 10-чном виде и сохраняем в памяти в двойчном, т.е шестнадцатеричном. Перемножаем, а потом выводим в 10-чном.
2
25.02.2017, 01:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.02.2017, 01:17
Помогаю со студенческими работами здесь

Умножение двух больших чисел
дано два 40 значных числа,нужно перемножить их http://e-maxx.ru/algo/big_integer от сюда и других...

Составить процедуру, которая для заданных чисел m,n определяет сумму десятичных разрядов этих чисел
Составить процедуру, которая для заданных чисел m,n определяет сумму десятичных разрядов этих...

Умножение двоично-десятичных чисел
Помогите кто может. Объясните на примере как происходит умножение

TASM: умножение чисел
Всем привет! Пишу программу на TASM с использованием простых арифметических операций, пока...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru