Поменять регистр в буквах вводимой строки - Assembler
Формулировка задачи:
Помогите, пожалуйста, с программой.
Нужно использовать упрощенный директивы сегментации, написать и забить в com-файл прогу, меняющую регистр в буквах вводимой строки.
В принципе, все написано, но есть ошибки:
1) количество символов (2-й элемент в введенной через 0Ah DOS функцию строке) не записывается в регистр CX.
2)какая-то ошибка в конце программы со start.
3)проблемы c изменением сегмента данных: @data не определяется.
Не судите строго, до этого только с Debug'ом дело имел. Компилировал в MASM'е.
.model small
.data
string db 20,?,20 dup ('$')
.code
org 100h
start:
mov ax, @data
mov ds, ax
lea dx, string % ввод строки
mov ah, 0Ah
int 21h
mov cx, [string + 1] % запись реальной длины строки в счетчик CX
lea bx, string + 2 % запись адреса первого элемента введенной строки в счетчик BX
call symbol_process % проход по строке
mov ah, 4Ch %
int 21h
symbol_process:
mov dl,byte ptr [BX] % посимвольное считывание строки в регистр
cmp dl,7bh % сравнение кода символа с диапазонами прописных букв, строчных букв и остальных символов в ASCII-таблице
jge output
call stroch1
cmp dl, 5bh
jge output
call zaglav1
cmp dl,41h
jl output
ret
stroch1:
cmp dl,61h
jge stroch2
ret
stroch2:
sub dx,20h % делает букву прописной
call output
ret
zaglav1:
cmp dl,41h
jge zaglav2
ret
zaglav2:
add dx,20h % делает букву строчной
call output
ret
output: % вывод символа и переход к следующему символу
mov ah, 2h
int 21h
inc bx
loop symbol_process
ret
end startРешение задачи: «Поменять регистр в буквах вводимой строки»
textual
Листинг программы
;fasm code
;-----------------
org 100h
jmp start
mess0 db 13,10,'String: $'
mess1 db 13,10,'Result: '
buff db 80 dup('$') ; буфер для строки
start: mov ah,9 ; запрос на ввод
mov dx,mess0
int 21h
mov di,buff ; приёмник для строки
mov ah,1 ; ввод с эхом
input: int 21h
cmp al,13 ; Enter - закончить ввод
je stop
mov bl,al ; символ в BL
sub bl,41h ;
cmp bl,7Fh ; фильтр только символов
ja next ; если цифры или знаки
xor al,20h ; инверсия регистра символа!
next: stosb ; записать символ в буфер
jmp input ; на повтор..
stop: mov ah,9 ; выводим результат на экран
mov dx,mess1
int 21h
xor ax,ax ; выход в DOS
int 16h
int 20h
Объяснение кода листинга программы
На языке Assembler был написан код, который выполняет следующие действия:
- Запрос на ввод строки - пользователь вводит строку в буфер buff.
- Проверка на завершение ввода - если пользователь нажимает Enter, код переходит к этапу stop.
- Фильтрация символов - из буфера buff удаляются все символы, кроме цифр и знаков.
- Инверсия регистра символа - каждый символ в буфере buff инвертируется.
- Вывод результата на экран - на экран выводится результат в формате
Result:с инвертированными символами. - Выход в DOS - программа завершается.