Дополнен 6 лет назад
нужно запустить в TASM
Дополнен 6 лет назад
modeltiny
s_s segment stack
db 0ffh dup(?)
s_s ends
d_s segment
arr_size equ 7
arr dbarr_size dup(?)
msg_inp_arr db 0dh,0ah,'Input array:',0dh,0ah,'$'
msg_err_read db 0dh,0ah,'Error input element',0dh,0ah,'$'
c dw ?
d_s ends
c_s segment
assume cs:c_s, ss:s_s, ds_s, es_s
start:
jmp BEGIN
ERROR_READ_ELEMENT:
movah, 09h
movdx, offset msg_err_read
int21h
jmpEXIT
BEGIN:
movax, d_s
movds, ax
movah, 09h
movdx, offset msg_inp_arr
int21h
movbh, arr_size
xorsi, si
READ_ELEMENT:
movcx, 3
xordl, dl
xordh, dh
READ_CHR:
movah, 01h
int21h
cmpal, ' '
jnzCMP_NEG
cmpcx, 3
jz READ_CHR
jmp short SAVE_ELEMENT
CMP_NEG:
cmpcx, 3
jnz CMP_DIG
cmp al, '-'
jnz CMP_DIG
movdh, 1
jmpshort READ_CHR
CMP_DIG:
cmpal, '0'
jbERROR_READ_ELEMENT
cmpal, '9'
jaERROR_READ_ELEMENT
movbl, al
subbl, '0';
xorah, ah
moval, 10
muldl
movdl, al
adddl, bl
READ_NEXT_CHR:
loopREAD_CHR
SAVE_ELEMENT:
cmpdh, 0
jzSAVE_ELEMENT_
negdl
SAVE_ELEMENT_:
movarr[si], dl
incsi
decbh
cmpbh, 0
jnzREAD_ELEMENT
movbl, 127
xorsi, si
movcx, arr_size
FIND_MIN:
cmpbl, arr[si]
jleFIND_MIN_NEXT
movbl, arr[si]
FIND_MIN_NEXT:
incsi
loopFIND_MIN
xoral, al
xorsi, si
movcx, arr_size
SUM_NEXT:
cmparr[si], -5
jlSUM_NEXT_
cmparr[si], 15
jgSUM_NEXT_
addal, arr[si]
SUM_NEXT_:
incsi
loopSUM_NEXT
xorah, ah
imulbl
movdi, ax
cmpdi, 0
jgeOUT_DIG_
negdi
movah, 02h
movdl, '-'
int21h
OUT_DIG_:
movah, 03h
xorbh, bh
int10h
adddl, 3
movbp, dx
OUT_DIG:
finit
fstcwc
orc, 0000110000000000b
fldcwc
movc, di
fildc
movc, 10
fidivc
frndint
fistpc
movcx, di
movdi, c
MOD_10:
cmp cx, 10
jlOUT_DIG__
subcx, 10
jmpMOD_10
OUT_DIG__:
movah, 02h
movbx, bp
movdh, bh
movdl, bl
xorbh, bh
int10h
movah, 02h
movdl, cl
adddl, '0'
Дополнен 6 лет назад
int21h
decbp
cmpdi, 0
jnzOUT_DIG
EXIT:
movax, 4c00h
int21h
c_s ends
end start
ввести с клавиатуры массив из 7 целых чисел, найти и вывести на эк-
ран сумму тех элементов массива, которые при делении на 5 дают в
остатке 1 или 3.