Помогите, пожалуйста, написать программу для замены первого и последнего символа строки из 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
;============================================
Другие языки программирования и технологии
FASM. Замена символов в строке, используя подпрограммы.
> строки из 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
> Исходные данные, необходимые для работы программы: строки,. . вводятся по запросу программы с клавиатуры.
Одно противоречит другому. Что делать, если пользователь введёт строку короче или длиннее 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
Такой вариант:


Похожие вопросы
- замена слов в строках С++
- Delphi получить scancode символа из строки 2
- замена слов в строке в СИ
- BAT/CMD Подскажите, какой символ или команду использовать? С командой else у меня ни чего не выходит...
- Сколько символов можно закодировать, используя UNICODE? (информатика)
- Fasm, вызов WinAPI функций
- простейший код в Делфи: проверка строки на корректность символов
- Имеется 1500 строк с названиями файлов в формате txt, какой программой можно определить строки где символов больше?
- Простая задача на FASM (ассемблер) помогите 3 дня мучаюсь!!!
- Програма на С++ Ввести с клавиатуры строку символов и перевернуть каждое четное слово в строке.