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