Поменять регистр в буквах вводимой строки - 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 - программа завершается.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д