Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 9
1

Не могу найти ошибку в сдвиге массива

11.06.2015, 11:09. Показов 461. Ответов 0
Метки нет (Все метки)

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

Постановка задачи:
1.Дан текст – непустая последовательность не длиннее ста символов. Признаком конца ввода является точка, в сам текст точка не входит. Проверить, удовлетворяет ли текст заданному условию. Если условие выполнено, преобразовать текст по одному правилу, в противном случае – по другому правилу. Преобразованный текст вывести на экран.
2.Если введенная последовательность символов состоит только из цифр, то обработку текста не производить, а распечатать соответствующее сообщение.
3.Проверяемое условие: текст не содержит иных символов, кроме цифр и прописных русских букв.
4.Первое правило преобразования: заменить каждую прописную русскую букву следующей за ней по алфавиту, букву Я менять на А.
5.Второе правило преобразования: циклически сдвинуть подмассив из последних К (константа, задается с клавиатуры) символов на три позиции вправо.



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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,SS:CODE  
    ORG 100h
START: jmp main     ; переход к основной программе
str1 DB 'Input string: $'
str2 DB 'Inter col symbol: $'
str3 DB 'DIGIT ONLY.$'
strBuf DB 101 DUP('$')
lenBuf DW 0
; п/п ввода строки
InpStr:
    mov bx,0        ; длина строки
l_is1:  
    mov ah,1
    int 21h
    mov strBuf[bx],al
    cmp al,'.'      ;сравниваем элемент массива ,
    je l_isRet      ; если "да ",то переход на метку
    inc bx          ;увеличим bx на 1
    cmp bx,100 
    jb l_is1        ; если меньше 100 ,то на метку
    mov strBuf[bx],'.'
l_isRet:
    mov dl,10       ; перевод строки
    mov ah,2
    int 21h
    ret
    
; п/п ввода двухзначного числа (константы К)
InpDigit:
    mov cx,0
l_id1:
    mov ah,8        ; считываем кнопку
    int 21h
    cmp al,13       ; нажата кнопка 'ввод' ?
    je l_idRet 
    sub al,'0'
    cmp al,9        ; это цифра?
    ja l_id1
    mov cl,al
    add al,'0'
    mov dl,al
    mov ah,2        ; выводим символ нажатой кнопки
    int 21h
l_id2:
    mov ah,8        ; считываем кнопку
    int 21h
    cmp al,13       ; нажата кнопка 'ввод' ?
    je l_idRet
    sub al,'0'
    cmp al,9        ; это цифра?
    ja l_id2
    mov dl,al
    mov ch,al
    add dl,'0'
    mov ah,2        ; выводим символ нажатой кнопки
    int 21h
    mov al,cl
    mov dl,10
    mul dl      ; умножаем al на 10
    mov ah,0
    add al,ch   
    mov cl,al       ; cl - число 0..99 
l_idRet:
    mov dl,10       ; перевод строки
    mov ah,2
    int 21h
    mov ah,0
    mov al,cl
    ret
; п/п проверки условия
Uslovie:
    mov bx,0        ; длина строки
    mov ah,0        ; записываем 0 в bx
l_u1:
    mov al,strBuf[bx]   ;заносим в регистр al значение bx
    cmp al,'.'      ; это конец строки?
    je l_uRetTrue
    cmp al,'0'      ; код символа < кода '0' ?
    jb l_uRetFalse
    cmp al,'9'      ; код символа <= кода '9' ?
    jbe l_u2 
    cmp al,128      ; код символа < кода 'А' ?
    jb l_uRetFalse
    mov ah,1        ; буквы есть
    cmp al,159      ; код символа > кода 'Я' ?
    ja l_uRetFalse  ; переходим на метку
l_u2:
    inc bx          ; увеличиваем bx на 1
    cmp bx,100
    jb l_u1
l_uRetTrue:
    cmp ah,1        ; в строке только цифры?
    je l_u3     ; переходим на метку
    mov al,2        ; только цифры
    ret
l_u3:
    mov al,1        ; условие выполнено
    ret
l_uRetFalse:
    mov al,0        ; условие не выполнено
    ret
; п/п первого правила преобразования  
Convert1:
    mov bx,0        ; длина строки
    mov ah,0
l_c1_1:
    mov al,strBuf[bx]
    cmp al,'.'      ; это конец строки?
    je l_c1Ret      ; если так,то переход на метку 
    cmp al,128      ; код символа < кода 'А' ?
    jb lc1_2        ;если меньше ,то переход на метку
    inc strBuf[bx]
    cmp strBuf[bx],159 ; было 'Я' ?
    jna lc1_2 
    mov strBuf[bx],128 ; записываем 'A'
lc1_2:  
    inc bx          ;увеличиваем bx на 1
    cmp bx,100      ; сравниваем элемент массива с 100
    jb l_c1_1       ; если меньше ,то переход на метку    
l_c1Ret:
    ret         ; выход из подпрограммы
Convert2:
    mov dx,offset str2  ; выводим "введите количество символов"
    mov ah,09h
    int 21h
    [B]call InpDigit    ; вызов подпрограммы ввода числа К-элементов подмассива для сдвига 
    mov bx,lenBuf   ; в bx запишем длину буфера
    cmp ax,bx       ; сравним bx с ax
    jae l_c2Ret     ; если больше или равно ,то переход на метку
    std         ;флаг направления сдвига
    mov si,offset strBuf ; адрес начала строки в si
    dec si          ;уменьшаем на 1
    add si,bx       ;добавляем  si к bx
    mov di,si
    add di,2        ;прибавдяем 2 к  di
    mov cx,ax       ;копируем ax в cx
    rep movsb       ; сдвиг буфера на 2 символа вправо
    cld         ; флаг направления сдвига
    mov si,offset strBuf 
    add si,bx
    mov di,si
    sub di,ax
    mov cx,2
    rep movsb       ; копирование последних 2-х символов строки в начало буфера
l_c2Ret:
    ret         ;выход из подпрограммы[/B]
OutStr:
    mov al,'$'      ; вывод строки на экран
    mov strBuf[bx],al
    mov dx,offset strBuf
    mov ah,9
    int 21h
    ret
main:
    mov ax,ds
    mov es,ax
    mov dx,offset str1  ; выводим "введите строку"
    mov ah,09h
    int 21h
    call InpStr
    mov lenBuf,bx
    call Uslovie
    cmp al,0
    je l_m1
    cmp al,1
    je l_m3
    mov dx,offset str3  ; выводим "Введены только цифры"
    mov ah,09h
    int 21h
    jmp l_mRet
l_m3:
    call Convert1   ; условие верно
    jmp l_m2
l_m1:
    call Convert2   ; условие не верно
l_m2:
    call OutStr
l_mRet:
    mov ah,4ch      ; закрываем программу
    int 21h
CODE ENDS
END START
Добавлено через 20 часов 31 минуту
Дорогие друзья,помогите пожалуйста найти ошибку,код прикрепила,ничего не получается.бьюсь уже 3ьи сутки.таки и сдвигает 3 символа вместо 2х,ошибка возникает в этом кусочке
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[B]call InpDigit    ; вызов подпрограммы ввода числа К-элементов подмассива для сдвига 
    mov bx,lenBuf   ; в bx запишем длину буфера
    cmp ax,bx       ; сравним bx с ax
    jae l_c2Ret     ; если больше или равно ,то переход на метку
    std         ;флаг направления сдвига
    mov si,offset strBuf ; адрес начала строки в si
    dec si          ;уменьшаем на 1
    add si,bx       ;добавляем  si к bx
    mov di,si
    add di,2        ;прибавдяем 2 к  di
    mov cx,ax       ;копируем ax в cx
    rep movsb       ; сдвиг буфера на 2 символа вправо
    cld         ; флаг направления сдвига
    mov si,offset strBuf 
    add si,bx
    mov di,si
    sub di,ax
    mov cx,2
    rep movsb       ; копирование последних 2-х символов строки в начало буфера
l_c2Ret:
    ret         ;выход из подпрограммы[/B]
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.06.2015, 11:09
Ответы с готовыми решениями:

Не могу найти ошибку при инициализации массива
Прошу удалить тему. Проблема решена)

Удаление элемента массива: не могу найти ошибку
задание заключается в удалении элемента массива. размер массива,элементы,удаляемый элемент вводятся...

Сортировка массива (не могу найти ошибку)
Напишите фрагмент кода, который вводит NN целых чисел с помощью потока ввода в объявленный Вами...

Обработка двумерного массива, не могу найти ошибку
если первый элемент в массиве максимальный, то ко всем элементам в строке прибавляет 10.....первая...

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.06.2015, 11:09

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Не могу найти ошибку при сортировке массива
Добрый день.Помогите найти ошибку.Суть в том что первые 2-е кнопки выдают данные те что нужно, но...

Обработка двумерного массива, не могу найти ошибку
если первый элемент в строке максимальный, то всю строку увеличить на 10. но почему-то проходит...

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

Из массива А удилать элементы встерчающиеся в массиве В, не могу найти ошибку
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #define C 10 #define D 5 int main(int argc, char...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.