Как сделать новое чтение из STDIN? Есть Linux и GNU assembler. Сделал один системный вызов read из stdin в кусок памяти. Могу ли я теперь как то сделать новый вызов read из stdin в новый кусок памяти? Как правильно закрыть старый? Буду благодарен если у кого нибудь есть ссылка на пример или статью на любых языках. Или может быть в какой то книге это есть.

25 Мая в 19:51
250 +1
0
Ответы
1

Да, вы можете производить несколько вызовов read из стандартного ввода (stdin) в разные участки памяти в вашей программе, написанной на языке ассемблера для Linux.

Как это сделать

Выделите новую область памяти для хранения данных, которые вы хотите прочитать из stdin. Это можно сделать, используя системный вызов malloc, или, для простоты, вы можете просто использовать стек.

Сделайте системный вызов read, указав новый адрес памяти, в который будут записаны данные.

Не нужно закрывать stdin, так как он уже открывается при старте процесса. Если вам нужно перезаписать данные, просто используйте новый адрес или блок памяти.

Пример на ассемблере

Вот небольшой пример на ассемблере, который читает данные из stdin и записывает их в две разные области памяти.

section .bss
buf1 resb 64 ; Первое место для данных
buf2 resb 64 ; Второе место для данных
section .text
global _start
_start:
; Чтение из stdin в buf1
mov rax, 0 ; syscall number для read
mov rdi, 0 ; stdin
mov rsi, buf1 ; адрес буфера
mov rdx, 64 ; количество байт для чтения
syscall
; (Обработка buf1 здесь)
; Чтение из stdin в buf2
mov rax, 0 ; syscall number для read
mov rdi, 0 ; stdin
mov rsi, buf2 ; адрес буфера
mov rdx, 64 ; количество байт для чтения
syscall
; (Обработка buf2 здесь)
; Завершение программы
mov rax, 60 ; syscall number для exit
xor rdi, rdi ; код возврата 0
syscallОбъяснение кода:В секции .bss мы резервируем 64 байта для buf1 и 64 байта для buf2.В .text мы выполняем два вызова системного вызова read для чтения данных из stdin в эти буферные области.После чтения вы можете обработать данные, как вам нужно, и в конце выходите из программы через exit.Закрытие stdin

Стандартный ввод обычно не закрывается в пользовательских приложениях. Если вы указываете в своей программе другой ввод, который необходимо закрыть, это можно сделать с помощью системного вызова close. В случае stdin это будет:

mov rax, 3 ; syscall number для close
mov rdi, 0 ; файловый дескриптор stdin
syscall

Но, как уже упоминалось выше, вам, вероятно, не нужно закрывать stdin, если вы просто перезаписываете данные.

Полезные ссылки

Вот некоторые ресурсы, которые вы можете использовать для дальнейшего изучения:

"Programming from the Ground Up" — книга о программировании на ассемблере.Linux man pages — man-страницы для системных вызовов как read, write, malloc, и т.д.Группа поиска примеров на GitHub, где множество репозиториев с примерами кода на ассемблере для Linux.

Эта информация должна помочь вам с вашими задачами!

25 Мая в 19:52
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир