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

Глюк при вводе строки?

03.05.2012, 23:07. Показов 1053. Ответов 14
Метки нет (Все метки)

Условие задачи: Вводится предложение. Посчитать колиечство подряд идущих пар, начинающихся с одной буквы.
Глюк: по-моему регист al всегда = 00 Например, если ввести только воскл. знак (тогда цикл вообще бесконечный)

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
.model  tiny
.data
 
sIn db  'Ââåäèòå ñòðîêó:  $'
sCount  db  0dh,0ah,'Êîë-âî ïàð: $'
 
buf label   byte    ; áóôåð äëÿ ïðèåìà ñòðîêè ñ êëàâèàòóðû (ïî ô-è 0ah)
max db  128         ; ìàêñèìàëüíàÿ äëèíà ñòðîêè
len db  0           ; ðåàëüíàÿ äëèíà ââåäåííîé ñòðîêè
k   dw  0           ; êîëâî ïàð
 
string  db  128 dup (?) ; ñàìà ñòðîêà
 
.code
.startup
 
    lea dx, sIn
    mov ah, 9
    int 21h     ; ïðèãëàøåíèå ââåñòè ñòðîêó
 
    lea dx, buf
    mov ah, 0ah
    int 21h     ; ââîäèì ñòðîêó
 
    xor bh, bh      ; bh - ôëàã íàëè÷èÿ ñëîâà 0-ñëîâà íå áûëî, 1-ñîáèðàåì ñëîâî
    xor bl, bl      ; bl - ôëàã òîãî, ÷òî õîòÿ áû 1 ñëîâî íàéäåíî
    xor dx, dx      ; dx - ÷èñëî íàéäåííûõ ïàð
    
    lea si, string  ; ñàìà ñòðîêà 
    
main_loop:          ; îñíîâíîé öèêë
    lodsb           ; î÷åðåäíîé ñèìâîë â ðåãèñòð al
    cmp al, 0dh     ; êîíåö ñòðîêè ?
    je  print_rezult    ; íà êîíåö îáðàáîòêè
 
    cmp al, '0'     ; öèôðû ?
    ja  separ_found ; ìåíüøå - ðàçäåëèòåëü
    cmp al, '9'
    jbe word_found  ; ÷àñòü ñëîâà
 
    cmp al, 'A'     ; áîëüøèå ëàòèíñêèå ?
    ja  separ_found ; ìåíüøå - ðàçäåëèòåëü
    cmp al, 'Z'
    jbe word_found  ; ÷àñòü ñëîâà
 
    cmp al, 'a'     ; ìàëûå ëàòèíñêèå ?
    ja  separ_found ; ìåíüøå - ðàçäåëèòåëü
    cmp al, 'z'
    jbe word_found  ; ÷àñòü ñëîâà
 
    cmp al, 80h     ; êèðèëëèöà À-ï
    ja  separ_found ; ìåíüøå - ðàçäåëèòåëü
    cmp al, 0afh
    jbe word_found  ; ÷àñòü ñëîâà
 
    cmp al, 0e0h    ; êèðèëëèöà ð-ÿ,¨,¸,óêðàèíñêèå,áåëîðóññêèå áóêîâêè
    ja  separ_found ; ìåíüøå - ðàçäåëèòåëü
    cmp al, 0f7h
    jbe word_found  ; ÷àñòü ñëîâà
 
separ_found :
    xor bh, bh      ;îæèäàåì ñëîâî
    jmp next
    
   
word_found:         ; ñëîâî
    cmp bl, 0       ; ïåðâîå ñëîâî
    je  first_word  ;
    cmp bh, 0       ; ñëîâî îæèäàëîñü
    je new_word     ; îáðàáàòûâàåì ïåðâûé ñèìâîë ñëîâà
    mov bh, 1       ; ñîáèðàåì ñëîâî
    jmp next        ; íà ÷òåíèå î÷åðåäíîãî ñèìâîëà
 
first_word:
    mov bl,1        ; ïåðâîå ñëîâî íàéäåíî    
    mov ah, al      ; çàïîìíèëè ïåðâûé ñèìâîë
    jmp next                     
    
new_word:
    cmp ah, al      ; ñðàâíèâàåì ïðåäûäóùóþ ïåðâóþ áóêâó ñ íîâîé
    je  inc_count   ; óâåëè÷èâàåì ñ÷åò÷èê
    mov ah, al      ; çàïîìèíàåì íîâûé ñèìâîë
    jmp next        
 
inc_count:
    add dx, 1
    mov ah, al
    jmp next
            
next:
    jmp main_loop   ; íà îñíîâíîé öèêë
    
print_rezult:       ; âñòðåòèëè êîíåö ñòðîêè
    mov k, dx       ; çàïîìíèëè ðåçóëüòàò
    ; ïå÷àòàåì
    mov ah,09h
    lea dx,sCount
    int 21h
    mov ax, k
    call WriteInteger
    int 21h; ïå÷àòü
    
    ; âûâîä ÷èñëà
    WriteInteger proc 
        push    ax  
        push    cx  
        push    bx  
        push    dx  
        xor     cx, cx  
        mov     bx, 10  
        ; ÷èñëî îòðèöàòåëüíîå?    
        cmp     ax,0
        jl      pm_cs   ; åñëè - äà
        jmp     div_10  ; åñëè - íåò
        ; âûâåñòè ìèíóñ è ïîìåíÿòü çíàê
        pm_cs:     
        push ax 
        mov al, '-'
        call WriteChar
        pop ax
        neg ax  
 
    ; ïîëó÷èòü 10-å öèôðû è ïîìåñòèòü èõ â ñòåê,
    ; â cx - êîëè÷åñòâî ïîëó÷åííûõ öèôð
        div_10:  
        xor     dx, dx  
        div    bx  
        push    dx  
        inc     cx  
        cmp     ax,0     
        jg     div_10  
 
    ; äîñòàòü èç ñòåêà, ïåðåâåñòè â êîä ASCII  è âûâåñòè  
    print_int:  
        pop     ax  
        add     al, '0'
        call    WriteChar  
        loop    print_int  
 
        pop     dx
        pop     bx  
        pop     cx  
        pop     ax 
        ret  
    WriteInteger endp
 
    ; âûâîä îäíîãî ñèìâîëà  
    WriteChar proc  
        push    ax  
        push    dx  
        mov     dl, al  
        mov     ah, 2  
        int     21h  
        pop     dx  
        pop     ax  
        ret  
    WriteChar endp
    
ret
endp
end
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.05.2012, 23:07
Ответы с готовыми решениями:

Почему при вводе строки с клавиатуры могу напечатать только 35 символов
подскажите, пожалуйста, почему при вводе строки с клавиатуры могу напечатать только 35 символов? ...

Глюк при вводе через консоль
Как можно обеспечить правильный ввод? При вводе цифр все нормально, а вот когда ввести символ...

Как сделать так, что бы длинна строки сама менялась при вводе строки?
Есть такой код #include "stdafx.h" #include "enter.h" #include <stdio.h> #include <math.h>...

Почему при вводе числа программа работает нормально, а при вводе буквы уходит в бесконечный цикл?
void mainmenu() { cout << "Введи число" << endl; cin >> choice; if (choice == 1) { cout <<...

14
Заблокирован
04.05.2012, 07:19 2
Это не у проги глюк, а у тебя внимательно читать доки надо!!! Поменяй местами k и string
0
0 / 0 / 0
Регистрация: 15.11.2011
Сообщений: 39
04.05.2012, 09:11  [ТС] 3
Разве порядок определения переменных имеет значение?

И еще: при пошаговой обработке при введенной строке, скажем W W W
Буквы определяются правильно, а пробелы - нет.
Assembler
1
2
3
4
    cmp al, '0'     ; цифры ?
    ja  separ_found ; меньше - разделитель
    cmp al, '9'
    jbe word_found  ; часть слова
Не хочет он на separ_found переходить.
0
116 / 136 / 0
Регистрация: 15.04.2012
Сообщений: 1,031
04.05.2012, 09:15 4
Так конечно, он у тебя будет переходить туда, если цифра. Надо сделать так:
Assembler
1
2
3
4
cmp al, '0'     ; цифры ?
    jb  separ_found ; меньше - разделитель
    cmp al, '9'
    ja word_found
И все.
0
Заблокирован
04.05.2012, 09:30 5
Цитата Сообщение от Ermintar Посмотреть сообщение
Разве порядок определения переменных имеет значение?
глупый вопрос... при твоем определении переменных первые два символа попадут в переменную k, а остальные в стринг
0
0 / 0 / 0
Регистрация: 15.11.2011
Сообщений: 39
04.05.2012, 09:53  [ТС] 6
Хм, так тоже не работает.

Может, я чего не понмаю, но вот условие:
if new_symbol<"0' then go to separator
if new_symbol<='9' then go to word

тогда скорее

Assembler
1
2
3
4
    cmp al, '0'     ; öèôðû ?
    jb  separ_found ; ìåíüøå - ðàçäåëèòåëü
    cmp al, '9'
    jbe word_found  ; ÷àñòü ñëîâà
Т.е. w w w , по букве переходит корректно, дальше сравнивает пробел с '0' и движется дальше без перехода. Хотя пробел меньше '0'
0
Заблокирован
04.05.2012, 09:56 7
скрин программы в отладчике после загрузки пробела в al в студию!!
0
Клюг
7669 / 3184 / 382
Регистрация: 03.05.2011
Сообщений: 8,381
04.05.2012, 10:01 8
Цитата Сообщение от Ermintar
Разве порядок определения переменных
Угу. Вот кусочек.
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
dos_inp macro   lbl, sz
_ib_    struc  
max db  sz
len db  ?
bf  db  sz dup(?)
_ib_    ends            
lbl _ib_ <>
endm
.model small
.386
.stack  100
.code   
start:  
    mov ax, @data
    mov ds, ax
    mov es, ax
    mov     ah, 09h
    lea     dx, req
    int     21h
    mov ah, 0Ah
    lea dx, buf
    int 21h
    movzx   bx, byte ptr buf.len
    add bx, offset buf
    mov byte ptr [bx],'$'
    mov     ah, 09h
    lea     dx, crlf
    int     21h
    mov     ah, 09h
    lea     dx, buf.bf
    int     21h
    mov ah, 4Ch
    int 21h
.data
crlf    db  0Dh,0Ah,'$'
req db  'Enter string:$'
dos_inp buf, 20
    end start
0
0 / 0 / 0
Регистрация: 15.11.2011
Сообщений: 39
04.05.2012, 10:03  [ТС] 9
Скрин:
0
Миниатюры
Глюк при вводе строки?  
Заблокирован
04.05.2012, 10:07 10
мляяя, во народ пошол.... тыж с нулем ал сравниваешь
0
0 / 0 / 0
Регистрация: 15.11.2011
Сообщений: 39
04.05.2012, 10:09  [ТС] 11
Так мне и надо его с нулем сравнить! С кодом символа ноль, если быть точной
0
Заблокирован
04.05.2012, 10:12 12
код символа 0 - не есть ноль читай ASCII-таблицу
0
0 / 0 / 0
Регистрация: 15.11.2011
Сообщений: 39
04.05.2012, 11:04  [ТС] 13
А я и не говорила, что код '0' - 0. Мы же здесь сравниваем не с 0 а с нулем в кавычках, то есть символом. Или я не права?
П.с код 0 - 48, замена в коде '0' на 30h результата не дала.

Добавлено через 44 минуты
Короче, это действительно был глюк. флаг CF устанавливался правильно, но переход не происходил. Излечилось переименованием метки separ_found на separator. Почему, хз))
0
116 / 136 / 0
Регистрация: 15.04.2012
Сообщений: 1,031
04.05.2012, 13:13 14
Бывает такое с процессорами. Слышал, что они не так код понимают. Или отладчик мешает.
0
Ушел с форума
Автор FAQ
14192 / 7073 / 836
Регистрация: 11.11.2010
Сообщений: 12,689
05.05.2012, 03:39 15
Цитата Сообщение от programmisto Посмотреть сообщение
Бывает такое с процессорами. Слышал, что они не так код понимают. Или отладчик мешает.
Или плохому танцора яйца
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.05.2012, 03:39

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

При вводе пропускаются строки
Ребяят, кому не лень!) палочка выручалочка П.5.4. Правил Запрещено создавать темы с...

Ошибка при вводе строки !
Точнее не ошибка а не могу ввести строку(не вводится)! Подскажите в чём дело, заранее благодарен!...

Игнорирование \n при вводе строки
Здравствуйте. Как ввести в переменную типа string строку с пробелами, но без символа перевода...

Хэширование. Ошибка при вводе строки.
Привет, друзья. Пишу лабу по хешированию, столкнулся с проблемой При вводе строки. При компиляции...


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

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

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