Задача: Написать на языке ассемблер com-программу, которая выведет на экран "Input string". После введения строки необходимо все прописные буквы перевести в строковые, а строковые в прописные.
Проблема: Я перевожу маленькие в большие, но не могу сделать так, что бы переводить большие в маленькие. Помогите пожалуйста.
.model tiny
.code
org 100h
.startup
mov dx, offset vvedite
mov ah,09h
int 21h ;запрос ввода строки
mov dx, offset stroka ;устанавливаем указатель на строку
mov ah,0ah
int 21h ;вводим строку
mov cx,[bx + 1] ;устанавливаем счетчик
lst: ;начало цикла
mov di,cx
cmp stroka [di + 1], 60h ;проверка, маленькая ли буква
jl next ;если большая - идем дальше
sub stroka [di + 1], 20h ;если маленькая - меняем ее
next:
loop lst ;переход на начало цикла
mov dx, offset stroka + 2 ;конец цикла, установить указатель на строку
mov ah,09h
int 21h
ret
stroka db 255 dup ("$")
vvedite db "vvedite stroku $"
end
Данный код только переводит все в заглавные буквы.
P.S Ассемблер не знаю
Другие языки программирования и технологии
Изменение маленьких букв на большие и наоборот - Assembler
Набацал, т. к. у Вас уже несколько ошибок. Работает и компилируется по крайней мере в TASM. Если нужны более подробные объясения - отвечу в комментах. com вообще обязательно было??
Можно чуть интереснее написать, но боюсь запутаетесь.
.model tiny
.code
org 100h
.startup
mov ah, 09h ; Вывод приглашения
mov dx, offset prompt
int 21h
mov ah, 0Ah ; Ввод строки
mov dx, offset buffer
int 21h
mov bx, dx ; bx = dx = началу буфера
inc bx ; bx = bx + 1 = байту с длиной строки
xor ch, ch ; ch = 0
mov cl, [bx] ; cl = длине => cx = длине строки
inc bx ; bx= bx +1 = началу строки
mov dx, bx ; dx = bx
@@next:
mov al, [bx] ; al = символу из строки
cmp al, 'A' ; если он меньше чем A - пропускаем
jb @@skip
cmp al, 'z' ; если он больше чем z - пропускаем
ja @@skip
cmp al, 'Z' ; если он меньше Z (диапазон A-Z) - идем менять
jbe @@save
cmp al, 'a' ; если он все ещё меньше a - значит _между_ [A..Z] и [a..z] - пропускаем
jb @@skip
@@save:
xor byte ptr [bx], 20h ; инвертируем бит (строчные в заглавные, заглавные в строчные)
@@skip:
inc bx ; двигаемся на след. символ
loop @@next ; cx=cx-1, выйдем из цикла при cx = 0
mov byte ptr [bx],'$' ; сохраняем в конец буфера признак конца строки
mov ax, 0003h ; очищаем экран
int 10h
mov ah, 09h ; выводим полученную строку (в dx до сих пор начало строки)
int 21h
ret ; Выходим
buffer db 100, 101 dup(0) ; буфер под строку
prompt db 'Enter a string:','$' ; приглашение ввода.
end
Можно чуть интереснее написать, но боюсь запутаетесь.
.model tiny
.code
org 100h
.startup
mov ah, 09h ; Вывод приглашения
mov dx, offset prompt
int 21h
mov ah, 0Ah ; Ввод строки
mov dx, offset buffer
int 21h
mov bx, dx ; bx = dx = началу буфера
inc bx ; bx = bx + 1 = байту с длиной строки
xor ch, ch ; ch = 0
mov cl, [bx] ; cl = длине => cx = длине строки
inc bx ; bx= bx +1 = началу строки
mov dx, bx ; dx = bx
@@next:
mov al, [bx] ; al = символу из строки
cmp al, 'A' ; если он меньше чем A - пропускаем
jb @@skip
cmp al, 'z' ; если он больше чем z - пропускаем
ja @@skip
cmp al, 'Z' ; если он меньше Z (диапазон A-Z) - идем менять
jbe @@save
cmp al, 'a' ; если он все ещё меньше a - значит _между_ [A..Z] и [a..z] - пропускаем
jb @@skip
@@save:
xor byte ptr [bx], 20h ; инвертируем бит (строчные в заглавные, заглавные в строчные)
@@skip:
inc bx ; двигаемся на след. символ
loop @@next ; cx=cx-1, выйдем из цикла при cx = 0
mov byte ptr [bx],'$' ; сохраняем в конец буфера признак конца строки
mov ax, 0003h ; очищаем экран
int 10h
mov ah, 09h ; выводим полученную строку (в dx до сих пор начало строки)
int 21h
ret ; Выходим
buffer db 100, 101 dup(0) ; буфер под строку
prompt db 'Enter a string:','$' ; приглашение ввода.
end
Rovshan Sultanov
БОЛЬШОЕ СПАСИБО!
А какая нам разница, большая буква или маленькая, если нам надо изменить значение всего одного бита? Зачем вообще что-то сравнивать, если достаточно пройтись по строке и "опрокинуть" этот бит?
mov cx,[bx + 1] ;устанавливаем счетчик
lst: ;начало цикла
mov di,cx
xor stroka[di+1],20h ; опрокидываем этот бит. Если был 0, станет 1, и наоборот.
loop lst ;переход на начало цикла
Попробуйте такой вариант. Напишите, что получилось.
Если в строке были не буквы, то они убьются, но это уже детали. Потом для красоты можете сделать проверку, что символ попадает в нужный диапазон.
mov cx,[bx + 1] ;устанавливаем счетчик
lst: ;начало цикла
mov di,cx
xor stroka[di+1],20h ; опрокидываем этот бит. Если был 0, станет 1, и наоборот.
loop lst ;переход на начало цикла
Попробуйте такой вариант. Напишите, что получилось.
Если в строке были не буквы, то они убьются, но это уже детали. Потом для красоты можете сделать проверку, что символ попадает в нужный диапазон.
Похожие вопросы
- Заменить в строке все заглавные буквы в строчные и наоборот c++
- Assembler или C для микроконтроллеров?
- Assembler помогите создать файлы *.obj *.exe
- какой язык легче выучить.C++ или Assembler? какой язык легче выучить.C++ или Assembler?
- Подскажите, правильно ли? assembler
- Assembler. HEEEEEEEEEEEEELP! дан одномерный массив найти количество и сумму нечетных элементов assembler
- Скажите мне истинные программисты, стоит ли изучать Assembler, если ты знаешь другие ЯП?
- Как написать программу для assembler (ассемблер)?
- Нужно ли учить assembler или лучше потратить время на изучение высокоуровневых языков?
- c++ в словах, которые начинаются и заканчиваются одной и той же буквой, послед и первая буква должны стать большими