Форум программистов, компьютерный форум, киберфорум
Assembler: Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 24.06.2017
Сообщений: 3
NASM

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

10.01.2018, 18:22. Показов 2314. Ответов 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
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
10.01.2018, 23:09
Проверить не могу - нет Linux. Не может быть ситуации, когда буфер мал и символы перевода строки помещаются в буфер при втором обращении без реального обращения к консоли?
1
0 / 0 / 0
Регистрация: 24.06.2017
Сообщений: 3
11.01.2018, 09:57  [ТС]
Так оно, получается, и есть. При втором обращении считывается символ перевода строки. Но вот есть ли возможность написать данные порциями для каждого вызова , может, символ какой есть разделительный? Типа : 5[разделительный символ]5, чтобы при первом вызове считалось не 55 , а только 5.
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
11.01.2018, 10:13
Это нужно смотреть в API Linux, но думаю, что такой возможности нет. Обычно считывают буфер и собственными силами парсят строку, выделяя числа введённые (как в C/C++) через пробел.
1
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6808 / 2048 / 238
Регистрация: 14.12.2014
Сообщений: 4,297
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru