Другие языки программирования и технологии

Изменение маленьких букв на большие и наоборот - Assembler

Задача: Написать на языке ассемблер 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 Ассемблер не знаю
RS
Rovshan Sultanov
1 289
Набацал, т. к. у Вас уже несколько ошибок. Работает и компилируется по крайней мере в 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
Арсен Саруханян
Арсен Саруханян
84 764
Лучший ответ
Rovshan Sultanov БОЛЬШОЕ СПАСИБО!
А какая нам разница, большая буква или маленькая, если нам надо изменить значение всего одного бита? Зачем вообще что-то сравнивать, если достаточно пройтись по строке и "опрокинуть" этот бит?

mov cx,[bx + 1] ;устанавливаем счетчик
lst: ;начало цикла
mov di,cx
xor stroka[di+1],20h ; опрокидываем этот бит. Если был 0, станет 1, и наоборот.
loop lst ;переход на начало цикла

Попробуйте такой вариант. Напишите, что получилось.
Если в строке были не буквы, то они убьются, но это уже детали. Потом для красоты можете сделать проверку, что символ попадает в нужный диапазон.
Rovshan Sultanov Чесно, сказать)

Я даже не знаю куда его вставить/заменить)