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

Определить количество членов a(k) последовательности, являющихся нечетными числами

04.05.2012, 20:19. Показов 1292. Ответов 13
Метки нет (Все метки)

Ввести натуральное число n и последовательность натуральных чисел a(1),...,a(n). Определить количество членов a(k) последовательности являющихся нечетными числами.
Количество членов я определил, вот только никак не могу разобраться с вводом с клавиатуры числа. Помогите пожалуйста.
Вот код:
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
184
185
186
187
188
189
190
191
.686             
.model flat,stdcall  
option casemap:none
      include \masm32\INCLUDE\windows.inc
      include \masm32\INCLUDE\masm32.inc
      include \masm32\INCLUDE\gdi32.inc
      include \masm32\INCLUDE\user32.inc
      include \masm32\INCLUDE\kernel32.inc
      include \masm32\INCLUDE\Comctl32.inc
      include \masm32\INCLUDE\comdlg32.inc
      include \masm32\INCLUDE\shell32.inc
      include \masm32\INCLUDE\oleaut32.inc
      include \masm32\INCLUDE\msvcrt.inc
 
      include \masm32\macros\macros.asm
 
 
      includelib \masm32\LIB\masm32.lib
      includelib \masm32\LIB\gdi32.lib
      includelib \masm32\LIB\user32.lib
      includelib \masm32\LIB\kernel32.lib
      includelib \masm32\LIB\Comctl32.lib
      includelib \masm32\LIB\comdlg32.lib
      includelib \masm32\LIB\shell32.lib
      includelib \masm32\LIB\oleaut32.lib
      includelib \masm32\LIB\msvcrt.lib
.data
    conTitle db "BlahBlah",0
    mes1 db "Array:",0
    len1 equ $-mes1
    mes2 db 0dh,0ah, "Num = ",0
    len2 equ $-mes2
    mes3 db 0dh,0ah, "Found times = ",0
    len3 equ $-mes3
    charBuf db "     ",0
    len_charBuf dd $-charBuf
    iarray dd 1,3,11,2,9,7,5,4,12,13
    larray equ ($-iarray)/4
    lpFmt db "%d",0
    cnt dd 0
    two dd 2
    num dd -5
    readBuf db ?
    lenReadBuf dd 1
    hStdIn dd 0
    hStdOut dd 0
    chrsRead dd 0
    chrsWritten dd 0
    STD_INP_HNDL dd -10
    STD_OUTP_HNDL dd -11
    sm dd 0 
.code
start:
    call AllocConsole
    test eax,eax
jz ex
    push offset conTitle
    call SetConsoleTitleA
    test eax,eax
jz ex
 
    call getout_hndl
    call getinp_hndl
    
    push ebx
    mov ebx, offset mes1
    mov ecx, len1
    ;call write_con
    invoke WriteConsole, hStdOut, ebx, ecx, chrsWritten, 0
    pop ebx
    
    mov esi, offset iarray
    mov ecx, larray
    
show_next:
 
    push esi
    push ecx
    push dword ptr [esi]
    push offset lpFmt
    push  offset charBuf
    call wsprintf
    ;invoke wsprintf, esi, ecx, dword ptr[esi], offset lpFmt, offset charBuf 
    ;invoke wsprintf, offset charBuf, offset lpFmt, dword ptr [esi], ecx, esi
    add esp, 12
 
    push ebx
    mov ebx, offset charBuf
    mov ecx, len_charBuf
    ;call write_con
    
    invoke WriteConsole, hStdOut, ebx, ecx, chrsWritten, 0
    
    pop ebx
    ;call clear_buf
    pop ecx
    pop esi
    add esi,4
loop show_next
    
    push ebx
    mov ebx, offset mes2
    mov ecx, len2
    call write_con
    pop ebx
 
    push dword ptr num
    push offset lpFmt
    push offset charBuf
    call wsprintf
    add esp,12
 
    push ebx
    mov ebx, offset charBuf
    mov ecx, len_charBuf
    call write_con
    pop ebx
 
; подсчитать сколько раз встречаеться элемент в массиве
;-----------------------------------------------------------
lea esi,iarray
    mov dword ptr cnt,0
    mov ecx,larray
next_cmp:   
    test dword ptr [esi], 1
    je skip
    inc cnt
skip:   
    ADD DWORD PTR esi, 4
loop next_cmp
;------------------------------------------------------------
;преобразовать результат подсчета в строчку
 
    push dword ptr cnt
    push offset lpFmt
    push offset charBuf
    call wsprintf
    add esp,12
 
    push ebx
    mov ebx, offset mes3
    mov ecx, len3
    invoke WriteConsole, hStdOut, ebx, ecx, chrsWritten, 0
    ; call write_con
    pop ebx
    push ebx
    mov ebx, offset charBuf
    mov ecx, len_charBuf
    ;invoke WriteConsole, hStdOut, ebx, ecx, chrsWritten, 0
    call write_con
    pop ebx
;   call clear_buf
invoke ReadConsole,hStdIn, offset charBuf, 1, chrsRead, 0
 
getout_hndl proc
    push STD_OUTP_HNDL
    call GetStdHandle
    mov hStdOut,eax
    ret
getout_hndl endp
 
getinp_hndl proc
    push STD_INP_HNDL
    call GetStdHandle
    mov hStdIn, eax
    ret
getinp_hndl endp
 
write_con proc
    push 0
    push chrsWritten
    push ecx
    push ebx
    push hStdOut
    call WriteConsoleA
    ret
write_con endp
 
 
read_con proc
    push 0
    push chrsRead
    push lenReadBuf
    push offset readBuf
    push hStdIn
    call ReadConsoleA
    ret
    read_con endp
ex:
inkey
end start
0

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

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

Определение членов а(к) последовательности являющихся нечетными числами
Здравствуйте! Задание следующее: Ввести натуральное число n и последовательность натуральных чисел...

Определить количество элементов массива, являющихся четными числами
Прошу помощи в решении данных задач а) Задан линейный массив N из элементов. Определить...

Определить количество членов последовательности, являющихся нечетными числами
Даны натуральные числа n, a1,….. an. Определить количество членов последовательности, являющихся...

Определить и вывести количество членов последовательности: являющихся удвоенными нечетными числами
Даны n натуральных чисел a1,a2,...,an . Определить и вывести количество членов...

13
116 / 136 / 0
Регистрация: 15.04.2012
Сообщений: 1,031
05.05.2012, 08:48 2
Смотри, как вводят. У тебя вначале в буфере 0. Когда вводишь цифру умножаешь число в буфере на 10 и прибавляешь введённую цифру (введённый код - 48), например, ввел 5, 0*10+5 =5. Во второй раз то же самое, например, вводишь 9. Умножаешь на десять, получаешь 50, прибавляешь 9, получаешь 59. Понятно?
0
0 / 0 / 0
Регистрация: 30.04.2012
Сообщений: 11
05.05.2012, 11:27  [ТС] 3
Меня интересует реализация функции ввода, я прелопатил кучу литературы и никак не могу найти работающей реализации.
0
116 / 136 / 0
Регистрация: 15.04.2012
Сообщений: 1,031
05.05.2012, 13:16 4
Покажу. Смотри:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
mov bx,0
loopentw:
push bx
mov ah,10h
int 16h
pop bx
cmp al,0
je jaeert
push ax
mov ax,bx
push cx
mov cx,9
loorwerwerw:
add bx,ax
loop loorwerwerw
pop cx
pop ax
add bx,al
sub bx,30h
jmp loopentw
jaeert:;ну вот и все. А здесь уже делай что хочешь с числом (оно в BX)
1
0 / 0 / 0
Регистрация: 30.04.2012
Сообщений: 11
05.05.2012, 19:17  [ТС] 5
Огромное спасибо!!!

Добавлено через 1 час 53 минуты
Вот я добавил и что оно выбивает ошибку в этой строке "add ebx, al" - invalid instruction operand.
В чем я допустил ошибку?
Вот код который я сделал:
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
.code
start:
    call AllocConsole
    test eax,eax
jz ex
    push offset conTitle
    call SetConsoleTitleA
    test eax,eax
jz ex
 
    call getout_hndl
    call getinp_hndl
    
    ;--------------------------------------------   
    mov ebx,0
loopentw:
    push ebx
    mov ah,10h
    int 16h
    pop ebx
    cmp al,0
    je jaeert
    push ax
    mov eax,ebx
    push ecx
    mov ecx,9
loorwerwerw:
    add ebx,eax
    loop loorwerwerw
    pop ecx
    pop eax
    add ebx, al
    sub ebx,30h
    jmp loopentw
    
;----------------------------------------   
jaeert:
    push ebx
    mov ebx, offset mes1
    mov ecx, len1
    ;call write_con
    invoke WriteConsole, hStdOut, ebx, ecx, chrsWritten, 0
    pop ebx
 
    mov esi, offset iarray
    mov ecx, larray
    
show_next:
 
    push esi
    push ecx
    push dword ptr [esi]
    push offset lpFmt
    push  offset charBuf
    call wsprintf
    ;invoke wsprintf, esi, ecx, dword ptr[esi], offset lpFmt, offset charBuf 
    ;invoke wsprintf, offset charBuf, offset lpFmt, dword ptr [esi], ecx, esi
    add esp, 12
 
    push ebx
    mov ebx, offset charBuf
    mov ecx, len_charBuf
    ;call write_con
    
    invoke WriteConsole, hStdOut, ebx, ecx, chrsWritten, 0
    
    pop ebx
    ;call clear_buf
    pop ecx
    pop esi
    add esi,4
loop show_next
    
    push ebx
    mov ebx, offset mes2
    mov ecx, len2
    call write_con
    pop ebx
 
    push dword ptr num
    push offset lpFmt
    push offset charBuf
    call wsprintf
    add esp,12
 
    push ebx
    mov ebx, offset charBuf
    mov ecx, len_charBuf
    call write_con
    pop ebx
 
; подсчитать сколько раз встречаеться элемент в массиве
;-----------------------------------------------------------
lea esi,iarray
    mov dword ptr cnt,0
    mov ecx,larray
next_cmp:   
    test dword ptr [esi], 1
    je skip
    inc cnt
skip:   
    ADD DWORD PTR esi, 4
loop next_cmp
;------------------------------------------------------------
;преобразовать результат подсчета в строчку
 
    push dword ptr cnt
    push offset lpFmt
    push offset charBuf
    call wsprintf
    add esp,12
 
    push ebx
    mov ebx, offset mes3
    mov ecx, len3
    invoke WriteConsole, hStdOut, ebx, ecx, chrsWritten, 0
    ; call write_con
    pop ebx
    push ebx
    mov ebx, offset charBuf
    mov ecx, len_charBuf
    ;invoke WriteConsole, hStdOut, ebx, ecx, chrsWritten, 0
    call write_con
    pop ebx
;   call clear_buf
invoke ReadConsole,hStdIn, offset charBuf, 1, chrsRead, 0
 
getout_hndl proc
    push STD_OUTP_HNDL
    call GetStdHandle
    mov hStdOut,eax
    ret
getout_hndl endp
 
getinp_hndl proc
    push STD_INP_HNDL
    call GetStdHandle
    mov hStdIn, eax
    ret
getinp_hndl endp
 
write_con proc
    push 0
    push chrsWritten
    push ecx
    push ebx
    push hStdOut
    call WriteConsoleA
    ret
write_con endp
 
 
read_con proc
    push 0
    push chrsRead
    push lenReadBuf
    push offset readBuf
    push hStdIn
    call ReadConsoleA
    ret
    read_con endp
ex:
inkey
end start
0
116 / 136 / 0
Регистрация: 15.04.2012
Сообщений: 1,031
06.05.2012, 14:18 6
Assembler
1
add ebx, al.
Ерунда. AL - 8 бит, а EBX - 32 бита. Можно сделать это же по другому (и без ошибки):
Assembler
1
2
3
4
5
push eax
shl eax,24
shr eax,24
add ebx,eax 
pop eax
То есть приводим к одной размерности. Сдвигаем на 24 бита, чтобы убрать все байты, кроме AL.
0
0 / 0 / 0
Регистрация: 30.04.2012
Сообщений: 11
06.05.2012, 14:20  [ТС] 7
Помогите пожалуйста, мне во вторник уже курсовую сдавать, а я никак не могу впихнуть этот ввод, чтобы он работал.
0
0 / 0 / 0
Регистрация: 30.04.2012
Сообщений: 11
06.05.2012, 14:46  [ТС] 8
Я это уже сделал, только немного не так. У меня вопрос почему как только появляется консоль она сразу завершается ошибкой.
0
116 / 136 / 0
Регистрация: 15.04.2012
Сообщений: 1,031
06.05.2012, 15:00 9
Запусти под отладчиком и скажи на какой строке рушится. Может что-нибудь придумаем. Кстати, что за ошибку он выдает?
0
0 / 0 / 0
Регистрация: 30.04.2012
Сообщений: 11
06.05.2012, 15:19  [ТС] 10
Сразу же пишет "прекращение работы программы" и еще так же реагирует на все клавишикогда без этой ф-ции ввода
0
116 / 136 / 0
Регистрация: 15.04.2012
Сообщений: 1,031
06.05.2012, 15:28 11
Я в консолях не спец. Советую использовать не консоль а COM прогу. Там то же как консоль, но её инициализировать не надо.
0
0 / 0 / 0
Регистрация: 30.04.2012
Сообщений: 11
06.05.2012, 15:36  [ТС] 12
А можно по-подробнее, что это и где его искать.
0
116 / 136 / 0
Регистрация: 15.04.2012
Сообщений: 1,031
06.05.2012, 15:42 13
Тебе, все таки, наверное лучше разобраться с консолью, а то там придется вручную числа переводить. COM программа автоматически создает консольное окно. Просто выводи и вводи. Все просто.
0
0 / 0 / 0
Регистрация: 30.04.2012
Сообщений: 11
06.05.2012, 15:50  [ТС] 14
Да я вот с этим просто уже дня 4 мучаюсь. Спасибо)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.05.2012, 15:50

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

Определить количество членов последовательности, являющихся нечётными числами, кратных 3 и некратных 5
Список задач 1. Даны натуральные числа n, A1, ..., An. Определить количество членов Ak...

Определить количество членов последовательности, имеющих четные порядковые номера и являющихся нечетными числами
Даны натуральные числа n, A 1, A2 , ..., An . Определить количество членов Ak ...

Определить количество членов массива, являющихся нечетными числами
Даны натуральные числа n, a 1...an. Определить количество членов ak последовательности a1,...,an...

Определить количество членов ak последовательность a1,...,an: являющихся нечетными числами
Дано натуральное числа n,a1,...,an.Определить количество членов ak последовательность a1,...,an:...


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

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

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