Консультация № 158872
27.01.2009, 02:22
0.00 руб.
0 4 1
Здравствуйте, уважаемые эксперты!!!! Мне очень нужна ваша помощь,в решении следующей задачи:" Написать программу,читающую текст из стандартного потока ввода(с клавиатуры) и выдающую в поток стандартного вывода (на экран), такой же текст, при этом заменяя символ "*" строчкой "<star>". Для ввода/вывода и завершения программы использовать системные вызовы. При возникновении ситуации "конец файла"(то есть когда вызов read вернет через регистр eax значение [$8709$]) завершить программу."
Я буду Вам очень благодарна за предоставленную попытку мне помочь.

Обсуждение

давно
Посетитель
7438
7205
27.01.2009, 09:28
общий
Что Вы понимаете под системными вызовами?
Как будет возникать ситуация "конец файла"? После нажатия на ESC, Ctrl-Z или еще как?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
28.01.2009, 10:49
общий
это ответ
Здравствуйте, Alenywka!
Надеюсь, Вас устроит программа в приложении.
Конец ввода по нажатию на Enter, кроме того игнорируются расширенные клавиши (F1-F12, Home и др) и непечатаемые символы (с кодом < 20h)
Если что непонятно или что-то не так, милости просим в мини-форум
Удачи!

Приложение:
;star.asm
;tasm star
;tlink star /t

.model tiny ;Будем формировать COM-файл
.data
star db '<star>',0
.code
.startup
MLoop:
call GetSymbol ;Вводим символ
test ax, ax ;Конец ввода - Enter
jz Finish
call PrintSymbol ;Выводим, проверяя на *
jmp MLoop
Finish:
mov ax,4c00h
int 21h

GetSymbol proc
mov ah, 7 ;Нефильтрованный ввод с консоли без эхо
int 21h
cmp al, 0 ;Расширенные клавиши (F1-F12, Insert, Home,...) пропускаем
jne GSNext
mov ah, 7 ;Они идут двумя байтами, заберем второй
int 21h
jmp GetSymbol
GSNext:
cmp al, 0dh ;Enter - конец ввода
je GSLast
cmp al, ' ' ;Непечатаемые символы тоже пропускаем
jb GetSymbol
jmp GSRet
GSLast:
xor ax, ax ;Признак конца ввода
GSRet:
ret
GetSymbol endp

PrintSymbol proc
cmp al, '*'
jne PSPrint ;не * просто на вывод
lea si, star ;* меняем на <star>
PSLoop:
lodsb
cmp al, 0 ;строка заканчивается 0
je PSRet
call PSPrint
jmp PSLoop
PSPrint:
mov dl, al ;выводим один символ
mov ah, 2
int 21h
PSRet:
ret
PrintSymbol endp

end
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
28.01.2009, 17:42
общий
Спасибо вам большое. А каким транслятором я могу запустить эту программу? nasm например подойдет?Я совершенно ничего не понимаю в ассемблере,а хотелось бы...... мне это необходимо в учёбе.
давно
Посетитель
7438
7205
29.01.2009, 02:42
общий
В приложении же написано: tasm
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа