Танюшка
Танюшка

FASM. Замена символов в строке, используя подпрограммы.

Помогите, пожалуйста, написать программу для замены первого и последнего символа строки из 10 байтов на произвольный символ. Вывести на экран исходную строку и преобразованную. Формат программы «COM». Использовать косвенную адресацию со смещением. Вызов подпрограмм ближний.

Разработать программу в COM формате. Используя подпрограммы, разделите программу на подсистемы: ввода, исполнения, вывода. Коды, необходимые для подсистем вывода и ввода передаются через стек. Исходные данные, необходимые для работы программы: строки, контрольные символы вводятся по запросу программы с клавиатуры.

-------------------------------------------------------------
СOM-программа, выводящая сообщение, затем завершающая работу, после нажатия произвольной клавиши.
-------------------------------------------------------------
use16 ;Компиляция 16 битного кода
org 100h ;Учесть PSP - 256 байт
;============================================
jmp begin ;Адрес первой команды программы
mes db 'Hello World !',10,13,'$' ;Строка данных
;============================================
begin: ;Адрес первой команды
mov AH,09 ;Вывод строки
mov DX,mes
int 21h
;============================================
mov AH,08 ;Ждать нажатия любой клавиши
int 21h
mov AX,4C00h ;Завершить работу программы
int 21h
;============================================

ЕК
Елена К

> строки из 10 байтов
> Исходные данные, необходимые для работы программы: строки,. . вводятся по запросу программы с клавиатуры.
Одно противоречит другому. Что делать, если пользователь введёт строку короче или длиннее 10 символов? Блокировать завершение ввода, усекать/дополнять пробелами или что?

Программа формата com, FASM. Аргументы передаются через стек, соглашение о вызове - stdcall 16-разрядный вариант, вызовы ближние, косвенная адресация со смещением используется чуть меньше, чем везде.
На ввод пользователем строки длиной меньше или больше 10 символов программа реагирует выводом сообщения об ошибке с предложением ввести строку снова.

use16
org 100h
Begin:
push StringPrompt
call WriteLine
push Buffer
call ReadLine
cmp al,10
je Correct
push ErrorMessage
call WriteLine
jmp Begin
Correct:
xor cx,cx
mov cl,al
push CharPrompt
call WriteLine
call ReadChar
push Buffer+2
push cx
push ax
call Processing

push QuitPrompt
call WriteLine
call ReadKey
ret

Processing:
enter 0,0
push dx
push di
push bx
mov bx,[bp+8]
mov di,[bp+6]
mov byte [bx+di],'$'
push MessageOriginal
call WriteLine
push bx
call WriteLine
mov al,[bp+4]
mov [bx],al
mov [bx+di-1],al
push MessageCreated
call WriteLine
push bx
call WriteLine
pop bx
pop di
pop dx
leave
ret 6

WriteLine:
enter 0,0
push dx
push ax
mov dx,[bp+4]
mov ah,9
int 21h
pop ax
pop dx
leave
ret 2

ReadLine:
enter 0,0
push dx
push si
mov dx,[bp+4]
mov ah,0Ah
int 21h
mov al,10
int 29h
mov si,[bp+4]
mov al,[si+1]
pop si
pop dx
leave
ret 2

ReadChar:
mov ah,8
ReadChar1:
int 21h
test al,al
jnz ReadChar2
int 21h
jmp ReadChar1
ReadChar2:
cmp al,20h
jb ReadChar1
int 29h
ret

ReadKey:
xor ah,ah
int 16h
ret

StringPrompt db 'Введите строку из 10 символов: ',13,10,36
CharPrompt db 'Введите символ: $'
MessageOriginal db 13,10,10,'Введённая строка: ',13,10,36
MessageCreated db 13,10,'Преобразованная строка: ',13,10,36
ErrorMessage db 'Ошибка! $'
QuitPrompt db 13,10,10,'Для завершения работы нажмите любую клавишу... $'
Buffer db 255
rb 256

Наталья Алешкина
Наталья Алешкина

Такой вариант:

Похожие вопросы
Как узнать количество символов в строке на Javascript
Помогите удалить символы в строке!
Помогите! Скажите определения: Символ и Строка?
удаление символов в строке. СИ. СИ
как в с++ символ дописать к строке? как в с++ символ дописать к строке?
составить программу для нахождения периметра треугольника по заданным кординатамего вершин используя подпрограмму
как в Lua разделить строку на символы
Дана строка символов. Определить длину строки. Если длина строки <=20, то найти в строке порядковый номер символа *
Преобразование строк символов в Delphi
Разработать подпрограмму