Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
 Аватар для Shura_deg
83 / 19 / 5
Регистрация: 01.02.2015
Сообщений: 655
1

Emu8086 элементы больше среднего арифметического удалить

20.03.2015, 17:08. Показов 1753. Ответов 8
Метки нет (Все метки)

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
data segment     
    mas1 dw 2, 4, 6, 8, 10
    mas2 dw 5 dup (?) 
    n dw 0 
    s dw 0
ends
 
stack segment
    dw   128  dup(0)
ends
 
code segment
start:
; set segment registers:
    mov ax, data
    mov ds, ax
    mov es, ax
    
xor ax, ax
xor si, si
mov cx, 5
@1:
add ax, mas1[si]
add si, 2
inc n
loop @1
cwd
idiv n
;--------------------
xor si,si 
mov cx, 5
@2:
cmp ax,mas1[si]
JGE @3
add dx,mas1[si] 
add mas2[si], dx
@3: 
add si, 2
loop @2  
    mov ax, 4c00h ; exit to operating system.
    int 21h
В чём мой косяк?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.03.2015, 17:08
Ответы с готовыми решениями:

В массиве удалить элементы, меньшие среднего арифметического элементов массива
"В массиве удалить элементы, меньшие среднего арифметического элементов массива." Надо написать...

Подсчитать количество элементов, которые больше среднего арифметического массива
Задание такое: нужно написать программу, которая формирует массив из 3-х столбцов и 5-ти строк....

Удалить элементы массива больше среднего арифметического
Дан файл вещественных чисел, удалить элементы больше среднего арифметического. Не пойму, но почему,...

Удалить из массива те элементы, которые больше среднего арифметического
Дан массив целых чисел D1,...,D30. Удалить из него те элементы, которые больше среднего...

8
Terminator of naked apes
 Аватар для KyberMax
832 / 139 / 34
Регистрация: 13.02.2015
Сообщений: 328
20.03.2015, 19:12 2
Shura_deg, ответ на твой вопрос зависит от того, что ты хочешь: если ты хочешь просто получить рабочий код, то там полно косяков. Если же ты хочешь научиться именно программить, то для этого ты должен не на форуме болтаться, а сидеть за компом, ваяя код. Если же что-то непонятно - читать букварь до полного просветления, если просветления не наступает - курить мануал до полного одурения и так по кругу (именно так становятся программерами, например ;о)
0
 Аватар для Shura_deg
83 / 19 / 5
Регистрация: 01.02.2015
Сообщений: 655
11.04.2015, 22:17  [ТС] 3
KyberMax, мне бы хотя бы алгоритм как это переставить и удалить эти элементы
Не обязательно для emu
Пример
Исходный массив: -2, -4, -6, -8, -10
среднее арифметическое: -6
Преобразованный массив: -6, -8, -10
Числа должны быть в слово (dw)

Добавлено через 1 час 57 минут
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
      LEA   SI, dwArray
      MOV   CX, dwDimensionArray 
      PUSH  CX                ; Push array length in words on stack
      XOR   BX, BX
      XOR   DI, DI            ; Array Sum = DI:BX = 0
addloop:
      LODSW                   ; AX = DS:[SI], SI = SI + 2
      CWD                     ; AX -> DX:AX
      ADD   BX, AX
      ADC   DI, DX            ; DI:BX = DI:BX + DX:AX
      LOOP  addloop
      MOV   AX, BX
      MOV   DX, DI            ; DX:AX = DI:BX = Array Sum
      POP   CX                ; Pop array length in words from stack
      IDIV  CX                ; AX.DX = DX:AX / CX
      MOV   dwAverage, AX            
    ; add your code here
    mov bx,cx
    shl bx,1
    mov bp,bx
    lea si,dwArray
    lea di,si
    add di,bp
    add di,2
    xor bx,bx
    mov bp,dwAverage
    cycle:
    LODSW
    cmp ax,bp 
    JG m1          ;if ax (>) or (=) dwAverage  
    add di,2 
    mov [di],ax
    inc bx
    m1:
    loop cycle
Вот рабочий вариат только не знаю на сколько он правильный
Я получается не резервирую место под мой преобразованный "массив"
ещё заметил что сразу после размещённого по адресу dwArray массива идут два значения это мои dwAverage
и dwDimensionArray тоесть если их случайно можно заменить указав не тот адрес DI тоесть если добавлять какие то дополнительные переменные то придётся в коде немного менять занесение моего массива
________________________________________________________________________________ _____________________
МБ кто то предложит альтернативный метод решения данной задачи?

Добавлено через 58 секунд
НЕ ПИШИТЕ МНЕ ЕСЛИ НАДУМАЕТЕ ПОД EMU8086
0
Terminator of naked apes
 Аватар для KyberMax
832 / 139 / 34
Регистрация: 13.02.2015
Сообщений: 328
12.04.2015, 09:13 4
Shura_deg, для проверки правильности воспользуйся обезжучивателем (тем же emu8086 можно посмотреть уже готовый бинарник, например ;о) Для хранения длины массива в данном случае отдельная переменная не нужна. Преобразованный массив можно сохранить отдельно, а можно преобразовать исходный, вот код (только добавил элементы в массив, чтобы было веселей, например ;о):
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
;
; Calculates Arithmetic Mean (Average)
;
; \MASM\BIN\Ml /c /Cp /nologo /Fl /Sa /Sn DlLArMnE.ASM
; \MASM\BIN\Link /MAP /NOLOGO DlLArMnE,,;
;
.8086
.ALPHA
.MODEL SMALL
OPTION CASEMAP: NONE
;
CR          EQU   0Dh
LF          EQU   0Ah
;
DATA SEGMENT
dwArray     DW    -2, 10, -4, 8, -6, 0, 6, -8, 4, -10, 2, -42
sdAppInfo   DB    "Deletes elements from array if they less then array average"
sdCrLf      DB    CR, LF, "$"
sdBefore    DB    " array length before: $"
sdAverage   DB    " array average:       $"
sdAfter     DB    " array length after:  $"
DATA ENDS
;
ArrayLen    EQU   Sizeof dwArray/Sizeof Word
;
STACK SEGMENT Stack
            DW    128 Dup(?)
STACK ENDS
;
CODE SEGMENT
START:
      MOV   AX, DATA
      MOV   DS, AX
      MOV   ES, AX
 ASSUME DS:DATA, ES:DATA
      LEA   DX, sdAppInfo
      CALL  showSd
; Show length of array before deleting
      LEA   DX, sdBefore
      CALL  showSd
      MOV   AL, ArrayLen
      CALL  showByte99
      CALL  crLf
; Calculate Arithmetic Mean of array
      LEA   SI, dwArray
      MOV   CX, ArrayLen      ; Array length in words
      CALL  calcAverageSignWord
; Show Arithmetic Mean of array
      LEA   DX, sdAverage
      CALL  showSd
      CALL  showSignByte99
      CALL  crLf
; Delete elements from array if they less then Arith.Mean
      MOV   DX, AX            ; Arith.Mean of Array
      MOV   DI, SI            ; Dest.addr. = Src.addr.
      CALL  delLessSignWord
; Show length of array after deleting
      LEA   DX, sdAfter
      CALL  showSd
      CALL  showByte99
      CALL  crLf
; Exit
      MOV   AX, 4C00h
      INT   21h
;
calcAverageSignWord PROC Uses BX CX DX DI SI
; Input:  DS:SI = array address
;         CX    = array length in words
; Output: AX    = average
LOCAL arrlen:Word
      XOR   BX, BX
      XOR   DI, DI            ; Array Sum = DI:BX = 0
      MOV   arrlen, CX
addloop:
      LODSW                   ; AX = DS:[SI], SI = SI + 2
      CWD                     ; AX -> DX:AX
      ADD   BX, AX
      ADC   DI, DX            ; DI:BX = DI:BX + DX:AX
      LOOP  addloop           ; CX = CX - 1, if CX > O goto ADD_LOOP
      MOV   AX, BX
      MOV   DX, DI            ; DX:AX = DI:BX = Array Sum
      MOV   CX, arrlen        ; Array length in words
      IDIV  CX                ; AX.DX = DX:AX / CX
      RET
calcAverageSignWord ENDP
;
delLessSignWord PROC Uses BX CX DX DI SI
; Input:  DS:SI = source array address
;         ES:DI = destination array address
;         CX    = length of source array
;         DX    = number for comparison
; Output: AX    = length of destination array
      XOR   BX, BX            ; Number of array members >= Arith.Mean
delloop:
      LODSW                   ; AX = DS:[SI], SI = SI + 2
      CMP   AX, DX            ; Compare AX and DX (AX - DX)
      JL    nextword          ; If AX < DX goto nextword
      STOSW                   ; ES:[DI] = AX, DI = DI + 2
      INC   BX                ; BL = BL + 1
nextword:
      LOOP  delloop           ; CX = CX - 1, if CX > 0 goto delloop
      MOV   AX, BX
      RET
delLessSignWord ENDP
;
showSignByte99 PROC Uses AX DX
; Shows sign. byte in range -99...99
; Input: AL = Byte
      TEST  AL, AL
      JNS   showbyte
      NEG   AL
      MOV   DL, "-"
      CALL  showChar
showbyte:
      CALL  showByte99
      RET
showSignByte99 ENDP
;
showByte99 PROC Uses AX DX
; Shows byte in range 0...99
; Input: AL = Byte
      AAM
      TEST  AH, AH
      JZ    showlowdigit
      MOV   DL, AH
      CALL  showDigit
showlowdigit:
      MOV   DL, AL
      CALL  showDigit
      RET
showByte99 ENDP
;
showDigit PROC Uses DX
; Input: DL = digit
      ADD   DL, "0"
      CALL  showChar
      RET
showDigit ENDP
;
showChar PROC Uses AX
; Input: DL = char
      MOV   AH, 2
      INT   21h
      RET
showChar ENDP
;
crLf PROC Uses DX
      LEA   DX, sdCrLf
      CALL showSd
      RET
crLf ENDP
;
showSd PROC Uses AX
; Input: DX = string address
      MOV   AH, 9
      INT   21h
      RET
showSd ENDP
CODE ENDS
;
      END   START
;
1
Terminator of naked apes
 Аватар для KyberMax
832 / 139 / 34
Регистрация: 13.02.2015
Сообщений: 328
13.04.2015, 21:02 5
Shura_deg, посмотрел прикреплённую тему по вводу/выводу чисел в различных системах счисления, которую тебе порекомендовал - не понравилось, например ;о) Так что на материале твоего задания наваял несколько простеньких процедурок по рецепту ВВП: мухи отдельно, котлеты отдельно (в данном контексте - конвертеры отдельно от ввода/вывода, например ;о) Посмотри, может пригодится (теперь массив вводится с клавы ;о)
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
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
;
; \MASM\BIN\Ml /c /Cp /nologo /Fl /Sa /Sn DeLesAvE.ASM
; \MASM\BIN\Link /MAP /NOLOGO DeLesAvE,,;
;
.186
.DOSSEG
OPTION CASEMAP: NONE
;
CR          EQU   0Dh
LF          EQU   0Ah
;
MaxKBufLen  EQU   80                ; Max.length within CR terminator
MaxArrLen   EQU   MaxKBufLen/2      ; Max.length of array (digit+space->word)
;
KEYB_BUF STRUCT
dbMaxLen    DB    ?
dbCharNum   DB    ?
ChBuf       DB    MaxKBufLen Dup(?)
KEYB_BUF ENDS
;
COMSEG GROUP _CODE, _DATA, _UDATA
;
_DATA SEGMENT "Data"
sdAppInfo   DB    "Deletes elements from array if they less then array average"
sdCrLf      DB    CR, LF, "$"
sdEnter     DB    " enter string of separated by spaces signed words "
            DB    "(empty string - exit)", CR, LF, "$"
sdAverage   DB    "average: $"
sdWrongChar DB    " wrong char.", CR, LF, "$"
sdNoDigit   DB    " no digit", CR, LF, "$"
sdOverflow  DB    " overflow", CR, LF, "$"
sdPointer   DB    "^", CR, LF, "$"
_DATA ENDS
;
_UDATA SEGMENT "Data"
dwArray     DW    MaxArrLen Dup(?)
kbBuf       KEYB_BUF <>
chOutBuf    DB    MaxKBufLen + Sizeof sdCrLf Dup(?)
_UDATA ENDS
;
_STACK SEGMENT Stack "Stack"
      DW 128 Dup(?)
_STACK ENDS
;
_CODE SEGMENT "Code"
START:
      MOV   DX, COMSEG
      MOV   DS, DX
      MOV   ES, DX
      MOV   AX, _STACK
      SUB   AX, DX
      SHL   AX, 4
      CLI
      ADD   SP, AX      ; GROUP directive don't work with stack segment
      MOV   SS, DX      ; so group it with COMSEG by hands (useful for locals in stack ;o)
      STI
 ASSUME CS:COMSEG, DS:COMSEG, ES:COMSEG, SS:COMSEG
      LEA   DX, sdAppInfo
      CALL  showSd
STR_LOOP:
      LEA   DX, sdEnter
      LEA   SI, kbBuf
      MOV   CL, MaxKBufLen
      CALL  inputSc
      JCXZ  EXIT
      LEA   DI, dwArray
      CALL  sc2SignWordArray
      JNC   VER_EMPTY_STR
      MOV   DX, AX
      SUB   CX, Offset [kbBuf].ChBuf
      CALL  showPointer
      CALL  showSd
      JMP   STR_LOOP
VER_EMPTY_STR:
      JCXZ  EXIT
; Calculate Arithmetic Mean of array
      MOV   SI, DI
      CALL  calcAverageSignWord
; Show Arithmetic Mean of array
      LEA   DX, sdAverage
      CALL  showSd
      CALL  showSignWord
      CALL  crLf
; Delete elements from array if they less then Arith.Mean
      MOV   DX, AX            ; Arith.Mean of Array
      MOV   DI, SI            ; Dest.array addr. = Src.array addr.
      CALL  delLessSignWord
; Show array after deleting
      MOV   CX, AX
      LEA   DI, chOutBuf
      CALL  signWordArray2Sd
      MOV   DX, DI
      CALL  showSd
      JMP   STR_LOOP
EXIT:
      MOV   AX, 4C00h
      INT   21h
;
calcAverageSignWord PROC Uses BX CX DX DI SI
; Input:  SI = array address
;         CX = array length in words
; Output: AX = average
      XOR   BX, BX
      XOR   DI, DI            ; Array Sum = DI:BX = 0
      PUSH  CX                ; Push array length on stack
addloop:
      LODSW                   ; AX = DS:[SI], SI = SI + 2
      CWD                     ; AX -> DX:AX
      ADD   BX, AX
      ADC   DI, DX            ; DI:BX = DI:BX + DX:AX
      LOOP  addloop           ; CX = CX - 1, if CX > O goto ADD_LOOP
      MOV   AX, BX
      MOV   DX, DI            ; DX:AX = DI:BX = Array Sum
      POP   CX                ; Pop array length from stack
      IDIV  CX                ; AX.DX = DX:AX / CX
      RET
calcAverageSignWord ENDP
;
delLessSignWord PROC Uses BX CX DX DI SI
; Input:  SI = source array address
;         DI = destination array address
;         CX = length of source array
;         DX = number for comparison
; Output: AX = length of destination array
      XOR   BX, BX            ; Number of array elements >= number for comparison
delloop:
      LODSW                   ; AX = DS:[SI], SI = SI + 2
      CMP   AX, DX            ; Compare AX and DX (AX - DX)
      JL    nextword          ; If AX < DX goto nextword
      STOSW                   ; ES:[DI] = AX, DI = DI + 2
      INC   BX                ; BX = BX + 1
nextword:
      LOOP  delloop           ; CX = CX - 1, if CX > 0 goto delloop
      MOV   AX, BX
      RET
delLessSignWord ENDP
;
sc2SignWordArray PROC Uses BX DX DI SI
; Input:  SI = stringCR address
;         DI = array address
; Output: if ok CF = 0
;         CX = array element number
;         if error CF = 1
;         CX = address of error in string
;         AX = address of error message
      XOR   DX, DX            ; Arg count
argloop:
      CALL getArg
      JCXZ  endofargs
str2word:
      CALL  str2SignWord
      JC    exit
      STOSW
      INC   DX
      JMP   argloop
endofargs:
      MOV   CX, DX
exit:
      RET
sc2SignWordArray ENDP
;
getArg PROC
; Input:  SI = stringCR address
; Output: BX = arg address
;         CX = arg length
;         SI = current position in stringCR
      XOR   CX, CX      ; Arg length
skipspace:
      LODSB
      CMP   AL, CR
      JE    exit
      CMP   AL, " "
      JE    skipspace
      DEC   SI
      MOV   BX, SI
searchargterm:
      LODSB
      CMP   AL, CR
      JE    argfound
      CMP   AL, " "
      JE    argfound
      INC   CX
      JMP   searchargterm
argfound:
      DEC   SI
exit:
      RET
getArg ENDP
;
str2SignWord PROC Uses BX DX
; Input:  BX = address of string
;         CX = length of string
; Output: if ok CF = 0
;         AX = word
;         if error CF = 1
;         CX = address of error in string
;         AX = address of error message
      CMP   [BX], Byte Ptr "-"
      PUSHF
      JNE   conv
      INC   BX
      DEC   CX
conv:
      CALL  str2Word
      JC    error
      TEST  AX, AX
      JNS   versign
      LEA   AX, sdOverflow
      STC
error:
      POP   DX
      JMP   exit
versign:
      POPF
      JNE   exit
      NEG   AX
      CLC
exit:
      RET
str2SignWord ENDP
;
str2Word PROC Uses BX DX DI SI
; Input:  BX = address of string
;         CX = length of string
; Output: if ok CF = 0
;         AX = word
;         CX = address of string
;         if error CF = 1
;         AX = address of error message
;         CX = address of error in string
      JCXZ  nodig
      XOR   DI, DI      ; Result
      MOV   SI, 1       ; Multiplier
      ADD   BX, CX
convloop:
      CALL  getDecDig
      JC    error
      XOR   AH, AH
      MUL   SI
      JC    overflow
      ADD   DI, AX
      JC    overflow
      MOV   AX, 10
      MUL   SI
      MOV   SI, AX
      JC    skipleadzeros
      LOOP  convloop
      JMP   ok
skipleadzeros:
      DEC   CX
      JZ    ok
      CALL  getDecDig
      JC    error
      TEST  AL, AL
      JZ    skipleadzeros
overflow:
      LEA   AX, sdOverflow
      JMP   error
nodig:
      LEA   AX, sdNoDigit
error:
      STC
      JMP   exit
ok:
      MOV   AX, DI
      CLC
exit:
      MOV   CX, BX
      RET
str2Word ENDP
;
getDecDig PROC
; Input:  BX = next char address
; Output: AL = digit
;         BX = char address
;         if error CF = 1
;         AX = address of error message
      DEC   BX
      MOV   AL, [BX]
      SUB   AL, "0"
      JC    wrongchar
      CMP   AL, 10
      CMC
      JNC   exit
wrongchar:
      LEA   AX, sdWrongChar
exit:
      RET
getDecDig ENDP
;
signWordArray2Sd PROC Uses CX DX DI SI
; Input:  SI = Array Address
;         DI = str address
;         CX = Array Length
stloop:
      LODSW
      CALL  signWord2DecStr
      MOV   AL, " "
      STOSB
      LOOP  stloop
      LEA   SI, sdCrLf
      MOV   CX, Sizeof sdCrLf
      REP MOVSB
      RET
signWordArray2Sd ENDP
;
signWord2DecStr PROC Uses AX
; Input:  AX = word
;         DI = buffer
; Output: DI = address of next char position
      TEST  AX, AX
      JNS   stword
      NEG   AX
      MOV   [DI], Byte Ptr "-"
      INC   DI
stword:
      CALL  word2DecStr
      RET
signWord2DecStr ENDP
;
word2DecStr PROC Uses AX BX CX DX
; Input:  AX = word
;         DI = buffer
; Output: DI = address of next char position
DecWLen     EQU   5
      MOV   BX, 10
      MOV   CX, DecWLen
divloop:
      XOR   DX, DX
      DIV   BX
      PUSH  DX
      LOOP  divloop
      MOV   CX, DecWLen - 1
skip0:
      POP   AX
      TEST  AL, AL
      JZ    nextdig
      INC   CX
      JMP   dig2char
nextdig:
      LOOP  skip0
      INC   CX
stloop:
      POP   AX
dig2char:
      ADD   AL, "0"
      STOSB
      LOOP  stloop
      RET
word2DecStr ENDP
;
showSignWord PROC Uses AX DX DI
; Converts and shows signed word
; Input:  AX = Byte
LOCAL chbuf[8]:Byte
      LEA   DI, chbuf
      CALL  signWord2DecStr
      MOV   AL, "$"
      STOSB
      LEA   DX, chbuf
      CALL  showSd
      RET
showSignWord ENDP
;
showPointer PROC Uses DX
; Input: CX = offset of pointer
      MOV   DL, " "
      JCXZ  setptr
sploop:
      CALL  showChar
      LOOP  sploop
setptr:
      LEA   DX, sdPointer
      CALL  showSd
      RET
showPointer ENDP
;
showChar PROC Uses AX
; Input: DL = char
      MOV   AH, 2
      INT   21h
      RET
showChar ENDP
;
crLf PROC Uses DX
      LEA   DX, sdCrLf
      CALL showSd
      RET
crLf ENDP
;
showSd PROC Uses AX
; Input: DS:DX = string address
      MOV   AH, 9
      INT   21h
      RET
showSd ENDP
;
inputSc PROC Uses DX
; Input:  DX = message address
;         SI = keyboard buffer address
;         CL = buffer length
; Output: CX = number of chars
;         SI = string address
 ASSUME SI: Ptr KEYB_BUF
      MOV   [SI].dbMaxLen, CL
      CALL  showSd
      MOV   DX, SI
      MOV   AH, 0Ah
      INT   21h
      CALL  crLf
      XOR   CH, CH
      MOV   CL, [SI].dbCharNum      ; String length
      LEA   SI, [SI].ChBuf
 ASSUME SI: Nothing
      RET
inputSc ENDP
_CODE ENDS
;
      END   START
;
Ну и в предыдущем коде были ошибки. Такие дела, например ;о)
1
 Аватар для Shura_deg
83 / 19 / 5
Регистрация: 01.02.2015
Сообщений: 655
15.04.2015, 11:41  [ТС] 6
Assembler
1
2
3
4
5
6
7
8
9
10
      MOV   DX, COMSEG ;'Это на сколько я понял для указания группы сегментов (code data udata)
      MOV   DS, DX     
      MOV   ES, DX
      MOV   AX, _STACK   ;Указываем адрес сенмента стека
      SUB   AX, DX  ;удаляем для чего? 
      SHL   AX, 4    ;умножаем для чего?
      CLI      ;это на сколько я понял для обработки прерываний if в 0
      ADD   SP, AX      ; GROUP directive don't work with stack segment
      MOV   SS, DX      ; so group it with COMSEG by hands (useful for locals in stack ;o)
      STI
Это на сколько я понял мы подготавливаем область в памяти?

Добавлено через 13 минут
Цитата Сообщение от KyberMax Посмотреть сообщение
MOV DI, SI ; Dest.array addr. = Src.array addr.
А вот здесь указывается адрес массива?

Добавлено через 18 минут
всё работает в принципе проверял

Добавлено через 25 секунд
тока вот эти тонкости не понятны
0
Terminator of naked apes
 Аватар для KyberMax
832 / 139 / 34
Регистрация: 13.02.2015
Сообщений: 328
16.04.2015, 09:11 7
Shura_deg, всё это для того, чтобы получить такую же конфигурацию кода, как в .COM проге: когда все сегментные регистры (CS, DS, ES, SS) указывают на один сегмент. Кодил вечером и никак не мог вспомнить, как же решается проблема адресации локальных переменных. Ведь они размещаются в стековом сегменте и значит должны адресоваться относительно сегм.регистра SS. Но есть команды, которые работают только с определёнными сегм.регистрами (LODSx - DS:SI, STOSx - ES:DI). Так что неясно было, как сработает в этой проге процедура showSignWord, например ;о)
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
;
showSignWord PROC Uses AX DX DI
; Converts and shows signed word
; Input:  AX = word
LOCAL chbuf[8]:Byte
      LEA   DI, chbuf
      MOV   DX, DI
      CALL  signWord2DecStr
      MOV   AL, "$"
      STOSB
      CALL  showSd
      RET
showSignWord ENDP
;
Поэтому для перестраховки перенёс стек в общий сегмент. Но потом протестил и вспомнил, как это работает: адрес переменной в стеке определяется с учётом разницы между содержимым стекового сегм.регистра SS и сегм.регистра DS. И если DS=ES, то всё будет окейно (за исключением какого-нибудь дикого кода, например ;о) Так что манипуляции со стековыми регистрами можно выкинуть, например ;о):
Assembler
1
2
3
4
5
6
7
;
START:
      MOV   AX, COMSEG
      MOV   DS, AX
      MOV   ES, AX
 ASSUME CS:COMSEG, DS:COMSEG, ES:COMSEG
;
А вот если ES не равен DS, то может получиться забавно. Вот код, иллюстрирующий проблему, например ;о):
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
;
; \MASM\BIN\Ml /c /Cp /nologo /Fl /Sa /Sn TestLocE.ASM
; \MASM\BIN\Link /MAP /NOLOGO TestLocE,,;
;
.186
.DOSSEG
;
_DDATA SEGMENT "dData"
dwTest      DW    55h
_DDATA ENDS
;
_EDATA SEGMENT "eData"
ewTest      DW    0AAh
_EDATA ENDS
;
_STACK SEGMENT Stack "Stack"
      DW 128 Dup(?)
_STACK ENDS
;
_CODE SEGMENT "Code"
START PROC
LOCAL sdwtest: Word
      MOV   AX, _DDATA
      MOV   DS, AX
      MOV   AX, _EDATA
      MOV   ES, AX
      MOV   AX, 1111h
      LEA   DI, sdwtest
      MOV   SI, DI
      STOSW
      LODSW
; Exit
      MOV   AX, 4C00h
      INT   21h
START ENDP
_CODE ENDS
;
      END   START
;
Посмотри в обезжучивателе, что происходит: какой адрес sdwtest загружается в SI, что записывается в переменную командой STOSW и что читается командой LODSW, например ;о)

В проге кроме немного уменьшенной процедуры приведённой выше showSignWord и лишнего кода в начале, неплохо бы заменить процедуру word2DecStr (которая была переделана из моей библиотечной с возможностью форматирования) на более короткую, например ;о)
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
;
word2DecStr PROC Uses AX BX CX DX
; Input:  AX = word
;         DI = buffer
; Output: DI = address of next char position
      MOV   BX, 10
      XOR   CX, CX
divloop:
      XOR   DX, DX
      DIV   BX
      PUSH  DX
      INC   CX
      TEST  AX, AX
      JNZ   divloop
stloop:
      POP   AX
      ADD   AL, "0"
      STOSB
      LOOP  stloop
      RET
word2DecStr ENDP
;
Цитата Сообщение от Shura_deg Посмотреть сообщение
Цитата Сообщение от KyberMax Посмотреть сообщение
MOV DI, SI ; Dest.array addr. = Src.array addr.
А вот здесь указывается адрес массива?
Здесь в регистре SI адрес массива-источника (Source Index register - SI), в регистре DI массива-приёмника (Destination Index register - DI). В данном случае, если они равны, то процедура calcAverageSignWord перезапишет массив-источник.

Такие дела, например ;о)
1
 Аватар для Shura_deg
83 / 19 / 5
Регистрация: 01.02.2015
Сообщений: 655
20.04.2015, 00:23  [ТС] 8
Цитата Сообщение от KyberMax Посмотреть сообщение
Посмотри в обезжучивателе, что происходит: какой адрес sdwtest загружается в SI, что записывается в переменную командой STOSW и что читается командой LODSW, например ;о)
Глянул правда тем что я тестил нельзя было делать локальные переменные и поэтому в data segment кинул загрузило в di 02 т.к. кинул в data segment вторым
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
; multi-segment executable file template.
 
data segment
dwTest      DW    55h
sdwtest     DW     0
ends  
edata SEGMENT 
ewTest      DW    0AAh
ENDS
 
stack segment
    dw   128  dup(0)
ends
 
code segment
start:
; set segment registers:
      MOV   AX, DATA
      MOV   DS, AX
      MOV   AX, EDATA
      MOV   ES, AX
      MOV   AX, 1111h
      LEA   DI, sdwtest
      MOV   SI, DI
      STOSW
      LODSW
 
            
 
    
    mov ax, 4c00h ; exit to operating system.
    int 21h    
ends
 
end start ; set entry point and stop the assembler.
Добавлено через 3 минуты
Те примеры ввода/вывода которые предлагаешь безусловно хороши, но очень маленький диапазон вводимых чисел если бы код был по проще в том плане что не обязательно в строку вводить хотя это очень кстати, а именно числа можно было вводить в диапазоне FFFFh
0
Terminator of naked apes
 Аватар для KyberMax
832 / 139 / 34
Регистрация: 13.02.2015
Сообщений: 328
21.04.2015, 19:11 9
Цитата Сообщение от Shura_deg Посмотреть сообщение
...правда тем что я тестил нельзя было делать локальные переменные и поэтому в data segment кинул...
Весь смысл теста локальной переменной в стеке заключается в том, что локальная переменная в стеке находится в стеке, например ;о)

Цитата Сообщение от Shura_deg Посмотреть сообщение
Те примеры ввода/вывода которые предлагаешь безусловно хороши, но очень маленький диапазон вводимых чисел если бы код был по проще в том плане что не обязательно в строку вводить хотя это очень кстати, а именно числа можно было вводить в диапазоне FFFFh
Если правильно тебя понял, то можно дополнить и вводом в шестнадцатиричном формате (кстати, str2Word работает в диапазоне 0-FFFFh, но из десятичного формата), и вводом одного числа. Но суть не в этом, приведённый пример демонстрирует подход к разработке кода: если сначала сделать обёртку из поддерживающих процедур, то дело может пойти гораздо быстрее, например ;о)
1
21.04.2015, 19:11
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.04.2015, 19:11
Помогаю со студенческими работами здесь

Удалить из нее все элементы, значение которых больше среднего арифметического
Задание: Дана последовательность х1...х20. Удалить из нее все элементы, значение которых больше...

Удалить элементы массива, которые имеют значение больше среднего арифметического
помогите пожалуйста решить последнюю часть задачи. в общем нужно удалить элементы массива, которые...

Удалить все четные элементы, имеющие значение больше среднего арифметического всех элементов массива
Удалить все четные элементы, имеющие значение больше среднего арифметического всех элементов...

Из массива удалить четные элементы, имеющие значение больше среднего арифметического всех элементов массива.
Из массива удалить четные элементы, имеющие значение больше среднего арифметического всех элементов...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Компьютер как универсальное устройство для работы с информацией
hw_wired 28.01.2025
Введение в устройство компьютера Компьютер представляет собой универсальное электронное устройство, предназначенное для автоматической обработки информации. В современном мире компьютер стал. . .
Информация и информационные процессы
hw_wired 28.01.2025
Понятие информации и ее виды В современном мире информация является одним из фундаментальных понятий, пронизывающих все сферы человеческой деятельности. Под информацией понимают любые сведения об. . .
Алгоритмика
hw_wired 28.01.2025
Введение: Основы алгоритмики и её роль в информатике В современном мире программирование и алгоритмическое мышление стали неотъемлемой частью образования и профессиональной деятельности. . . .
Информационное моделирование
hw_wired 28.01.2025
Введение в информационное моделирование В современном мире информационное моделирование стало неотъемлемой частью научной, образовательной и профессиональной деятельности. Это мощный инструмент. . .
Объекты и их имена
hw_wired 28.01.2025
Введение: Основы объектного подхода и их роль в информатике В современном мире информационных технологий объектный подход стал фундаментальным принципом организации и обработки информации. Этот. . .
Элементы алгоритмизации
hw_wired 28.01.2025
Основы алгоритмизации В современном мире алгоритмы играют фундаментальную роль в развитии информационных технологий и программирования. Понимание основ алгоритмизации является ключевым элементом в. . .
Человек и информация
hw_wired 28.01.2025
Введение: роль информации в познании мира В современном мире информация играет фундаментальную роль в процессе познания окружающей действительности. Она представляет собой совокупность сведений об. . .
Компьютер и информация
hw_wired 28.01.2025
Эволюция вычислительных машин История развития вычислительной техники начинается задолго до появления первых электронных устройств. Человечество всегда стремилось упростить процесс вычислений и. . .
Информационные технологии
hw_wired 28.01.2025
Введение в современные технологии работы с информацией В современном мире информационные технологии стали неотъемлемой частью практически всех сфер человеческой деятельности. Они существенно. . .
Информация вокруг нас
hw_wired 28.01.2025
Основные понятия информации В современном мире понятие информации является фундаментальным и охватывает практически все сферы человеческой деятельности. Информация представляет собой совокупность. . .
Компьютер для начинающих
hw_wired 28.01.2025
Введение в мир компьютерных технологий В современном мире информация стала одним из важнейших ресурсов человечества, определяющим развитие общества и технологий. Наша жизнь неразрывно связана с. . .
[golang] 189. Rotate Array
alhaos 28.01.2025
Повороты рукоятки, целочисленный слайс нужно сдвинуть на целое положительное число. Мне очень нравится решение на GO / / https:/ / leetcode. com/ studyplan/ top-interview-150/ package topInterview . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru