Другие языки программирования и технологии

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
Рустам Мукушев
Рустам Мукушев
51 590
Лучший ответ
Такой вариант:
Pro100 Tolik
Pro100 Tolik
682