Форум программистов, компьютерный форум, киберфорум
Assembler: Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/23: Рейтинг темы: голосов - 23, средняя оценка - 4.74
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
GAS/AT&T

Чтение из файла в локальную переменную (на стеке)

06.04.2020, 17:33. Показов 4740. Ответов 17
Метки gas (Все метки)

Студворк — интернет-сервис помощи студентам
привет
помогите пожалуйста разобраться в простом вопросе


есть файл
Assembler
1
2
3
4
t.txt
hello forum > t.txt
 
  теперь надо из него прочитать.
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
.section .bss
buff: .space 32
 
.section .data
forman: .asciz "%s"
 
file: .asciz "t.txt"
 
.section .text
.global main
main:
 
push %rbp
mov %rsp, %rbp
 
 
mov $5, %rax
mov $file, %rbx
mov $0x002, %rcx
mov $0x1b6, %rdx
int $0x80
 
 
 
 вопрос вот в чем. я не хочу писать в секцию. я хочу прочитать из файла в стек
 
 
mov %rax, %rbx
mov $3, %rax
mov -32(%rbp) , %rcx
mov $32, %rdx
 
int $0x80
 
 
 
leave 
ret

не получается. как это можно сделать? научите пожалуйста
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.04.2020, 17:33
Ответы с готовыми решениями:

Если создать указатель на переменную, созданную в стеке, переменная перемещается в кучу? Или остается в стеке?
Подскажите, если не трудно, я создаю переменную любого стандартного типа и она хранится в стеке, а если я создаю указатель на эту...

Чтение из файла и запись в переменную
всем привет) Недавно начал изучение чтение и запись из/в файлы. Вот настряпал небольшой код: #include <iostream> #include...

Чтение строки из файла в переменную
Здравствуйте. Т.к. в написании bat файлов нет опыта, необходима помощь. В определенном каталоге по условию появляется текстовый файл...

17
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8655 / 4490 / 1669
Регистрация: 01.02.2015
Сообщений: 13,898
Записей в блоге: 12
06.04.2020, 17:46
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
sub $32, %rsp ;выделить место в стеке под локальные переменные - в данном случае под буфер
 
mov %rax, %rbx
mov $3, %rax
mov -32(%rbp) , %rcx
mov $32, %rdx
 
int $0x80
.............
 
add $32, $rsp
 
leave
ret
0
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
06.04.2020, 21:14  [ТС]
Когда начинаю читать от туда, то ничего не выводит. Из секции читаю, все норм, а из стека не выходит. Какие есть мысли?
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8655 / 4490 / 1669
Регистрация: 01.02.2015
Сообщений: 13,898
Записей в блоге: 12
06.04.2020, 21:43
Выполните в отладчике - посмотрите код возврата чтения файла, посмотрите содержимое стека.
Подозреваю, что имя файла должно заканчиваться 0.

Чудес не бывает - нужно проверять код завершения файловых операций (открытие, чтение, запись) и при ошибке выводить диагностическое сообщение.
0
1137 / 685 / 412
Регистрация: 07.11.2015
Сообщений: 1,102
07.04.2020, 02:12
Лучший ответ Сообщение было отмечено ФедосеевПавел как решение

Решение

Цитата Сообщение от pcmax Посмотреть сообщение
Assembler
1
mov -32(%rbp) , %rcx
Тут нужно загрузить адрес с помощью lea.
Но системный вызов через прерывание 80h работает с 32-битными регистрами и в ecx не запихнуть указатель на стек.
Системные вызовы в Linux

Assembler
1
2
3
4
5
6
7
8
9
sub $32, %rsp 
 
mov %rax, %rdi 
mov $0, %rax         ; sys_read
lea -32(%rbp) , %rsi
mov $32, %rdx
syscall
 
add $32, %rsp
1
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
07.04.2020, 07:39  [ТС]
Цитата Сообщение от Emilien Посмотреть сообщение
Тут нужно загрузить адрес с помощью lea.

нет. что -то не то.


Assembler
1
2
3
4
5
6
7
8
mov $5, %rax
mov $file, %rbx
mov $0x002, %rcx
mov $0x1b6, %rdx
int $0x80
 
// тут я открыл файл
теперь его дескриптор лежит в rax


Assembler
1
2
3
4
5
6
mov %rax, %rbx; тут я помещаю дескриптор в rbx.  тут не нужен 0 как вы написали. ноль -это стандартный ввод. клавиатура.
mov $3, %rax
mov -32(%rbp) , %rcx
mov $32, %rdx
 
int $0x80
0
1137 / 685 / 412
Регистрация: 07.11.2015
Сообщений: 1,102
07.04.2020, 11:34
pcmax, что не так?
Я привёл пример вызова не int $0x80, а syscall
Там параметры загружаются в другие регистры RDI (первый параметр), RSI (второй), RDX (третий), R10 (четвёртый), R8 (пятый), R9 (шестой).
И номера функций в RAX там другие http://blog.rchapman.org/posts... or_x86_64/
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8655 / 4490 / 1669
Регистрация: 01.02.2015
Сообщений: 13,898
Записей в блоге: 12
07.04.2020, 11:44
Да, ошибся я с определением адреса и не учёл x64.
Emilien совершенно прав по каждому пункту:
- lea
- syscal
- другой набор регистров, соответствующий syscall

Есть смысл прислушаться к совету. К этому - и первый вызов (открытие на чтение) перевести на syscall.
Кроме того, каждая файловая операция должна выводить диагностическое сообщение при ошибке - резко сокращает поиск места ошибки.
0
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
07.04.2020, 12:01  [ТС]
Цитата Сообщение от Emilien Посмотреть сообщение
Я привёл пример вызова
допишите пожалуйста. гуглить это одно, а чтобы работало это другое.

вот рабочий кусок кода по чтению из файла. куда нужно вставить ваш кусок, чтобы чтобы прочитанно было не из секции не инициализированных данных, а из стека?
прошу вас, покажите как надо использовать ваш кусок кода из гугла.

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
.section .bss
viev: .space 16
 
 
.section .data
file: .asciz "t.txt"
 
 
.section .text
.global main
main:
 
mov $5, %rax
mov $file, %rbx
mov $0x002, %rcx
mov $0x1b6, %rdx
int $0x80
// тут я открыл файл
 
 
 mov %rax, %rbx
mov $viev, %rcx
mov $16, %rdx
int $0x80
// тут я прочитал из  файла в viev
 
mov $4, %rax
mov $1, %rbx
mov $viev, %rcx
mov $16, %rdx
int $0x80
 
// тут я вывел на экран
 
 
mov $1, %rax
int $0x80
как сделать так чтобы читалось и выводилось не из viev а из -8(%rbp) к примеру.

как использовать ваш кусок кода?
прошу вставте ваш код в этот что выше с учетом того что читать будет из -8(%rbp)

Добавлено через 1 минуту
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Да, ошибся я с определением адреса и не учёл x64.

да нет ошибки. напишите с использованием 32битных регистров. смысл в том, что не читается из стека. причем тут системные вызова? все работает, пока дело не доходит до чтения из -8(%rbp)

Добавлено через 3 минуты
работает, понимаете. я не прошу цеплятся к системным возовам, потому что код полностью рабочий и сними.


дело в том вопрос в другом, как записать в -8(%rbp) вместо viev и как прочитать из -8(%rbp) вместо viev.

вот в чем вопрос.
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8655 / 4490 / 1669
Регистрация: 01.02.2015
Сообщений: 13,898
Записей в блоге: 12
07.04.2020, 12:03
Правильно отметил Emilien - чтобы поместить в rcx адрес строки для вывода на экран, а перед этим поместить туда текст из файла - нужно использовать не mov, а lea.
0
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
07.04.2020, 12:09  [ТС]
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Emilien совершенно прав по каждому пункту:
https://cyberstatic.net/images/editor/bold.gif


прав он будет по каждому пункту, когда напишет рабочий код. а не закинет цитаты из гугла.

Добавлено через 1 минуту
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Правильно отметил Emilien - чтобы поместить в rcx адрес строки для вывода на экран, а перед этим поместить туда текст из файла - нужно использовать не mov, а lea.

пожалуйста напишите с использованием lea. хоть с чем, лишь бы работало. просим

Добавлено через 3 минуты
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
.section .bss
viev: .space 16
 
 
.section .data
file: .asciz "t.txt"
 
 
.section .text
.global main
main:
 
mov $5, %rax
mov $file, %rbx
mov $0x002, %rcx
mov $0x1b6, %rdx
int $0x80
// тут я открыл файл
 
 
 mov %rax, %rbx
mov $viev, %rcx
mov $16, %rdx
int $0x80
// тут я прочитал из  файла в viev
 
mov $4, %rax
mov $1, %rbx
mov $viev, %rcx
mov $16, %rdx
int $0x80
 
// тут я вывел на экран
 
 
mov $1, %rax
int $0x80
куда написать lea и где изменить viev на -8(%rbp) ?
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8655 / 4490 / 1669
Регистрация: 01.02.2015
Сообщений: 13,898
Записей в блоге: 12
07.04.2020, 13:06
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
sub $32, %rsp ;выделить место в стеке под локальные переменные - в данном случае под буфер
 
mov %rax, %rbx
mov $3, %rax
lea -32(%rbp) , %rcx
mov $32, %rdx
 
int $0x80
 
;теперь можно выводить
mov $4, %rax
mov $1, %rbx
lea -32(%rbp), %rcx
mov $16, %rdx
int $0x80
 
;восстановим стек от локальных переменных
add $32, $rsp
 
leave
ret
0
1137 / 685 / 412
Регистрация: 07.11.2015
Сообщений: 1,102
07.04.2020, 13:18
Лучший ответ Сообщение было отмечено ФедосеевПавел как решение

Решение

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
.section .data
file: .asciz "t.txt"
 
.section .text
.global main
main:
 
push %rbp
mov %rsp, %rbp
 
mov $5, %eax
mov $file, %ebx
mov $0x002, %ecx
mov $0x1b6, %edx
int $0x80
// тут я открыл файл
 
sub $32, %rsp 
 
mov %rax, %rdi 
mov $0, %rax         # sys_read
lea -32(%rbp) , %rsi
mov $32, %rdx
syscall
 
mov %rax, %rdx
mov $1, %rax         # sys_write
mov $1, %rdi         # STDOUT
lea -32(%rbp) , %rsi
syscall
 
 
mov $1, %rax
int $0x80
2
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
07.04.2020, 14:11  [ТС]
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
теперь можно выводить

у вас выводит?

Assembler
1
2
3
4
5
6
mov $viev, %rcx // читает из памяти
 
если мы подсунем 
lea -32(%rbp), %rcx   то  lea поместит в rcx адрес.  mov же может достать оттуда значение, чего не может lea. 
 
 вобщем ребята  нам всем надо учиться азам. и мне и вам.
Добавлено через 45 минут
Цитата Сообщение от Emilien Посмотреть сообщение
int $0x80
а что не syscall ?
0
1137 / 685 / 412
Регистрация: 07.11.2015
Сообщений: 1,102
07.04.2020, 14:33
Лучший ответ Сообщение было отмечено ФедосеевПавел как решение

Решение

Для открытия файла и выхода из программы можо обойтись int $0x80, а вот для чтения в буфер и вывода на экран уже нужен syscall, так как буфер в стеке и адрес его в районе 0x7fffffffd000, а в ecx поместится только 0xffffd000.
Онлайн песочница https://www.onlinegdb.com/BJNXfy5wL
2
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
07.04.2020, 15:15  [ТС]
что психовать то? щас только говорили мне что неправильно делаю, что использую int $0x80 и тут же пишут.

тут int $0x80
тут sycall.

или бы написали все в 32 виде, или в 64.

так всегда. напишут лишь бы отвязался.

Добавлено через 1 минуту
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
mov %rax, %rdi 
mov $0, %rax         # sys_read
lea -32(%rbp) , %rsi
mov $32, %rdx
syscall
 
хочу понять  в чем проблема.
 
если выкинуть этот кусок и использовать 
call printf 
 
то как?
Добавлено через 34 минуты
все. написал. спасибо
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8655 / 4490 / 1669
Регистрация: 01.02.2015
Сообщений: 13,898
Записей в блоге: 12
07.04.2020, 16:16
У меня нет Linux. Поэтому файловые операции проверить не могу.
Недавно нашёл онлайн компилятор NASM + Linux - там проверяю вывод строк, но с файлами - там невозможно.
Поэтому я просто исправлял некоторые ошибке в вашем коде и показывал исправления. Именно знаний в программировании под Linux x64 при помощи gas - у меня нет совсем, надеялся на вашу собственную работу.

Добавлено через 1 минуту
Поделитесь итоговым результатом - кому-то будет тоже интересно.
0
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
07.04.2020, 21:51  [ТС]
Лучший ответ Сообщение было отмечено ФедосеевПавел как решение

Решение

пишу из головы. могу сделать ошибку. но примерно так
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
.section .data
file: .asciz  "t.txt\0"
format .string "%s"
.section .text
.global main
main:
push %rbp
mov %rsp, %rbp
subq $64, %rsp
 
mov $5, %rax
mov $file, %rbx
mov $0x002, %rcx
mov $0x1b6, %rdx
int $0x80
 
 
mov %rax, %rdi
mov $0, %rax
lea -16(%rbp), %rsi
mov $5, %rdx
syscall
 
lea -16(%rbp), %rsi
lea format(%eip), %rdi
call printf
leave 
ret
что то такое придумал

Добавлено через 4 часа 5 минут
Цитата Сообщение от pcmax Посмотреть сообщение
что то такое придумал
ну насчет придумал, это очень сказанно. думали тут всем форумом. посути собрали от каждого в этой теме, построчке.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.04.2020, 21:51
Помогаю со студенческими работами здесь

Чтение строки из файла в переменную
Хотел с помощью getline поместить текст из строки в файле в массив arr, а затем кинуть текст в textline, но конечно же ничего не выходит. ...

Чтение значений из файла в переменную
Дан файл input.txt в нем 3 значения{1,2,3} Как сделать так, чтобы в переменные a,b,c записывались соответствующие значения(a=1;b=2;c=3)?

Чтение из файла в переменную типа string
Добрый вечер! :) Вот делаю программу в одном из элементов которой нужно прочесть из файла в переменную типа string имя продукта так вот я...

Регулируемое чтение символов из файла в переменную
Есть файл hq.txt его я формирую запросом, он содержит такие строки. "CN=TEST7,OU=Test,DC=contoso,DC=local" ...

Чтение в переменную одного значения из файла:
Здравствуйте, подскажите пожалуйста почему на Reset(f) ощипка даёт ? var f : TextFile; s : String; begin AssignFile(f,...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru