Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 03.01.2016
Сообщений: 53
1

Ошибка в программе по замене символов

12.09.2017, 16:11. Показов 1291. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Ребята, подскажите что не так начинающему. Изучаю язык самостоятельно, писал программу для задания по лабораторной работе (/ заменить на \, все заглавные строчными). Не получается заменить / на \, не понимаю, что не так.

Код:

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
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
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.09.2017, 16:11
Ответы с готовыми решениями:

Найти сумму кодов символов не принадлежащих замене
Помогите найти сумму кодов символов не принадлежащих замене Вот написала программу, а как...

Программе по замене одного символа на группу символов.
Сложите программу, которая каждую букву "а", которая встречается в тексте, заменяет на группу...

Ошибка в программе (поиск и вывод символов)
Есть следующий код программы: #include "stdafx.h" #include <iostream> #include <fstream> int...

Программа по замене символов в строке
Здравствуйте! Нужно написать программу на языке java, которая в введенной пользователем строке...

2
3406 / 1825 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
12.09.2017, 17:41 2
Лучший ответ Сообщение было отмечено chester28rus как решение

Решение

1)используйте упрощенные директивы описания сегментов .CODE, .DATA, .STACK N, предварительно указав модель .MODEL SMALL. Полное описание сегментов уже "устарело" и современные компиляторы сами определят настройки по умолчанию и не нужно будет использовать ASSUME, да и описаны они не полностью
2)для стека минимум нужно 256 байт.
3)значение регистра СХ для команды LOOP MT1?
4)
Assembler
1
2
3
4
CMP AH, byte ptr '/' ;сравнение AH с /
JB MT2 ;переход 
CMP AH, byte ptr '/' ;сравнение AH c /
JA MT2 ;переход
Команды JZ/JNZ не существует?

Добавлено через 52 минуты
Переделал, убрал с помощью комментариев все, что не нужно.

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
TITLE l5 - ЗАМЕНА / на \, ВСЕ ЗАГЛАВНЫЕ СТРОЧНЫМИ
;---------------------------------------------------------------------------------------
.model small
.DATA;;;SG SEGMENT PARA
VAR DB ' Вариант №7 ' ,13,10,' ------------',13,10,'$' 
VARR    DB ' Исходный текст ' ,13,10,' ----------------',13,10,'$' 
TEXTT   DB  ' /The capital of the country is London./'
szTExtt equ $-TEXTT
    db  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,'$'
;тут нужно было бы использовать механизм с EQU выше, но так как строки одинаковые :)
;;;DATASG   ENDS
 
.STACK  256;;;;SG SEGMENT 'Stack'   
;DB 27 DUP(?)
;STACKSG ENDS
 
;ASSUME SS:STACKSG, CS:CODESG, DSATASG
 
.CODE;;;;SG SEGMENT PARA 'Code' 
BEGIN   PROC FAR
;--------------------------------------------------------------------------------------;    
;   MOV AH, 00H;AH  ; функция задания режима экрана
;   MOV AL, 03H;AL  ; ЦВ текстовый, 25 строк по 80 знаков
    mov ax,3;-1 byte
    INT 10H 
 
;--------------------------------------------------------------------------------------;
;   PUSH DS ;в стек
;   SUB AX,AX ;обнуляем AX 
;   PUSH AX ;AX в стек
    MOV AX, @DATA;;;;SG  ATASG в AX 
    MOV DS, AX ;AX В DS 
    LEA BX, MYTEXT ;вывод MYTEXE в BX
    MOV CX, szTextt ;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, '/' ;сравнение AH с /
    jnz 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 '\' ;преобразовать '/' в '\' 
    mov 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  ATASG в AX 
;MOV DS, AX ;AX В DS 
    LEA BX, MYTEXT ;вывод MYTEXE в BX
    MOV CX, szTextt ;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
    xor ax,ax
    int 16h ;
;------------------------------------------------------------- 
    MOV AX,4C00H    ;   
    INT 21H ; 
 
;CODESG ENDS
END BEGIN
Цитата Сообщение от Constantin Cat Посмотреть сообщение
)значение регистра СХ для команды LOOP MT1?
увидел, но использовать СХ, так далеко от цикла и после кучи прерываний плохо, т.к. некоторые из них портят этот регистр.
1
0 / 0 / 0
Регистрация: 03.01.2016
Сообщений: 53
13.09.2017, 03:57  [ТС] 3
Большое спасибо, очень информативно!
0
13.09.2017, 03:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.09.2017, 03:57
Помогаю со студенческими работами здесь

Программа по замене символов, исправить код
Написал такую вот программку... не судите сильно строго я только учусь! Добавлено через 1 минуту...

Найти ошибку в коде программы по замене символов в строке
Здравствуйте! Пытался написать программу, которая в введенной пользователем строке заменяет все...

ошибка в замене
нужно найти среднюю длину и заменить нею слова последней строки. выходит ошибка скажите что я...

Ошибка в замене символа
Здравствуйте,у меня ошибка в замене символа в строке.Программа компилируется но не заменяет символ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru