Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Помогите с задачей на ассемблере

Pavel Rodichev Ученик (105), закрыт 6 лет назад
Помогите написать программу на языке Ассемблера, которая позволяет
ввести с клавиатуры массив из 7 целых чисел, найти и вывести на эк-
ран сумму тех элементов массива, которые при делении на 5 дают в
остатке 1 или 3.
Дополнен 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
Лучший ответ
李西青 Просветленный (42546) 6 лет назад
Пробелами отдели команды от операндов. И может быть даже скомпилится
mov ah, 09h
mov dx, offset msg_err_read
int 21h
jmp EXIT

ну и так далее.

з. ы Использование арифметики с плавающей точкой в такой задаче (finit) сильно избыточно
Остальные ответы
Саня Семенов Оракул (60425) 6 лет назад
Ты ж понимаешь никто бесплатно не будет ковыряться в чужом ассемблером коде . Хотя мне тут чувак один помог так диплом написать на асме, 8 лет назад
Похожие вопросы