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

Вычитание BCD чисел

11.05.2016, 21:34. Просмотров 478. Ответов 0
Метки нет (Все метки)

Введите два десятичных числа разрядностью не более 10 цифр, выполните преобразование в упакованный BCD-формат, вычтете второе из первого и выведите результат.

В общем, практически весь функционал я написал, только программа неверно работает, если первое число меньше второго и получается отрицательный результат.
Любые телодвижения приводят к багам. Был вариант сравнивать два числа и, если первое меньше, то вычитать из второго. Кто может помочь?

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
        model  SMALL
        stack  100h
 
        dataseg
Ask1    db 0Ah,0Dh,'Chislo1:$'
Ask2    db 0Ah,0Dh,'Chislo2:$'
 
Buf1    db 11
Len1    db ?
Opnd1   db 12 dup(0)
Buf2    db 11
Len2    db ?
Opnd2   db 12 dup(0)
 
Len_1   dw 9
Len_2   dw 9
ResT    db 0Ah,0Dh,'Rasnost:'
Res     db 10 dup(0),'$'
 
        codeseg
        startupcode
       ; push    DS
       ; pop     ES        ; ES <- DS
 
BEGIN:
;Ввод Уменьшаемого
B1:     lea     DX, Ask1
        mov     AH, 09h
        int     21h
        lea     DX, Buf1
        mov     AH, 0Ah
        int     21h
 
        cmp     Len1, 0
        je      B1
;проверка 0-9 и очистка старш.тетрады
        lea     BX, Opnd1
        xor     CX, CX
        mov     CL, Len1
        mov     SI, CX
    dec SI
    mov     DL, 0
    
T1:     mov     AL, [BX][SI]
        cmp     AL, '0'
        jb      B1      ; ошибка
        cmp     AL, '9'
        ja      B1      ; ошибка
    dec     SI
    and     AL, 0Fh
    test    DL, 1
    jnz NNN1        ; четный разряд
    inc DL
    mov AH, AL
    cmp CL, 1
    je  NNN_1
    dec CL
    jmp T1
 
 
NNN1:   inc DL
    shl AL, 4   
    add AH, AL
NNN_1:  mov DI, Len_1
    mov     BX[DI], AH  ; Запись упакованноого числа в 1 строку
    dec DI
    mov Len_1, DI
        loop    T1
 
 
 
 
;Ввод вычитаемого
B2:     lea     DX, Ask2
        mov     AH, 09h
        int     21h
        lea     DX, Buf2
        mov     AH, 0Ah
        int     21h
 
        cmp     Len2, 0
        je      B2
;проверка 0-9 и очистка старш.тетрады
        lea     BX, Opnd2
        xor     CX, CX
        mov     CL, Len2
        mov     SI, CX
    dec SI
    mov     DL, 0
 
T2:     mov     AL, [BX][SI]
        cmp     AL, '0'
        jb      B2      ; ошибка
        cmp     AL, '9'
        ja      B2      ; ошибка
    dec     SI
    and     AL, 0Fh
    test    DL, 1
    jnz NNN2        ; четный разряд
    inc DL
    mov AH, AL
    cmp CL, 1
    je  NNN_2
    dec CL
    jmp T2
 
 
NNN2:   inc     DL
    shl AL, 4   
    add AH, AL
NNN_2:  mov DI, Len_2   ; Запись упакованноого числа в 1 строку
    mov     BX[DI], AH
    dec DI
    mov Len_2, DI
        loop    T2
 
 
 
 
 
; Вычитание
 
        lea     DI, Opnd1+9
    lea     SI, Opnd2+9
    lea     BX, Res+9
    mov BP, 9
    mov CX, 9
    sub CX, Len_1
    jmp N
 
ZZZ:    mov AH, AL      ; если был заем
    shr AH, 4
    and AH, 0Fh
    and AL, 0Fh
    or  AH, 30h
    or  AL, 30h
    mov     [offset Res + BP], AL
    dec     BP
    mov     [offset Res + BP], AH
    dec BP
    dec DI
    dec SI
    dec CX
    cmp CX, 0
    je  EEE
    mov     AL, [DI]
    dec AL
    das
    jc  ZZZ
    jmp N1  
 
 
N:  mov     AL, [DI]    ; если не было заема
N1: mov BL, [SI]
    sbb AL,  BL
    das 
    jc  ZZZ
    mov AH, AL
    shr AH, 4
    and AH, 0Fh
    and AL, 0Fh
    or  AH, 30h
    or  AL, 30h
    mov     [offset Res + BP], AL ;
    dec     BP
    mov     [offset Res + BP], AH
    dec BP
    dec DI
    dec SI
    loop    N
 
 
 
;Вывод результата
EEE:
        lea     DX, ResT
        mov     AH, 09h
        int     21h
 
    mov ah,0;ожидание 
    int 16h
 
;Конец работы
QUIT:   exitcode  0
        end
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.05.2016, 21:34
Ответы с готовыми решениями:

Вычитание чисел в формате BCD
Введите два десятичных числа разрядностью не более 10 цифр, выполните преобразование в...

Сложение двух BCD чисел
При проверке программы (через Тасм в проге фар, выдаёт ошибку в выводе результат на экран), а...

Сложение двух BCD чисел
Помогите с задачей, нужно чтобы вводилось двухзначное число, я сделал что вводится однозначное...

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

Ввод/вывод, сложение BCD чисел
задать с клавиатуры два BCD числа, числа двухразрядные. выполнить сложение BCD чисел.....

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.05.2016, 21:34

Просуммировать два массива двоично-десятичных (BCD) четырехзначных чисел
Здравствуйте! У меня несколько команды не хватает. Или что то я пишу не правильно. 1-...

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

BCD (сложение и вычитание)
Здравствуйте! Пытаюсь выполнить задание из книжки по BCD-числам и не совсем получается. Итак,...


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

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

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