Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.04.2009, 14:14   #1
Rifler
Пользователь
 
Регистрация: 15.12.2007
Сообщений: 44
По умолчанию Ввод с клавиатуры и поиск/Assembler/TASM for Dos

Здраствуйте! Тут вот такая задачка, никак не могу дать ладу с ней. Помогите TASM for DOS
Написать программу на языке Ассемблера, которая позволяет ввести с клавиатуры целочисленный массив из 7 элементов, найти и вывести на экран сумму всех элементов исходного массива из диапазона от -5 до 15,умноженную на минимальный элемент исходного массива.
Rifler вне форума Ответить с цитированием
Старый 14.04.2009, 16:32   #2
Min
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 239
По умолчанию

Код:
.model	small
.stack	100h
.data

 MaxLen db 5
 Len db 0
 buff db 5 dup (0)
 minus db 0
mas db 7 dup (0)
sum db 0
min db 7Fh

ErrInpMsg db 'Error Input!!!',13,10,'$'
InpMsg db 'Input '
Count db 0,' element (-128..127) :',13,10,'$'
Otvet db 'Otevet:     $'

.code
start:
mov	ax,@data
mov	ds,ax
mov	es,ax
xor	ax,ax

call input
call Do
call output

mov ah,8
int 21h

mov	ax,4c00h
int	21h

input proc
xor di,di
mov cx,7
inputLoop:
call inputEl
inc di
loop inputLoop
ret
endp

inputEl proc
push cx
inputElMain:
mov mas[di],0
call InputMsg
mov ah,0Ah
mov dx,offset MaxLen
int 21h

mov dl,10
mov ah,2
int 21h

cmp Len,0
je errInputEl

mov minus,0
xor bx,bx
mov bl,Len
mov si,offset Len
add si,bx
mov bl,1


xor cx,cx
mov cl,Len
inputElLoop:
std
lodsb
call checkSym
cmp ah,1
je errInputEl
cmp ah,2
je nextSym
sub al,'0'
mul bl
test ah,ah
jnz errInputEl
add mas[di],al
jo errInputEl
js errInputEl

mov al,bl
mov bl,10
mul bl
test ah,ah
jz ElNextCheck
cmp ah,3
jne errInputEl
ElNextCheck:
mov bl,al
jmp nextSym
errInputEl:
call ErrorInput
jmp inputElMain
nextSym:
loop inputElLoop
cmp minus,0
je exitInputEl
neg mas[di]
exitInputEl:
pop cx
ret
endp

checkSym proc
cmp al,'-'
je minusSym
cmp al,'9'
ja errCheckSym
cmp al,'0'
jb errCheckSym
jmp exitCheckGood
minusSym:
cmp si,offset Len
je exitWithMinus
errCheckSym:
mov ah,1
jmp exitCheckSym
exitWithMinus:
mov ah,2
mov minus,1
cmp Len,1
je errCheckSym
jmp exitCheckSym
exitCheckGood:
xor ah,ah
exitCheckSym:
ret
endp

ErrorInput proc
mov dx,offset ErrInpMsg
mov ah,9
int 21h
ret
endp

InputMsg proc
mov ax,di
add al,'0'
mov Count,al
mov ah,9
mov dx,offset InpMsg
int 21h
ret
endp

DoEl proc
mov ah,min
cmp mas[di],ah
jnl notNewMin
mov ah,mas[di]
mov min,ah
notNewMin:
cmp mas[di],-5
jl notSum
cmp mas[di],15
jg notSum
mov ah,mas[di]
add sum,ah
notSum:
ret
endp

Do proc
xor di,di
mov cx,7
DoLoop:
call DoEl
inc di
loop DoLoop
ret
endp

output proc
mov di,offset Otvet+11
mov minus,0
mov bl,10
mov al,sum
imul min
test ax,ax
jns notMinusOut
mov minus,1
neg ax
notMinusOut:
div bl
xchg ah,al
add al,'0'
std
stosb
sub al,'0'
xchg ah,al
xor ah,ah
test al,al
jz CheckForMinus
jmp notMinusOut
CheckForMinus:
cmp minus,0
je endOutput
mov al,'-'
std
stosb
endOutput:
mov ah,9
mov dx,offset Otvet
int 21h
ret
endp

end	start
Надо бы избавиться от привычки ставить многоточие.....
Min вне форума Ответить с цитированием
Старый 16.04.2009, 08:57   #3
Min
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 239
По умолчанию

мдэ..... походу зря решал
Надо бы избавиться от привычки ставить многоточие.....
Min вне форума Ответить с цитированием
Старый 16.04.2009, 12:35   #4
Rifler
Пользователь
 
Регистрация: 15.12.2007
Сообщений: 44
По умолчанию

ДА нет, спасибо канечно, только чтот длинная получилась прога. Это из-за того, что нужно вводить значения с клавы и выводить результат на экран?

Я вот написал середину, где без ввода с клавы и вывода на экран. Не знаю, может где со знаками напутал))
Код:
SST SEGMENT STACK '' STACK ''
  dw 20 dup (?)
SST ENDS

DATS SEGMENT
mas dw 7 dup (0)
min dw 0

SUM dw 0
DATS ENDS

CODS SEGMENT
     ASSUME SS:SST, DS:DATS, CS:CODS
     NN: mov Ax, DATS
         mov DS, Ax
;ищем мин элемент
         mov ax, mas[0]
         mov cx, 6
         mov si, 2
    m1:  cmp ax, mas[si]
         jnb m2
         mov ax, mas[si]
    m2:  inc si
         inc si
         loop m1
         mov min, ax

; складываем
         mov cx, 7
         mov si, 0
    m3:  cmp mas[si], -5
         jb m4
         cmp mas[si], 15
         ja m4
         add sum, mas[si]
    m4:  inc si
         inc si
         loop m3
         imul sum ; и умножаем мин элемент на сумму

         mov AH, 4CH
         INT 21H
CODS ENDS
     END NN
Что мне еще добавить нужно?
Rifler вне форума Ответить с цитированием
Старый 16.04.2009, 13:16   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Rifler
Думаю тебе было бы легче если бы ты написал сначала ввод массива.
Ведь прямо при вводе ты можеш вычислять минимальный элемент и сумму в указанном диапазоне.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.04.2009, 15:22   #6
Min
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 239
По умолчанию

ja и jb работают только с неотрицательными числами. Для отрицательных нужно использовать jg и jl.
В моём листинге все это в процедурах DoEl и Do.
Кстати действительно самое геморное в проге это ввод (отрицательные числа и все такое).
Надо бы избавиться от привычки ставить многоточие.....
Min вне форума Ответить с цитированием
Старый 16.04.2009, 21:37   #7
Rifler
Пользователь
 
Регистрация: 15.12.2007
Сообщений: 44
По умолчанию

Min, а остальное правильно?

У тебя ввод осуществляется в процедуре InputMsg?
Rifler вне форума Ответить с цитированием
Старый 17.04.2009, 03:07   #8
Min
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 239
По умолчанию

InputMsg - это просто вывод приглашения на ввод. сам ввод в процедурах input и inputEl
И в конце лучше сделать:
Код:
mov ax,4C00h
int 21h
Надо бы избавиться от привычки ставить многоточие.....
Min вне форума Ответить с цитированием
Старый 03.09.2010, 08:22   #9
skef
Новичок
Джуниор
 
Регистрация: 03.09.2010
Сообщений: 1
По умолчанию

помогите пожалуйста, у меня похожее задание.
увидел этот исходник выше, и наверняка он сможет мне помочь.
однако в исходнике (2 сообщение в теме) нет ни одного комментерия, и непонятно, что там делается.

По запросу программы пользователь вводит с клавиатуры
последовательность целых трехзначных положительных десятичных чисел,
разделенных пробелами. Ввод последовательности заканчивается нажатием <Enter>.
Программа выводит эти же числа на экран в порядке возрастания величины числа,
причем в шестнадцатеричной системе счисления.

и вот как я это собирался сделать:
программа выводит текст введите числа
пользователь вводит числа, они отображаются, преобразуются в шестнадцатиричную форму.
по пробелу они запоминаются (массив). далее пользователь нажимает <Enter>,
и программа вычисляет наименьшее из массива.
далее это число удаляется из массива и вычислятся следующее число.
т.о. выводся в порядке возрастания.
пока написал вот что:
Код:
;======================================================================
.model small ;определили модель памяти как small
.stack 128 ;выделели под программу 128 байт памяти
.data ;объявили сегмент данных
;mess db 'Hi man!$' ;определили переменную типа databyte размером 1 байт
next db '', 0Dh, 0Ah, '$'   ;определили переменную типа databyte размером 1 байт
mess db 'vvedite chisla?', 0Dh, 0Ah, '$'   ;определили переменную типа databyte размером 1 байт
endpr db 'end program', 0Dh, 0Ah, '$'
db    0Dh,0Ah,24h
.code ;объявили сегмент кода
main:
;следующими двумя строками мы связываем адрес сегмента данных с его реальным расположением в памяти.
;Это связано с тем, что сегмент кода и сегмент данных расположены по одному и тому же
;адресу в памяти при инициализации программы.
;Т.е. если этого не сделать, то мы получим полную ерундистику и не рабочую программу.
mov ax,@data
mov ds,ax
;следующие три строки кода выводят на экран надпись "введите строки?"
lea dx,mess
mov ah,09h
int 21h
;======================================================================
;следующие две строчки кода представляют собой задержку, а-ля "Press any key to exit"
;mov ah,00h
;int 16h
;Repeat:
in_out: mov ah,0 ; Ожидаем нажатия и
int 16h ; читаем код клавиши
mov bl,al ; Сохраняем код
mov ah,0eh ; Выводим символ
int 10h ; на экран
cmp bl,' ' ; Если не нажата клавиша
jne in_out ; пробел, повторяем ввод

;перевод курсора на следующую строку
lea dx,next
mov ah,09h
int 21h

;cmp bl,13             ; это клавиша ENTER?
;je     enter          ; да, выполняем эхоотображение
;jmp in_out
;перевод курсора на следующую строку
lea dx,next
mov ah,09h
int 21h

lea dx,endpr
mov ah,09h
int 21h

out_prog:
;собственно последние две строчки корректно завершают программу
mov ax,4c00h
int 21h
end main

Последний раз редактировалось Stilet; 03.09.2010 в 08:55.
skef вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ввод размерности масива с клавиатуры 111111 Общие вопросы C/C++ 3 29.12.2008 08:54
Ввод с клавиатуры без остановки программы ActioNs Общие вопросы C/C++ 1 25.12.2008 04:40
Ввод чисел с клавиатуры SAVIK Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 19 26.05.2008 12:54
ввод данных с клавиатуры juden Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 07.05.2008 18:05