0 / 0 / 0
Регистрация: 24.06.2017
Сообщений: 3
NASM

Как ввести новые данные при повторном вызове системного прерывания read

10.01.2018, 18:22. Показов 2374. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Если хоть кто-нибудь здесь работал в среде sasm, прошу у вас помощи.
Дело в следующем: имеется программа, сам код ниже, при втором вызове функции scan(148строка) происходит запрос прерывания под номером 3,т.е read, оно должно считать из потока ввода строку и поместить ее по адресу , который указан аргументом. Но дело в том, что я ума не приложу, как передать новые данные с клавиатуры. В справке инфы не нашел, но я очень сомневаюсь, что сделать это невозможно. Заранее спасибо за любую помощь.
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
%include "io.inc"
global CMAIN
section .data
msg0 db "vvedi dlinu massiva\"
msg1 db "vvedi dno\"
msg2 db "vvedi top\"
section .bss
cous resb 10
cou resd 1
i resd 1
b resd 1
e resd 1
section .text
jmp CMAIN
stoi: ; stoi(int* na4alo stroki,int* adr vozvrata)
pushad
push ebp
mov ebp,esp
mov esi,[ebp+40] ; adr vozvrata
mov edi,[ebp+44] ; adr na4ala
mov eax,0
cmp [edi],byte '\'
jz break
i1:
sub [edi],byte '0'
imul eax,10
add al,byte [edi]
inc edi
cmp [edi],byte '\'
jnz i1
break:
mov [esi],eax
pop ebp
popad
ret
itos: ;itos(int* 4islo,int* adr vozvrata)
pushad
push ebp
mov ebp,esp
mov esi,[ebp+40]; adr vozvrata
mov edi,[ebp+44]; adr pam9ti s 32-x 4islom
mov eax,[edi]
mov ebx,10
mov ecx,0
j1:
xor edx,edx
div ebx
add edx,'0'
push edx
inc ecx
cmp eax,0
jnz j1
mov eax,0
j2:
pop dword ebx
mov [esi+eax],bl
inc eax
cmp eax,ecx
jnz j2
break1:
pop ebp
popad
ret
print: ; print(int* s) s - adres stroki
pushad
push ebp
mov ebp,esp
mov esi,[ebp+40]
cmp [esi],byte '\'
jz break2
l1:
mov eax,4
mov ebx,1
mov ecx,esi
mov edx,1
int 0x80
inc esi
cmp [esi],byte '\'
jnz l1
break2:
pop ebp
popad
ret
scan: ; print(int*s) - s adres vozvrata vvedennoy stroki
pushad
push ebp
mov ebp,esp
mov esi,[ebp+40]
mov [esi],byte 0
mov eax,3
mov ebx,0
mov ecx,esi
mov edx,9
int 0x80
c0:
cmp [esi],byte '0'
jb c1;
cmp [esi],byte '9'
ja c1;
inc esi
jmp c0
c1:
mov [esi],byte '\'
pop ebp
popad
ret
suyobr: ;suy(int* i , int* cou)  adres pevogo el massiva,cou - kolvo elementov(adr na 9cheiku)
pushad
push ebp
mov ebp,esp
mov edi,[ebp+40]
mov esi,[ebp+44]
mov eax,0
o1:
mov ebx,[edi]
sub ebx,eax
mov [esi+eax*4],ebx
inc eax
cmp eax,[edi]
jnz o1
pop ebp
popad
ret
 
CMAIN:
    mov ebp, esp; for correct debugging
    
    push msg0
    call print
    mov esp,ebp
    
    push cous ; opredelim dlinu massiva
    call scan
    mov esp,ebp
    push cous
    push cou
    call stoi
    mov esp,ebp
    push i
    push cou
    call suyobr
    mov esp,ebp ; massiv zapolnen
    
    push msg1
    call print
    mov esp,ebp
    push cous
    call scan      ; ЗДЕСЬ ПРЕРЫВАНИЕ НИЧЕГО НЕ ТАЩИТ ИЗ ПОТОКА ВВОДА, НО И НЕ ТРЕБУЕТ ОТ МЕНЯ ЧТО-ЛИБО ВВЕСТИ
    mov esp,ebp
    push cous
    push b
    call stoi
    mov esp,ebp ; vvodim niz gran
    
    push msg2
    call print
    mov esp,ebp
    push cous
    call scan
    mov esp,ebp
    push cous
    push e
    call stoi
    mov esp,ebp ; vvodi top gran
    
    xor eax, eax
    ret
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.01.2018, 18:22
Ответы с готовыми решениями:

Не выполняется функция при повторном вызове
Суть такая: при нажатии на ссылку должна выполняться функция, в которой отправляется Ajax-запрос, удаляется ссылка и добавляется такая же,...

Access violation при повторном вызове компонента
Lazarus IDE v1.0.12 fpc 2.6.2 Ubuntu 13.10 i386 Создал визуальный компонент на основе TTreeView с динамической подгрузкой ветвей...

При повторном вызове функции MessageBox не появляется
Доброго времени суток. Возникла проблема с MessageBox При первом вызове все работает нормально. Но при повторном вызове ф-ции...

5
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8665 / 4502 / 1670
Регистрация: 01.02.2015
Сообщений: 13,931
Записей в блоге: 13
10.01.2018, 23:09
Проверить не могу - нет Linux. Не может быть ситуации, когда буфер мал и символы перевода строки помещаются в буфер при втором обращении без реального обращения к консоли?
1
0 / 0 / 0
Регистрация: 24.06.2017
Сообщений: 3
11.01.2018, 09:57  [ТС]
Так оно, получается, и есть. При втором обращении считывается символ перевода строки. Но вот есть ли возможность написать данные порциями для каждого вызова , может, символ какой есть разделительный? Типа : 5[разделительный символ]5, чтобы при первом вызове считалось не 55 , а только 5.
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8665 / 4502 / 1670
Регистрация: 01.02.2015
Сообщений: 13,931
Записей в блоге: 13
11.01.2018, 10:13
Это нужно смотреть в API Linux, но думаю, что такой возможности нет. Обычно считывают буфер и собственными силами парсят строку, выделяя числа введённые (как в C/C++) через пробел.
1
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,311
Записей в блоге: 12
11.01.2018, 11:50
Лучший ответ Сообщение было отмечено wolfox1278 как решение

Решение

Насколько я помню, когда идёт чтение из консоли, то за одну порцию прочитывается строка до символа LF как раз (включая его). И вообще, после int 0x80 нужно проверять EAX на кол-во прочитанных символов (и заодно на наличие ошибок, когда EAX = -1).

Добавлено через 10 минут
Ну да, так и есть, чтение идёт по строкам:
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
BITS 32
 
%define __NR_exit       1
%define __NR_read       3
%define __NR_write      4
 
GLOBAL  _start
 
SECTION .data
 
divs    db      '---',10
 
SECTION .bss
 
%define bufsize 1024
buffer  resb    bufsize
 
SECTION .text
 
_start:
 
        mov     eax,__NR_read
        xor     ebx,ebx
        mov     ecx,buffer
        mov     edx,bufsize
        int     0x80            ; читаем
 
        mov     edx,eax
        mov     eax,__NR_write
        mov     ebx,1
        ; ECX не изменился
        int     0x80            ; выводим
 
        mov     eax,__NR_write
        mov     ebx,1
        mov     ecx,divs
        mov     edx,3
        int     0x80            ; выводим разделитель
 
        mov     eax,__NR_read
        xor     ebx,ebx
        mov     ecx,buffer
        mov     edx,bufsize
        int     0x80            ; читаем
 
        mov     edx,eax
        mov     eax,__NR_write
        mov     ebx,1
        ; ECX не изменился
        int     0x80            ; выводим
 
        mov     eax,__NR_exit
        xor     ebx,ebx
        int     0x80            ; выходим
2
0 / 0 / 0
Регистрация: 24.06.2017
Сообщений: 3
11.01.2018, 17:07  [ТС]
Огромное вам спасибо, вопрос решен.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.01.2018, 17:07
Помогаю со студенческими работами здесь

Форма ожидания не появляется при повторном вызове
Есть код: private void OnSampleClick(object sender, EventArgs args) { Waiting dlg = new Waiting(); ...

Ошибка при повторном вызове другой формы: ObjectDisposedException
Пытаюсь вызвать другую форму посредством From2 f2 = new From2(); f2.Show(); В другой форме кнопка закрывающая вторую форму,...

Ошибка при повторном вызове метода Clipboard.SetDataObject
Необходимо программно отправить текст в текстовое поле стороннего приложения. Задавал вопрос в разделе C++ WinAPI...

Clipboard.SetText: при повторном вызове генерируется ExternalException
Есть кусок кода следующего вида: SendInputClass.HoldKeyAsInput(Keys.Control); //Удерживание клавиши ...

При повторном вызове окна, оно меняет свой вид
Привет всем. Подскажите, пожалуйста, в чем дело, если вот такая ситуация: окно с 3 полями для ввода... ввожу 8-10 раз данные в поля,...


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

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

Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: показать затраченные материалы за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В качестве. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru