Замена одной скобки на другую - Assembler
Формулировка задачи:
Здравствуйте, есть код программы которая в теории должно в заданном тексте менять все заглавные буквы на строчные (с чем она кстати прекрасно справляется). Но второе задание заменить все символы '(' на ')'. Увы, программа игнорирует это условие (JNE). При чем если изменить условие на равно (JE) программа почти все что есть меняет на ')' символ, помогите пожалуйста разобраться с кодом. Понимаю что, методы реализации скорее всего древние, но таковы условия.
Код:
; Резервируем область памяти для размещения переменных DATASG SEGMENT PARA ; Директива Byte (DB) определяет беззнаковый байт MYTEXT DB 'tEXt ex(AMP)le' ,13,10, '$' ; знак конца строки $ DATASG ENDS STACKSG SEGMENT 'Stack' DB 12 DUP(?) STACKSG ENDS CODESG SEGMENT PARA 'Code' BEGIN PROC FAR ;Настроим сегментные регистры ;SS-указывает на стек; CS-машинные команды, DS- на переменные ASSUME SS:STACKSG, CS:CODESG, DS:DATASG PUSH DS ;Корректное SUB AX,AX ;завершение PUSH AX ;программы. MOV AX, DATASG ;Инициализация MOV DS, AX ;сегментного регистра DS. LEA BX, MYTEXT ;Загрузим текущий адрес строки в регистр BX MOV CX, 10H ;Установим счетчик на 16 байт (символов) MT1: ;Начало цикла MOV AH, [BX] ;Загрузим в регистр символ из строки ;Перевод заглавных букв в строчные ;Кодировка заглавных букв идет от 41Н до 5AH (A...Z) CMP AH, 41H ;Сравним символ строки с ASCII кодом символа 'A' JB MT2 ;Если этот код меньше 'A' то переход CMP AH, 5AH ;Сравним символ строки с ASCII кодом символа 'Z' JA MT ;Если этот код больше 'Z' то переход ;Значит это заглавная буква CALL COR1 ;Переделаем ее в прописную MT: ;Сюда попадем если не найдем заглавную букву ;Замена '(' на ')' CMP AH, '(' ;Сравним символ строки JNE MT2 ;Если этот код не равен символу '(' то переход ;Значит это '(' CALL COR ;Процедура замены скобки MT2: ;Действие не требуется INC BX ;Перейдем к следующему символу строки NOP LOOP MT1 ;Повтор Цикла ;Вывод строки на экран LEA DX, MYTEXT ;в DX - адрес строки MOV AH, 09H ;Прерывание ДОС INT 21H ;для вывода на экран RET BEGIN ENDP ;Процедура замены скобки COR PROC NEAR ;Начало процедуры NOP MOV AH, ')' ;Переделаем скобку MOV [BX], AH ;Заменим символ RET COR ENDP ;Конец процедуры ;Процедура перевода заглавной буквы в прописную ;Процедура перевода заглавного символа в прописной COR1 PROC NEAR ;Начало процедуры NOP ADD AH,20H ;Переделаем заглавную букву в прописную MOV [BX], AH ;Заменим заглавный символ прописным RET COR1 ENDP ;Конец процедуры CODESG ENDS END BEGIN
Решение задачи: «Замена одной скобки на другую»
textual
Листинг программы
if(al>='A')&&(al<='Z') lowcase(al) else if(al>='a')&&(al<='z') highcase(al) else if(al=='(') al=')'
Объяснение кода листинга программы
- Проверка условия: если символ
al
больше или равен 'A' и меньше или равно 'Z'. - Вызов функции
lowcase
с аргументомal
. - Проверка условия: если символ
al
больше или равен 'a' и меньше или равно 'z'. - Вызов функции
highcase
с аргументомal
. - Проверка условия: если символ
al
равен ')'. - Замена символа
al
на '('.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д