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

Ошибка цикла вывода. MASM

11.12.2014, 23:33. Просмотров 280. Ответов 0
Метки нет (Все метки)

Здравствуйте форумчане. Не получается решить простейшую задачу по выводу введенного с клавиатуры массива. Хотелось реализовать так алгоритм, чтобы пользователь мог ввести любое количество символов. И они все бы потом вывелись. Не получается реализовать именно корректный вывод. То цикл бесконечный получается, то спотыкается сразу на нескольких символах. Пробовал различные варианты. И запись в переменную и в стек пихал смещения и т.д. Но постоянно теряется счетчик циклов. Последнее получившееся - сравнение с нулем, т.е. если пошли нулевые значения массива - цикл останавливается. Но не работает такой способ при вводе 0, как одно из значений массива. Не понимаю как сохранить счетчик цикла, постоянно меняются значения. Даже при работе со стеком. Вытаскиваются потом другие значения. Судя по всему при использовании invoke, тоже используется стек. Объясните пожалуйста кто может. И помогите решить данную задачу. Прошу не судить строго. Только начал изучение ассемблера. Спасибо за внимание.


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
.386
.model flat,stdcall
 
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\fpu.inc
include \masm32\include\msvcrt.inc
 
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\fpu.lib
includelib \masm32\lib\msvcrt.lib
 
strsize equ 200
 
.data
MsgBoxCap db 'Rezultat',0
format db "Chislo = %d",0dh,0ah,0; "ebx = %d",0dh,0ah,"edx = %d",0
NotFd db 'Not found',0
strStart db 'Vvodite',0
strStart1 db 'Skolko popytok:',0
strFin db "Poluchilos: ",0
line db 0dh,0ah,0
 
 
.data?
string db 30 DUP (?)
string2 db 30 DUP (?)
stdout dd ?
stdin dd ?
cread db ?
buff dd ?
buff2 dd ?
cWritten db ?
cifr dd ?
 
.code
main PROC
 mov esi,0
 mov ecx,0
 invoke AllocConsole 
 invoke GetStdHandle, STD_INPUT_HANDLE
 mov stdin,eax
 invoke GetStdHandle, STD_OUTPUT_HANDLE
 mov stdout,eax
 
call zapros_col
call vvod_dan
call vyvod_dan
 
 invoke Sleep,4000
 invoke ExitProcess,0
 
zapros_col PROC
; запрос числа вводимых цифр
;прописать в .data
;           strStart_1 'Введите число'
;           cWritten db ?
;           stdin dd ?
;           stdout dd ?
;           cread db ?
;           buff bd DUP (?)
 mov esi,0
 mov ecx,0
 invoke AllocConsole 
 invoke GetStdHandle, STD_INPUT_HANDLE
 mov stdin,eax
 invoke GetStdHandle, STD_OUTPUT_HANDLE
 mov stdout,eax
 invoke WriteConsoleA,stdout,addr strStart1,sizeof strStart1,addr cWritten,0  
 invoke ReadConsole,stdin,addr buff,strsize,addr cread,0  
 invoke crt_atoi,addr buff
 mov cifr,eax
; xor eax,eax
; mov ah,cifr
; mov cifr2,ah
 ret
zapros_col endp
 
;Процедура ввода данных
;
vvod_dan proc
 mov esi, offset buff2
 mov ecx,cifr
again:
 mov ebx,ecx
 invoke WriteConsoleA,stdout,addr strStart,sizeof strStart,addr cWritten,0  
 invoke ReadConsole,stdin,addr buff,strsize,addr cread,0  
 invoke crt_atoi,addr buff ; преобразовать символ в число
 mov [esi],eax
 add esi,4
 mov ecx,ebx
 loop again  
 ret
vvod_dan endp
 
;Процедура вывода данных
;
vyvod_dan proc
;
 xor edx,edx
 mov esi,offset buff2
; mov edx,cifr
 
vyvod:
 mov ebx,[esi]
  invoke wsprintf,addr string,addr format,ebx   ;преобразование в символ для вывода значений регистров
 invoke WriteConsoleA,stdout,addr string,sizeof string,addr cWritten,0ah  
 invoke WriteConsoleA,stdout,addr line,sizeof line,addr cWritten,0  
; invoke MessageBox,0,addr string,addr MsgBoxCap,MB_OK
 add esi,type buff2
 dec cifr
 test cifr,0
 jnz vyvod
 ret
vyvod_dan endp
 
main endp
end main
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.12.2014, 23:33
Ответы с готовыми решениями:

Нужен код на masm для вывода на экран прямой вертикальной линии
Надо чтобы линия выводилась сразу и самому рисовать не надо было

Ошибка masm Missing or unreachable CS
.model small .386 .stack 100h .code start: mov ax,0003h int 10h cld mov eax,...

Ошибка при запуске masm на виртуалке
Итак, у меня intel core i5, win7x64, на виртуалке WinXPx32 записал masm6.12, и при запуске летит...

ошибка при попытке билда в masm'e
Задание: Дана последовательность натуральных беззнаковых чисел от а до b.Уменьшить нечётные числа...

программа вывода символов от А до Z в видеобуфер с задействованием цикла
нужен исходник на TASM под DOS

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.12.2014, 23:33

Можно ли избежать цикла для вывода DW данных
Задача: сделать сортировку массива. Но эти массивы (начальный и конечный ) еще нужно вывести, я...

[MASM] Прога не компилится. непонятная ошибка(код копировал с методички)
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ include...

Использование вектора прерываний для вывода значения на экран с продолжением цикла
В программе имеется циклический счётчик, считающий от 1 до 6. При нажатии любой клавиши содержимое...


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

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

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