Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler: математика, вычисления
Войти
Регистрация
Восстановить пароль
 
HULIGAN
0 / 0 / 4
Регистрация: 15.04.2015
Сообщений: 181
#1

Напишите деление BCD - чисел на ассемблер MASM32 - Assembler

01.06.2015, 20:51. Просмотров 581. Ответов 2
Метки нет (Все метки)

Напишите деление BCD - чисел на ассемблер массм32
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.06.2015, 20:51
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Напишите деление BCD - чисел на ассемблер MASM32 (Assembler):

Как сделать деление BCD чисел на асемблере? MASM32 Editor
Как сделать деление BCD чисел на асемблере? MASM32 Editor:cry:

Ассемблер в паскале: как загрузить массив во встроенный ассемблер и произвести над любым из его чисел сложение(вычитание).
хочу написать программу в паскале с использованием встроенного ассемблера, но...

Сложение неупакованных bcd-чисел
Всем Привет!! Возникла проблема со сложением неупакованных bcd-чисел(принцип...

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

Задача на сложение двух bcd чисел
Народ, подскажите как исправить...у меня задача на сложение двух bcd чисел, я...

Сложение неупакованных BCD чисел, неверный результат
При сложении 2 неупакованных BCD числа получается один и тот же результат, 50....

2
Mycola
23 / 13 / 47
Регистрация: 23.03.2013
Сообщений: 157
30.07.2015, 12:47 #2
Из учебника Юрова, может чем то это вам поможет
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
Init    macro   mem1,mem2,len
;макрос для инициализации адресных регистров
    mov di,len-1+offset mem1
    mov si,len-1+offset mem2
    mov cx,len
    endm
AddBCD  macro   mem1,mem2,len
;сложение BCD-чисел
;результат помещается в первый операнд
    Init    mem1,mem2,len
    call    AddBCDp
    endm
SubBCD  MACRO   mem1,mem2,len
;вычитание BCD-чисел
;результат помещается в первый операнд
    Init    mem1,mem2,len
    call    SubBCDp
    endm
MulBCD  macro   mem1,mem2,len
;умножение BCD-чисел
;результат:
;младшая часть помещается в первый операнд,
;старшая часть - во второй операнд
    Init    mem1,mem2,len
    call    MulBCDp
    endm
DivBCD  macro   mem1,mem2,len
;деление BCD-чисел
;результат:
;частное помещается в первый операнд,
;остаток - во второй операнд
    mov di,offset mem1
    mov si,offset mem2
    mov cx,len
    call    DivBCDp
    endm
OutBCD  macro   mem,len
;вывод BCD-чисел на экран в текущую позицию
    mov si,offset mem
    mov cx,len
    call    OutBCDp
    endm
 
data    segment
;для операций умножения и деления необходим буфер
;размер буфера не менее 3*SIZE,
;где SIZE-размер чисел
buffer  db  512 dup(?)
a   db  0,0,4,0,1,4,5,2,2,2
b   db  0,0,0,0,0,3,8,9,7,8
c   db  2,8,0,1,0,0,1,9,8,3
d   db  9,9,3,3,3,3,3,3,3,3
data    ends
 
code    segment
assume  cs:code,ds:data,es:data
AddBCDp proc
;процедура сложения BCD-чисел
    push    ax  ;сохраним изменяемые регистры
    push    di
    push    si
    push    cx
    std     ;начинаем с младших разрядов
    clc     ;обнулим значение переноса
_add_:
    lodsb       ;возьмем очередную цифру
    adc al,[di] ;сложение с учетом переноса
    aaa     ;выровняем в формат BCD-чисел
    stosb       ;сохраним результат
    loop    _add_
    pop cx  ;восстановим регистры
    pop si
    pop di
    pop ax
    ret
    endp
SubBCDp proc
;процедура вычитания BCD-чисел
    push    ax  ;сохраним изменяемые регистры
    push    di
    push    si
    push    cx
    std     ;начинаем с младших разрядов
    clc     ;обнулим значение переноса
_sub_:
    lodsb       ;возьмем очередную цифру
    sbb [di],al ;вычитание с учетом переноса
    mov al,[di]
    aas     ;выровняем в формат BCD-чисел
    stosb       ;сохраним результат
    loop    _sub_
    pop cx  ;восстановим регистры
    pop si
    pop di
    pop ax
    ret
    endp
MulBCDp proc
;процедура умножения BCD-чисел
    push    ax  ;сохраним изменяемые регистры
    push    bx
    push    di
    push    si
    push    cx
    std     ;начинаем с младших разрядов
    mov bx,offset buffer
    mov dh,cl   ;запомним исходное
            ;состояние счетчика
    push    bx
;заполним буфер результата нулями
    shl cx,1    ;необходим размер 2*SIZE
    xor al,al   ;символ-заполнитель = 0
_null_:
    mov [bx],al
    inc bx
    loop    _null_
    mov cl,dh
    pop bx
;умножение будем проводить "столбиком"
;цикл по всем цифрам первого операнда
_mul_o_:
    xor dl,dl   ;обнулим значение переноса
    push    cx
    push    bx  ;сохраним некоторые регистры
    push    si
    mov cl,dh   ;восстановим исходное
            ;значение счетчика
;цикл по всем цифрам второго операнда
_mul_i_:
    lodsb       ;возьмем очередную цифру
    mul byte ptr [di]   ;умножим
    aam     ;коррекция результата
    add al,dl   ;учтем перенос
    aaa
    add al,[bx] ;сложим с результатом
            ;предыдущего умножения
    aaa
    mov dl,ah   ;запомним значение переноса
    xor ah,ah
    mov [bx],al ;сохраним результат
    inc bx
    loop    _mul_i_
    mov [bx],dl
    pop si  ;восстановим регистры
    pop bx
    inc bx
    dec di  ;перейдем к следующей
            ;цифре второго операнда
    pop cx
    loop    _mul_o_
    mov cl,dh   ;восстановим исходное
            ;значение счетчика
    sub bx,cx   ;сместим bx на младшую
            ;часть результата
    add di,cx
;занесем результат (мл. часть) в первый операнд
_move_l_:
    mov al,[bx]
    inc bx
    stosb
    loop    _move_l_
    mov cl,dh
    mov di,si
;занесем результат (ст. часть) во второй операнд
_move_h_:
    mov al,[bx]
    inc bx
    stosb
    loop    _move_h_
    pop cx  ;восстановим регистры
    pop si
    pop di
    pop bx
    pop ax
    ret
    endp
SubInvBCDp  proc
;вспомогательная процедура для операции деления
;производит вызов процедуры вычитания
;без начальной инициализации
    push    si
    push    di
    add si,cx
    dec si
    add di,cx
    dec di
    call    SubBCDp
    pop di
    pop si
    ret
    ENDP
CmpBCDp proc
;процедура сравнения BCD-чисел
;CF=0, если [si]>[di], иначе CF=1
    push    ax
    push    di
    push    si
    push    cx
    cld
_cmp_:
    lodsb
    cmp al,[di]
    jl  _less_
    jg  _greater_
    inc di
    loop    _cmp_
_less_:
    stc
    jc  _cmp_q_
_greater_:
    clc
_cmp_q_:
    pop cx
    pop si
    pop di
    pop ax
    ret
    endp
PrepareForDiv   proc
;процедура инициализации буфера
;для операции деления
    cld
;0,[di] -> buffer (первый операнд в буфер)
    push    di
    push    si
    push    di
    pop si
    mov di,offset buffer
    xor al,al
    push    cx
    stosb
    rep movsb
;0,[si] -> buffer (второй операнд в буфер)
    pop cx
    stosb
    pop si
    push    cx
;для начала найдем первую значащую цифру
_find_:
    lodsb
    dec cx
    cmp al,0
    je  _find_
    dec si
    inc cx
    mov dx,cx
    rep movsb
    pop cx
    push    cx
; 0,0..0 -> buffer (очистить место для результата в буфере)
    xor al,al
    rep stosb
;переназначение регистров
    mov di,offset buffer
    pop cx
    mov si,di
    inc cx
    add si,cx
    pop bx
    ret
    endp
DivBCDp proc
;процедура деления BCD-чисел
    push    ax  ;сохраним изменяемые регистры
    push    bx
    push    di
    push    si
    push    cx
    push    di
    call    PrepareForDiv   ;подготовим буфер
    xor ax,ax   ;в al - очередная цифра результата
            ;в ah - количество цифр в результате
    call    CmpBCDp
    jnc _next_1_
_div_:
    call    CmpBCDp
    jnc _next_
    inc al
    call    SubInvBCDp
    jmp _div_
_next_:
    mov [bx],al ;сохраним очередную цифру
    inc bx  ;уменьшим порядок делимого
_next_1_:
    inc di
    dec cx
    xor al,al
    inc ah
    cmp cx,dx   ;сравним порядки делимого и делителя
    jne _div_
    dec ah
    pop di
    pop cx
    push    cx
;пересылаем результат из буфера в операнды
    mov si,di
    add di,cx
    push    cx
    mov cl,ah
    add si,cx
    dec si
    dec di
    std
rep movsb
    pop cx
    sub cl,ah
    xor al,al
rep stosb
    pop cx
    pop si
    push    si
    push    cx
    mov di,si
    mov si,offset buffer
    inc si
    cld
rep movsb
    pop cx  ;восстановим регистры
    pop si
    pop di
    pop bx
    pop ax
    ret
    endp
OutBCDp proc
;процедура вывода BCD-чисел на экран
    mov ah,06h
    cld
_out_:
    lodsb
    or  al,30h
    mov dl,al
    int 21h
    loop    _out_
    mov dl,0dh
    int 21h
    mov dl,0ah
    int 21h
    ret
    endp
 
main    proc
    mov ax,data
    mov ds,ax
    mov es,ax
    OutBCD  a,10
    OutBCD  b,10
    AddBCD  a,b,10
    OutBCD  a,10
    OutBCD  b,10
    SubBCD  a,b,10
    OutBCD  a,10
    OutBCD  b,10
    MulBCD  a,b,10
    OutBCD  a,10
    OutBCD  b,10
    DivBCD  a,b,10
    OutBCD  a,10
    OutBCD  b,10
    mov ax,4c00h
    int 21h
main    endp
code    ends
    end main
1
proc3nt
волшебник
632 / 494 / 150
Регистрация: 26.05.2012
Сообщений: 1,415
30.07.2015, 14:02 #3
Mycola, думаю если HULIGAN просмотрит хотя бы третью часть от всего того, что ты выложил, то я перекрещусь и пойду поставлю свечку в церкви.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2015, 14:02
Привет! Вот еще темы с решениями:

Ошибки MASM32 - cannot open file : .\masm32\include\windows.inc
установил MASM32, прописал в патче путь, выдаёт ошибки при компиляции такого...

Деление знаковых чисел с выводом ошибки "Деление на ноль"
Собственно поставили передо мной задачу - написать прогу деления двух чисел,...

деление чисел
xor dx,dx mul num1 mul num1 add ax,num1 mov bx,ax mov...

Деление чисел
Вообщем задание заключается в том, что ввести 2 числа с клавиатуры и разделить...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru