Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Илья Ч
0 / 0 / 0
Регистрация: 05.10.2012
Сообщений: 8
#1

структуры->запись

24.05.2013, 21:44. Просмотров 878. Ответов 9
Метки нет (Все метки)

Реализуйте векторную алгебру в трехмерном пространстве (сложение, вычитание, скалярное и векторное произведение векторов). Вектор представляется как запись с полями, соответствующими координатам
Написал лабу через структуры, оказалось надо было выполнить через рекорд, начал переделевыть, что-то не получается(((
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
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
.kEnter equ 0Dh   ;Коды клавиш
KBSp   equ 08h
kSp    equ 20h
;нажатие на любую клавишу
readkey macro
   xor ah,ah
   int 16h
endm
;Сохранение регистров в стеке
SaveReg macro RegList
   irp reg,<RegList>     ;irp-директива повторения, предназначенная для макросов, срд. несколько идущих подряд одинаковых последовательностей строк
      push reg
   endm
endm
;Восстановление регистров из стека
LoadReg macro RegList
   irp reg,<RegList>
      pop reg
   endm
endm
.286  ;директива, обозначающая набор инструкций, которые можно использовать
 
data segment word 'data'
;**********************************************************
Vector record X:5=0, Y:5=0, Z:5=0
a Vector <>
b Vector <>
c Vector <>
 
   Inp1 db 'Vvedite A:',10,13,'$'
   Inp2 db 'Vvedite B:',10,13,'$'
   InpX db 'X: ','$'
   InpY db 'Y: ','$'
   InpZ db 'Z: ','$'
 
   RezAdd db 'A+B:',10,13,'$'
   RezSub db 'A-B:',10,13,'$'
   RezMulS db 'A*B:',10,13,'$'
   RezMulV db 'AxB:'
   CRLF db 10,13,'$';переход на новую строку
data ends
 
;СЕГМЕНТ СТЕКА
stk segment stack word;начало
   db 100h dup (?);256 байт под стек
stk ends;конец
 
;СЕГМЕНТ КОДА
text segment word public 'code' use16;сегменты выбранной модели используются как 16-битные
assume CS:text,ES:data,DS:data,SS:stk;назначение сегментов
 
;-------------ПРОЦЕДУРЫ-------------------------
;ОЧИСТКА ЭКРАНА
ClrScr proc
   SaveReg <ax,bx,cx,dx>  ;сохраняем регистры в стеке
   mov ah,02h;номер службы BIOS
   xor bh,bh
   xor dx,dx
   int 10h  ;Установим курсор в верхний левый угол
   mov ax,0920h
   mov bl,7
   mov cx,80*25  ;выводим 2000 пробелов
   int 10h
   LoadReg <dx,cx,bx,ax>  ;загружаем регистры из стека
   ret;возврат управления
ClrScr endp
 
;ВЫВОД СИМВОЛА
OutCh proc  ;в al - код символа
   SaveReg <ax,bx>
   mov ah,0Eh
   xor bh,bh
   int 10h
   LoadReg <bx,ax>
   ret
OutCh endp
 
;ПЕРЕХОД НА НОВУЮ СТРОКУ НА ЭКРАНЕ
ChangeLine proc
   push dx
   mov dx,offset CRLF
   call OutputStr
   pop dx
   ret
ChangeLine endp
 
;ВВОД ЦЕЛОГО ЧИСЛА СО ЗНАКОМ
InputBin proc  ;результата в ax
   SaveReg <bx,cx,dx,di,si,bp>
   xor ax,ax
   xor si,si  ;текущяя длина
   mov bp,10  ;умножаем на 10
 
StartPosition:
   xor di,di  ;число
   xor cl,cl  ;флаг знака
 
Nac:
   readkey
   cmp al,'9'
   ja Nac
   cmp al,'0'
   jb LessNumb
 
   mov bl,al  ;сохраним в al
   mov ax,di
   mul bp
   or dx,dx  ;есть ли переполнение
   jnz Nac  ;если есть вводим дальше
 
   mov dl,bl
   sub dl,'0'
   xor dh,dh  ;dx = цифра
   add dx,ax
   jc Nac  ;Если перенос -> переполнение
 
   mov di,dx
   mov al,bl
   jmp short OutNextCh
 
PressMinus:
   or si,si
   jnz Nac  ;если не в начале строки
   mov cl,1  ;устанавливаем флаг в 1
 
OutNextCh:
   call OutCh  ;выводим минус на экран
   inc si
   jmp short Nac
 
PressBSp:
   or si,si
   jz Nac  ;если ничего не ввели, то вводим дальше
 
   mov ah,02h
   mov dl,kBSp
   int 21h
   mov dl,kSp
   int 21h
   mov dl,kBSp
   int 21h
 
   dec si
   or si,si  ;если стерли певый символ
   jz StartPosition  ;то все сбрасываем в ноль
   xor dx,dx
   mov ax,di  ;иначе
   div bp   ;делим на 10
   mov di,ax
   jmp short Nac
 
LessNumb:
   cmp al,'-'
   je PressMinus
   cmp al,kBSP
   je PressBSp
   cmp al,kEnter
   jne Nac
 
   or si,si  ;если ничего не ввели
   jz Nac  ;то вводим дальше
 
   mov ax,di
   or cl,cl  ;порверяем на знак
   jz EndInputBin
   neg ax
EndInputBin:
   call ChangeLine
   LoadReg <bp,si,di,dx,cx,bx>
   ret
InputBin endp
 
;ВЫВОД ЦЕЛОГО ЧИСЛА СО ЗНАКОМ
OutputBin proc   ;в ax - выводимое число
   SaveReg <ax,bp,dx>
   cmp ax,0
   jge PositNumber
 
   push ax
   mov al,'-'
   call OutCh
   pop ax
   neg ax
 
PositNumber:
   mov bp,10
   push bp   ;Сохраним признак конца числа
@@l:
   xor dx,dx
   div bp       ;Делим
   push dx      ;Сохраним цифру
   or ax,ax     ;Остался 0?
   jnz @@l      ;нет -> продолжим
   mov ah,02h   ;функция вывода символа
@@l2:
   pop dx       ;Восстановим цифру
   cmp dx,10    ;Дошли до конца -> выход
   je @@ex
   add dl,'0'   ;Преобразуем число в цифру
   int 21h  ;Выведем цифру на экран
   jmp short @@l2 ;И продолжим
@@ex:
   LoadReg <dx,bp,ax>
   ret
OutputBin endp
 
;ВЫВОД СТРОКИ
OutputStr proc  ;в dx - адрес строки
   push ax
   mov ah,09h
   int 21h
   pop ax
   ret
OutputStr endp
 
;ВВОД ВЕКТОРА
InputVector proc  ;в bx - адрес вектора
   SaveReg <ax,dx>
   mov dx,offset InpX
   call OutputStr
   call InputBin
   mov [bx].X,ax
 
   mov dx,offset InpY
   call OutputStr
   call InputBin
   mov [bx].Y,ax
 
   mov dx,offset InpZ
   call OutputStr
   call InputBin
   mov [bx].Z,ax
   LoadReg <dx,ax>
   ret
InputVector endp
 
;ВЫВОД ВЕКТОРА
OutputVector proc  ;в bx - адрес векотра
   SaveReg <ax,dx>
   mov al,'('
   call OutCh
   mov ax,[bx].X
   call OutputBin
   mov al,','
   call OutCh
   mov ax,[bx].Y
   call OutputBin
   mov al,','
   call OutCh
   mov ax,[bx].Z
   call OutputBin
   mov al,')'
   call OutCh
   call ChangeLine
   LoadReg <dx,ax>
   ret
OutputVector endp
 
;ВЫЧИТАНИЕ 2-Х ВЕКТОРОВ A - B = C
SubVector proc
   push ax
   mov ax,a.X
   sub ax,b.X
   mov c.X,ax
   
   mov ax,a.Y
   sub ax,b.Y
   mov c.Y,ax
   
   mov ax,a.Z
   sub ax,b.Z
   mov c.Z,ax
   pop ax
   ret
SubVector endp
 
 
;СЛОЖЕНИЕ 2-Х ВЕКТОРОВ A + B = C
AddVector proc
   push ax
   mov ax,a.X
   add ax,b.X
   mov c.X,ax
 
   mov ax,a.Y
   add ax,b.Y
   mov c.Y,ax
 
   mov ax,a.Z
   add ax,b.Z
   mov c.Z,ax
   pop ax
   ret
AddVector endp
 
;СКАЛЯРНОЕ УМНОЖЕНИЕ 2-Х ВЕКТОРОВ A * B = ax
MulVectorS proc
   Savereg <bx,dx>
   mov ax,A.X
   imul B.X
   mov bx,ax
   mov ax,A.Y
   imul B.Y
   add bx,ax
   mov ax,A.Z
   imul B.Z
   add ax,bx
   LoadReg <dx,bx>
   ret
MulVectorS endp
 
;ВЕКТОРОНОЕ УМНОЖЕНИЕ 2-Х ВЕКТОРОВ [A , B] = C
MulVectorV proc
   Savereg <ax,bx,cx,dx>
;C.X = A.Y*B.Z - A.Z*B.Y   
   mov ax,A.Y
   imul B.Z
   mov bx,ax
   
   mov ax,A.Z
   imul B.Y
   sub bx,ax
   mov C.X,bx
;C.Y = A.Z*B.X - A.X*B.Z
   mov ax,A.Z
   imul B.X
   mov bx,ax
   
   mov ax,A.X
   imul B.Z
   sub bx,ax
   mov C.Y,bx
;C.Z = A.X*B.Y - A.Y*B.X
   mov ax,A.X
   imul B.Y
   mov bx,ax
   
   mov ax,A.Y
   imul B.X
   sub bx,ax
   mov C.Z,bx
 
   LoadReg <dx,cx,bx,ax>
   ret
MulVectorV endp
 
;-------------ОСНОВНАЯ ПРОГРАММА----------------
START:
   mov ax,data
   mov ds,ax  ;настроим ds
   call clrscr
 
;Вводим первое число
   mov dx,offset Inp1
   call OutputStr
   mov bx,offset a
   call InputVector
 
;Вводим второе число
   mov dx,offset Inp2
   call OutputStr
   mov bx,offset b
   call InputVector
   call ChangeLine
 
   mov bx,offset c   ;адрес C в bx (для вывода на экран)
;Теперь поочередно вызываем процедуры
   mov dx,offset RezAdd
   call OutputStr
   call AddVector
   call OutputVector
 
   mov dx,offset RezSub
   call OutputStr
   call SubVector
   call OutputVector
 
   mov dx,offset RezMulV
   call OutputStr
   call MulVectorV
   call OutputVector
 
   mov dx,offset RezMulS
   call OutputStr
   call MulVectorS
   call OutputBin
   call ChangeLine
 
   xor ah,ah
   int 16h  ;ждем нажатия на клавишу
   mov ax,4c00h  ;Выходим
   int 21h
text ends
end START
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.05.2013, 21:44
Ответы с готовыми решениями:

Запись структуры в файл - Как сделать так, чтобы в файл записывались только данные структуры?
Здравствуйте! using System.Runtime.Serialization.Formatters.Binary; ...

Запись структуры в файл
Всем доброго времени, следующая проблема: Есть структура struct UserInfo...

Запись структуры в файл
Написать программу выдающую на печать следующую информацию: фамилию сборщика и...

Запись структуры в файл.
3. Написать процедуры (или функции) записи в файл и считывания из файла массива...

Запись структуры в файл
Как правильно будет записать структуру данных в файл, что бы затем без проблем...

9
sh2ezo
1126 / 260 / 9
Регистрация: 11.06.2010
Сообщений: 1,050
24.05.2013, 21:59 #2
а со структурами прога работала?

и, кстати, что такое запись в асме? О_о
0
Troll_Face
603 / 403 / 8
Регистрация: 26.04.2012
Сообщений: 2,070
24.05.2013, 22:33 #3
Цитата Сообщение от sh2ezo Посмотреть сообщение
и, кстати, что такое запись в асме? О_о
то же самое, что и в ЯВУ
0
sh2ezo
1126 / 260 / 9
Регистрация: 11.06.2010
Сообщений: 1,050
24.05.2013, 22:39 #4
Troll_Face, а что это в ЯВУ? О_о а то я всегда кодил и как-то не задумывался о всяких сложных понятиях
0
Troll_Face
603 / 403 / 8
Регистрация: 26.04.2012
Сообщений: 2,070
24.05.2013, 22:47 #5
ну как сказать.... структура, это переменная со вложенными переменными, грубо говоря. пример можно привести функция 10 21h прерывания доса.
Assembler
1
2
3
4
5
struct aaa
max_len db 32
real_len db ?
buf db 33 dup (?)
ends
потом объявляешь переменную типа структура (или как правильно говорится)
Assembler
1
2
3
4
5
6
7
8
.data
stroka aaa <>
....
.code 
.....
mov ah, 10
mov dx, offset stroka
int 21h
потом можно обращаться к переменной real_size которая будет принадлежать определенной переменной. в нашем случае stroka.
Assembler
1
mov al, stroka.real_size
или если есть 10 переменных, то можно обращаться к длинне строки как имя_переменной.real_size. объяснил коряво, для подробного разбора гугли

Добавлено через 49 секунд
если еще грубее сказать, то структура это массив с именованными ячейками. причем эти ячейки могут быть разной длинны.
0
sh2ezo
1126 / 260 / 9
Регистрация: 11.06.2010
Сообщений: 1,050
24.05.2013, 23:24 #6
Troll_Face, так-то я про запись спрашивал.... xD
0
Vadimych
635 / 478 / 12
Регистрация: 10.01.2011
Сообщений: 1,047
24.05.2013, 23:31 #7
sh2ezo, RECORD (MASM)
0
Troll_Face
603 / 403 / 8
Регистрация: 26.04.2012
Сообщений: 2,070
25.05.2013, 06:52 #8
Цитата Сообщение от sh2ezo Посмотреть сообщение
так-то я про запись спрашивал
так запись это и есть структура. в паскале запись, в си\си++\асм\еще_где-то структура
0
Mikl___
Автор FAQ
11730 / 6042 / 543
Регистрация: 11.11.2010
Сообщений: 11,025
25.05.2013, 13:22 #9
Troll_Face, sh2ezo ,
запись это структура, но уже на битовом уровне, конкретней прочитайте в учебнике Пильщикова по ассемблеру
0
Илья Ч
0 / 0 / 0
Регистрация: 05.10.2012
Сообщений: 8
26.05.2013, 16:39  [ТС] #10
а переделать то поможет кто-нибудь?)
0
26.05.2013, 16:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.05.2013, 16:39

Запись структуры в файл.
Всем продуктивной ночи! Подскажите, хочу записать структуру в файл, нужно...

Запись структуры в файл
Хочу записать структуру в файл. Но записывается только одна структура ,...

Запись структуры в файл
Работаю в Borland C(чистый С) Нужно: Создать файл, который содержит...


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

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

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