Ошибка в программе по замене символов - Assembler
Формулировка задачи:
Ребята, подскажите что не так начинающему. Изучаю язык самостоятельно, писал программу для задания по лабораторной работе (/ заменить на \, все заглавные строчными). Не получается заменить / на \, не понимаю, что не так.
Код:
TITLE l5 - ЗАМЕНА / на \, ВСЕ ЗАГЛАВНЫЕ СТРОЧНЫМИ
;---------------------------------------------------------------------------------------
DATASG SEGMENT PARA
VAR DB ' Вариант №7 ' ,13,10,' ------------',13,10,'$'
VARR DB ' Исходный текст ' ,13,10,' ----------------',13,10,'$'
TEXTT DB ' /The capital of the country is London./' ,13,10, ' ---------------------------',13,10,'$'
VAR_1 DB 'a) Zamenit vse / na \' ,13,10,'$'
VAR_2 DB 'b) Zamenit vse zaglavnye strochnymi' ,13,10,'$'
MYTEXT DB '/The capital of the country is London./' ,13,10, '----------------------------',13,10,'$'
DATASG ENDS
STACKSG SEGMENT 'Stack'
DB 27 DUP(?)
STACKSG ENDS
ASSUME SS:STACKSG, CS:CODESG, DS:DATASG
CODESG SEGMENT PARA 'Code'
BEGIN PROC FAR
;--------------------------------------------------------------------------------------;
MOV AH, 00H;AH ; функция задания режима экрана
MOV AL, 03H;AL ; ЦВ текстовый, 25 строк по 80 знаков
INT 10H
;--------------------------------------------------------------------------------------;
PUSH DS ;в стек
SUB AX,AX ;обнуляем AX
PUSH AX ;AX в стек
MOV AX, DATASG ;DATASG в AX
MOV DS, AX ;AX В DS
LEA BX, MYTEXT ;вывод MYTEXE в BX
MOV CX, 20H ;20H в CX резервируем память в CX
;-----------------------------------------------------------------------------------;
LEA DX,VAR ;вывод варианта
MOV AH, 09H ;вывод на экран
INT 21H ;прерывание 21H
;-----------------------------------------------------------------------------------;
LEA DX,VARR ;вывод VARR
MOV AH, 09H ;вывод на экран
INT 21H ;прерывание 21H
LEA DX,TEXTT ;вывод TEXTT
MOV AH, 09H ;вывод на экран
INT 21H ;прерывание 21H
LEA DX,VAR_1 ;вывод VAR_1
MOV AH, 09H ;вывод на экран
INT 21H ;прерывание 21H
;-----------------------------------------------------------------------------------;
MT1: MOV AH, [BX] ;BX т.е текст MYTEXT В AH побайтно
CMP AH, byte ptr '/' ;сравнение AH с /
JB MT2 ;переход
CMP AH, byte ptr '/' ;сравнение AH c /
JA MT2 ;переход
CALL COR ;вызов проседуры COR
MT2: INC BX ;увеличиваем BX на 1
LOOP MT1 ;цикл со счетчиком если 1 то на метку MT1 иначе дальше
LEA DX, MYTEXT ;вывод MYTEXE
MOV AH, 09H ;вывод на экран
INT 21H ;прерывание 21H
JMP WERT ;безусловный переход на WERT
;----------------------------------------------------------------------------;
RET ;выход из проседуры
BEGIN ENDP ;конец процедуры
COR PROC NEAR ;процедура COR
NOP ;нет операции
;ADD AH,byte ptr '\' ;преобразовать '/' в '\'
AND AH, 0DFH;0DFH ;логическое умножение
MOV [BX], AH ;AH в BX
RET ;выход из процедуры
COR ENDP
;----------------------------------------------------------------------------;
;----------------------------------------------------------------------------;
WERT:
BEGINN PROC FAR
PUSH DS ;в стек
SUB AX,AX ;обнуляем AX
PUSH AX ;AX в стек
MOV AX, DATASG ;DATASG в AX
MOV DS, AX ;AX В DS
LEA BX, MYTEXT ;вывод MYTEXE в BX
MOV CX, 20H ;10H в CX резервируем память в CX
;-----------------------------------------------------------------------------------;
LEA DX,VAR_2 ;вывод VAR_2
MOV AH, 09H ;вывод на экран
INT 21H ;прерывание 21H
;-----------------------------------------------------------------------------------;
MTT1: MOV AH, [BX] ;BX т.е текст MYTEXT В AH побайтно
CMP AH, 41H;61H ;сравнение AH с A-большой англиское
JB MTT2 ;переход по сравнению
CMP AH, 5AH;7AH ;сравнение AH c Z-большой англиское
JA MTT2 ;переход по сравнению
CALL CORR ;вызов проседуры CORR
MTT2: INC BX ;безусловный переход на BX
LOOP MTT1 ;цикл со счетчиком если 1 то на метку MT1 иначе дальше
LEA DX, MYTEXT ;вывод MYTEXE
MOV AH, 09H ;вывод на экран
INT 21H ;прерывание 21H
JMP TREW
;----------------------------------------------------------------------------;
RET ;
BEGINN ENDP ;
CORR PROC NEAR ;
NOP ;
ADD AH,20H ;
;AND AH, 0DFH;0DFH ;
MOV [BX], AH ;
RET ;
CORR ENDP
;-------------------------------------------------------------
TREW:
mov ax,00h
int 16h ;
;-------------------------------------------------------------
MOV AX,4C00H ;
INT 21H ;
CODESG ENDS
END BEGINРешение задачи: «Ошибка в программе по замене символов»
textual
Листинг программы
CMP AH, byte ptr '/' ;сравнение AH с / JB MT2 ;переход CMP AH, byte ptr '/' ;сравнение AH c / JA MT2 ;переход
Объяснение кода листинга программы
- Сравнивается значение переменной AH с символом '/'.
- Название переменной: AH
- Значение переменной: '/'
- Если значение переменной AH меньше символа '/', то происходит переход на метку MT2.
- Сравнивается значение переменной AH с символом '/'.
- Название переменной: AH
- Значение переменной: '/'
- Если значение переменной AH больше символа '/', то происходит переход на метку MT2.