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

подскажите как увеличить рабочие биты

09.05.2016, 00:20. Просмотров 334. Ответов 9
Метки нет (Все метки)

Доброго времени суток, форумчане. у меня есть задание:
Матрица размером 6х8 состоит из целых чисел, каждое из которых принадлежит диапазону от -32768 до +32767. Требуется переставить столбцы матрицы в порядке убывания сумм их элементов. Если все числа в матрице равны, следует вывести на экран соответствующее сообщение.
Обмен информацией с пользователем организовать в виде специальных сообщений, каждое из которых следует размещать в отдельной строке экрана.

Прогу я написал(корявенько но все же), все работает, но только при определенных условиях. числа у меня записываются в 16-битные регистры (т.к. диапазон от -32768 до +32767). Если будет ситуация что промежуточная сумма чисел столбцов будет выходить из диапазона или конечная сумма, тогда данные будут не верные. К примеру столбец со значениями:32767,32767,32767,32767,327670,32767,32767,32767; сумма будет 262136. так же может быть -262136. то есть необходимо 19 бит, где их найти ума не приложу.
я подобрал числа чтобы промежуточная и конечная сумма была от -32768 до +32767, поэтому и работает)
но все же это надо будет сдавать, подскажите как это можно исправить. программа пишется в эмуляторе emu8086, 16 разрядные регистры(. буду очень благодарен за помощь. код ниже.
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
data segment  
s1 db 'vse chisla ravni',0dh,0ah,'$' 
s2 db 'ishodnii massiv:',0dh,0ah,'$'   
s3 db ,0dh,0ah,'$'  
s4 db 'sortirovanii massiv:',0dh,0ah,'$'  
s5 db 'vivod summ stolbcov(ne sortir):',0dh,0ah,'$'
s6 db 'vivod summ stolbcov sortirov:',0dh,0ah,'$' 
mas1 dw 17294,7222,311,-600,1,4829,4821,-564,-12,-7453,-6944,-11341,-23649,321,28749,281,11689,7893,781,17,-5490,-1342,3274,12,7654,-7893,2345,-7892,-564,14563,3210,30000,-12000,6780,-13248,-2340,-11698,-14280,11345,-2111,-2569,-12,23420,-27610,6782,3456,-22300,-2001
mas2 dw 6  dup(0) 
buffer equ $
ends           
 
stack segment
    dw   128  dup(0)
ends                       
code segment           
    start: 
    mov ax, data
    mov ds, ax
    mov es, ax  
   
    mov ah,09h  ;vivod stroki s2
    lea dx, s2
    int 21h    
    call vivod    ;vivod ishodnii mas1
    xor ax,ax
    xor bx,bx
    xor cx,cx
    xor dx,dx   
    xor di,di 
    mov cx,48                  ;proverka, vse chisla ravni?
a0: mov ax,mas1[di]
    mov bx,mas1[di+2]  
    cmp ax,mas1[di+2]   
    jne a1   ;perehod esli ne ravni
    inc di
    inc di
    loop a0
    mov ah,09h  ;vivod stroki s1
    lea dx, s1
    int 21h     
a1:
    xor bx,bx
    xor di,di
    xor ax,ax
    xor si,si
    mov cx,6
a2:
    push cx
    push di
    call summ ; procedura podscheta summu stolbcov, u zapis rezult v mas2
    pop di
    inc di
    inc di
    pop cx
    loop a2 
     
    mov ah,09h  ;vivod stroki s5
    lea dx, s5
    int 21h 
    call vivod_s     
     
    xor si,si
    mov cx,6
    push cx 
a6:                  ;sortirovka puzerkom
    dec cx
    cmp cx,0 
    push cx
    je z1
a3:   
    mov ax,mas2[si]   ;sravnivaem summu stolbcov
    mov bx,mas2[si+2]
    cmp ax,mas2[si+2]
    jl a4 ; esli menshe
    inc si
    inc si
    loop a3
    pop cx
    xor si,si
    jmp a6
  
a4: 
    push cx              ; men9em mestami chisla v mas1 
    mov cx,8
    mov di,si
a5: 
    mov ax,mas1[di]
    mov bx, mas1[di+2]
    mov mas1[di],bx
    mov mas1[di+2],ax
    add di,12
    loop a5
    mov ax,mas2[si]     ; ; men9em mestami chisla v mas2 
    mov bx,mas2[si+2]
    mov mas2[si],bx
    mov mas2[si+2],ax
    inc si
    inc si
    pop cx
    dec cx
    cmp cx,0
    je a7  
    jmp a3
a7:
    pop cx
    xor si,si
    jmp a6         
z1:      
 
    mov ah,09h  ;vivod stroki s6
    lea dx, s6
    int 21h     
    call vivod_s
    mov ah,09h  ;vivod stroki s4
    lea dx, s4
    int 21h 
    call vivod       ;vivod sortirovonnogo mas1
    int 20h 
 
summ proc
    mov cx,8
    xor bx,bx
p1:
    mov ax,mas1[di]
    add bx,ax
    add di,12
    loop p1
    mov mas2[si],bx
    inc si
    inc si 
    ret
summ endp 
 
proc vivod
  xor si,si
  mov cx,8
  vivod1:
  push cx
  mov cx,6
  vivod2: 
  mov ax,mas1[si]
  call print_word_sdec    
  mov         dl,' '    
  mov         ah,2h          
  int         21h 
  inc si
  inc si
  loop vivod2  
  mov ah,09h  ;vivod stroki s3
  lea dx, s3
  int 21h 
  pop cx
  loop vivod1
  ret    
  
  
vivod endp  
 
proc vivod_s
    xor si,si
    mov cx,6
sum:
    mov ax,mas2[si]
    call print_word_sdec 
    mov         dl,' '    
    mov         ah,2h          
    int         21h 
    inc si
    inc si
    loop sum  
     mov ah,09h  ;vivod stroki s3
  lea dx, s3
  int 21h 
    ret
    vivod_s endp
  
 
 
print_word_sdec:
    push di
    mov di,buffer       ;DI = ????? ??????
    push di         ;?????????? DI ? ?????
    call word_to_sdec_str   ;?????????????? ????? ? AX ? ??????
    mov byte[di],'$'        ;?????????? ??????? ????? ??????
    pop di          ;DI = ????? ?????? ??????
    call print_str      ;????? ?????? ?? ???????
    pop di
    ret              
    word_to_sdec_str:
    push ax
    test ax,ax          ;???????? ????? AX
    jns wtsds_no_sign       ;???? >= 0, ??????????? ??? ???????????
    mov byte[di],'-'        ;?????????? ????? ? ?????? ??????
    inc di          ;????????? DI
    neg ax          ;????????? ????? ???????? AX
wtsds_no_sign:
    call word_to_udec_str   ;?????????????? ???????????? ????????
    pop ax
    ret
    print_str:
    push ax
    mov ah,9            ;??????? DOS 09h - ????? ??????
    xchg dx,di          ;????? ?????????? DX ? DI
    int 21h         ;????????? ? ??????? DOS
    xchg dx,di          ;????? ?????????? DX ? DI
    pop ax
    ret
    word_to_udec_str:
    push ax
    push cx
    push dx
    push bx
    xor cx,cx           ;????????? CX
    mov bx,10           ;? BX ???????? (10 ??? ?????????? ???????)
 
wtuds_lp1:          ;???? ????????? ???????? ?? ???????
    xor dx,dx           ;????????? ??????? ????? ???????? ?????
    div bx          ;??????? AX=(DX:AX)/BX, ??????? ? DX
    add dl,'0'          ;?????????????? ??????? ? ??? ???????
    push dx         ;?????????? ? ?????
    inc cx          ;?????????? ???????? ????????
    test ax,ax          ;???????? AX
    jnz wtuds_lp1       ;??????? ? ?????? ?????, ???? ??????? ?? 0.
 
wtuds_lp2:          ;???? ?????????? ???????? ?? ?????
    pop dx          ;?????????????? ??????? ?? ?????
    mov [di],dl         ;?????????? ??????? ? ??????
    inc di          ;????????? ?????? ??????
    loop wtuds_lp2      ;??????? ?????
 
    pop bx
    pop dx
    pop cx
    pop ax
    ret
 
       
ends
 
end start
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.05.2016, 00:20
Ответы с готовыми решениями:

Подскажите сайты, где можно достать бесплатные анонимные рабочие прокси
Здравствуйте! не подскажите, пожалуйста, сайты, где можно достать бесплатные анонимные РАБОЧИЕ...

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

Подскажите вариант. Как увеличить раздел home за счёт свободного (нераспределённого) места на hdd диске?
Почему-то решил при установке, что для home 4Gb хватит. Но как всегда потянуло на приключения и...

В каждом байте числа обнулить 0-ой и 7-ой биты и сделать единичными 3-ий и 4-ый биты
Надо: Прочитать беззнаковое целое число из стандартного потока ввода и в каждом байте числа...

Ввести целое число A. Инвертировать все биты с 4 по 8, включая эти биты. Вывести результат
нужна помощь в битовых операциях.Ввести целое число A. Инвертировать все биты с 4 по 8, включая...

9
ФедосеевПавел
Модератор
4246 / 2336 / 939
Регистрация: 01.02.2015
Сообщений: 7,715
09.05.2016, 08:08 2
При возможности переполнения разрядной сетки регистра, расширьте сложение до сложения в регистровую пару.
Например, накапливаем сумму в dx:bx, а числа берём из ax.
Assembler
       add bx, ax
       adc dx, 0
Командой adc dx, 0 добавляем к dx значение переноса (CY).
Потом в массиве сумм сохранять не слово, а двойное слово (dword). Усложнится процедура сравнения, но тут уж ничего не поделаешь.

PS Я не могу сейчас проверить допустимость инструкции adc с непосредственным операндом 0 - если она не разрешена, то обнулить какой-нибудь свободный регистр и складывать с ним.
0
teetotal
0 / 0 / 1
Регистрация: 22.10.2012
Сообщений: 12
09.05.2016, 10:20  [ТС] 3
дело в том что числа знаковые, соответственно когда будут складываться числа отрицательные к примеру (-1)+(-2) т.е. ffffh+fffe, флаг переполнения сработает, и результат опять же будет не верным. или я ошибаюсь?
0
R71MT
5343 / 1500 / 317
Регистрация: 29.07.2014
Сообщений: 2,524
Записей в блоге: 5
09.05.2016, 10:50 4
teetotal, всё правильно. Нужно контролировать знак или прибавлять вычитанием.
0
teetotal
0 / 0 / 1
Регистрация: 22.10.2012
Сообщений: 12
09.05.2016, 12:39  [ТС] 5
если не сложно, расскажите как это реализовать в двух словах, или пример кода сложение двух чисел.
0
R71MT
5343 / 1500 / 317
Регистрация: 29.07.2014
Сообщений: 2,524
Записей в блоге: 5
09.05.2016, 13:18 6
Посмотри пример здесь.
0
teetotal
0 / 0 / 1
Регистрация: 22.10.2012
Сообщений: 12
09.05.2016, 18:07  [ТС] 7
Цитата Сообщение от R71MT Посмотреть сообщение
Посмотри пример здесь.
Цитата Сообщение от R71MT Посмотреть сообщение
прибавлять вычитанием
В вашем примере вы пишите "В знаковой арифметике есть такая фишка, как сложение-вычитанием.
Смысл её в том, что при суммировании проверяешь очередной элемент на знак, и если число отрицательное то не прибавляешь его к результату, а с инвертировав - отнимаешь его от результата. Если сумма всех элементов лежит в пределах знакового слова (-32767..+32767), то проблем не возникает." о чем я и говорил.
Цитата Сообщение от R71MT Посмотреть сообщение
контролировать знак
В Emu8086 NEG не работает.
И все же не понял как при adc, сдделать фильтр.
Помогите пож, уже долгое время ломаю голову над этой задачей.
0
R71MT
5343 / 1500 / 317
Регистрация: 29.07.2014
Сообщений: 2,524
Записей в блоге: 5
09.05.2016, 18:36 8
Цитата Сообщение от teetotal Посмотреть сообщение
В Emu8086 NEG не работает.
..попробуй тогда NOT с последующим инкрементом, это аналогично:
Assembler
1
2
not ax
inc ax
0
teetotal
0 / 0 / 1
Регистрация: 22.10.2012
Сообщений: 12
09.05.2016, 20:34  [ТС] 9
Цитата Сообщение от R71MT Посмотреть сообщение
..попробуй тогда NOT с последующим инкрементом, это аналогично:
ASMВыделить код
1
2
not ax
inc ax
что-то я не могу понять как это реализовать. какой бит делать знаковым?
можно блок схему или хотя бы ссылку на тему, в которой это описывается.
0
R71MT
5343 / 1500 / 317
Регистрация: 29.07.2014
Сообщений: 2,524
Записей в блоге: 5
09.05.2016, 21:57 10
..если твой эмуль не понимает инверсию, то оставь эту затею.
Лучше подумай, как можно организовать через ADC. Почитай про CWD, про флаг OF и т.п.
Я-как-то не сталкивался с такой проблемой.. Предполагаю, что нужно организовать флаг и после сложения всех элементов скорректировать им регистр DX.
0
09.05.2016, 21:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.05.2016, 21:57

Подскажите, как увеличить надежность сервера программным и аппаратным методом? Что для этого может быть нужно?
Как увеличить надежность сервера программным и аппаратным методом? Что для этого может быть нужно?

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

Удалённые рабочие столы или виртуальные рабочие столы
Здравствуйте! Муки выбора. Есть офис на 200 рабочих станций, поставлена задача покупки сервера...


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

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

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