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

Mmap, malloc, обращение к одному и тому же массиву

30.10.2021, 16:25. Показов 2579. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
1. Надо мне считать файл (любой). Как его отобразить на память. Файл может быть и гигабайт 10, но столько физической памяти у меня нет. Прочитал, что его можно отобразить на память, но мне нужен пример, не понимаю, как это сделать (массив mem)

2. После обработки данных формируется другой массив, write, меньше по размеру исходного файла. Мне на следующей итерации надо чтобы в команду lea rax, [mem] подгрузился адрес начала массива write. Тоже нужен пример

3. lea rax, [mem] - в rax - текущий элемент массива rax
mov rax, 1 - в rax - точно не первый элемент массива. Как через lea правильно сначала обратиться к 34487 элементу массива [mem], а затем к 7654 элементу массива. Или лучше через mov (как, нужен пример)?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.10.2021, 16:25
Ответы с готовыми решениями:

Значение счётчика в цикле изменяется, но обращение к массиву - к одному и тому же элементу
Написал программу, в ней посимвольно должны символы из строки mas попадать в al, но не смотря на то, что счетчик увеличивается, в al...

Обращение к одному и тому же классу из разных классов
Здравствуйте! Пишу в классах(впервые относительно большой проект), до этого писал код в кадрах. Столкнулся с проблемой обращения к...

Обращение к одному и тому же результату запроса в цикле
Ребята, подскажите пожалуйста по тех. особенностям работы Linq запросов. Я вот раньше полагал, что при первом обращении к переменной...

8
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
30.10.2021, 16:58
Цитата Сообщение от arego Посмотреть сообщение
можно отобразить на память, но мне нужен пример
Пример использования Вы можете посмотреть в справочных руководствах по библиотечным функциям и системным вызовам mmap()
https://pubs.opengroup.org/onl... /mmap.html
https://www.man7.org/linux/man... map.2.html
https://linux.die.net/man/3/mmap
C
1
2
3
// fildes = open(...)
address = mmap(0, len, PROT_READ, MAP_PRIVATE, fildes, some_offset)
/* Use data at address. */
len - размер проецируемых данных
some_offset - от начала файла до данных

Цитата Сообщение от arego Посмотреть сообщение
lea rax, [mem] - в rax - текущий элемент массива rax
mov rax, 1 - в rax - точно не первый элемент массива. Как через lea правильно сначала обратиться к 34487 элементу массива [mem], а затем к 7654 элементу массива.
В общем случае, если mem - "статический" массив, для которого пространство резервируется при компоновке, а индекс 34487 известен во время ассемблирования:
Assembler
1
lea rax, [mem + 34487 * mem_element_size ]
после чего в rax адрес 34487 элемента массива.
0
0 / 0 / 0
Регистрация: 01.06.2019
Сообщений: 9
01.11.2021, 14:11  [ТС]
для первой итерации чтение - mmap файл (mmap в массив mem)
запись - массив write

для второй итерации - чтение из массива write, запись в массив mem

для третьей - чтение из mem, запись в write

lea rax, [mem], загрузит в регистр адрес массива mem, a lea rax, [write] загрузит в регистр адрес массива write
Вот для чётных итераций надо, чтобы lea rax, [mem] грузил массив write, а lea rax, [write] грузил в регистр адрес массива mem.
Как сделать?
0
0 / 0 / 0
Регистрация: 01.06.2019
Сообщений: 9
02.11.2021, 18:06  [ТС]
По последнему вопросу ответили в чате ассемблерщиков в телеграме.

Есть ещё один вопрос - сколько тактов процессора занимает extern malloc/extern free (примерно)?
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
04.11.2021, 07:28
arego, без учёта самой реализации free() и malloc()?
Вы можете оценить самостоятельно и измерить для Вашей машины, зная, какие инструкции используются для передачи аргументов, вызова и возврата в исходное состояние.
0
0 / 0 / 0
Регистрация: 01.06.2019
Сообщений: 9
04.11.2021, 12:33  [ТС]
Замеры скорости работы malloc'а на Windows и Linux - вот такое нашёл по malloc.

А вот как в насме реализовать mmap и malloc - пока не понял.

Добавлено через 2 часа 2 минуты
https://codereview.stackexchan... m-assembly - вот здесь хорошо расписаны системные вызовы для работы с файлами, а вот как сделать mmap и malloc похожим способом - не могу сообразить.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
05.11.2021, 10:18
arego, пример по ссылке для 32-разрядного linux.
В x86_64 другой ABI.
См., например, закреплённую тему раздела Системные вызовы в Linux
Bash
1
man syscall
https://man7.org/linux/man-pag... all.2.html
https://man7.org/linux/man-pag... lls.2.html
https://man7.org/linux/man-pages/man2/mmap.2.html
Windows Batch file
1
gdb -q /lib/x86_64-linux-gnu/libc.so.6 -ex starti -ex 'disass mmap' -ex q
Кликните здесь для просмотра всего текста
Code
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
Dump of assembler code for function mmap64:
   0x000055555566fa20 <+0>:     endbr64
   0x000055555566fa24 <+4>:     test   $0xfff,%r9d
   0x000055555566fa2b <+11>:    jne    0x55555566fa58 <mmap64+56>
   0x000055555566fa2d <+13>:    push   %rbp
   0x000055555566fa2e <+14>:    mov    %rdi,%rbp
   0x000055555566fa31 <+17>:    push   %rbx
   0x000055555566fa32 <+18>:    mov    %ecx,%ebx
   0x000055555566fa34 <+20>:    test   %rdi,%rdi
   0x000055555566fa37 <+23>:    je     0x55555566fa70 <mmap64+80>
   0x000055555566fa39 <+25>:    mov    %ebx,%r10d
   0x000055555566fa3c <+28>:    mov    %rbp,%rdi
   0x000055555566fa3f <+31>:    mov    $0x9,%eax
   0x000055555566fa44 <+36>:    syscall
   0x000055555566fa46 <+38>:    cmp    $0xfffffffffffff000,%rax
   0x000055555566fa4c <+44>:    ja     0x55555566fab0 <mmap64+144>
   0x000055555566fa4e <+46>:    pop    %rbx
   0x000055555566fa4f <+47>:    pop    %rbp
   0x000055555566fa50 <+48>:    retq
   0x000055555566fa51 <+49>:    nopl   0x0(%rax)
   0x000055555566fa58 <+56>:    mov    0xcf411(%rip),%rax        # 0x55555573ee70
   0x000055555566fa5f <+63>:    movl   $0x16,%fs:(%rax)
   0x000055555566fa66 <+70>:    mov    $0xffffffffffffffff,%rax
   0x000055555566fa6d <+77>:    retq
   0x000055555566fa6e <+78>:    xchg   %ax,%ax
   0x000055555566fa70 <+80>:    test   $0x4,%dl
   0x000055555566fa73 <+83>:    je     0x55555566fa39 <mmap64+25>
   0x000055555566fa75 <+85>:    mov    0xcf3e4(%rip),%rax        # 0x55555573ee60
   0x000055555566fa7c <+92>:    testb  $0x2,0xcd(%rax)
   0x000055555566fa83 <+99>:    je     0x55555566fa39 <mmap64+25>
   0x000055555566fa85 <+101>:   mov    %ecx,%r10d
   0x000055555566fa88 <+104>:   mov    $0x9,%ecx
   0x000055555566fa8d <+109>:   xor    %edi,%edi
   0x000055555566fa8f <+111>:   or     $0x40,%r10d
   0x000055555566fa93 <+115>:   mov    %ecx,%eax
   0x000055555566fa95 <+117>:   syscall
   0x000055555566fa97 <+119>:   mov    %rax,%rdi
   0x000055555566fa9a <+122>:   cmp    $0xfffffffffffff000,%rax
   0x000055555566faa0 <+128>:   jbe    0x55555566fa4e <mmap64+46>
   0x000055555566faa2 <+130>:   mov    0xcf3c7(%rip),%rax        # 0x55555573ee70
   0x000055555566faa9 <+137>:   neg    %edi
   0x000055555566faab <+139>:   mov    %edi,%fs:(%rax)
   0x000055555566faae <+142>:   jmp    0x55555566fa39 <mmap64+25>
--Type <RET> for more, q to quit, c to continue without paging--
   0x000055555566fab0 <+144>:   mov    0xcf3b9(%rip),%rdx        # 0x55555573ee70
   0x000055555566fab7 <+151>:   neg    %eax
   0x000055555566fab9 <+153>:   mov    %eax,%fs:(%rdx)
   0x000055555566fabc <+156>:   mov    $0xffffffffffffffff,%rax
   0x000055555566fac3 <+163>:   jmp    0x55555566fa4e <mmap64+46>

Цитата Сообщение от arego Посмотреть сообщение
как в насме реализовать mmap и malloc - пока не понял.
Вы можете не реализовавать, а вызвать готовую функцию из стандартной библиотеки Вашей системы.
Если хотите выполнять какой-либо syscall самостоятельно, нужно знать его номер, параметры, возвращаемое значение, и как он сообщает о возможных ошибках.
0
0 / 0 / 0
Регистрация: 01.06.2019
Сообщений: 9
05.11.2021, 16:21  [ТС]
Assembler
1
2
3
4
5
6
7
8
9
 
mov rax, 9
mov rdi, 0 ; start
mov rsi, 1 048 576 ; len в 1 мегабайт
mov rdx, 1 ; prot
mov r10, 1 ; flags
mov r8, DWORD [file] ; указатель/описатель файла
mov r9, 0 ; offset
int 80h
вот примерно так должен выглядеть mmap 1 мегабайта

а malloc реализуется через sys_brk примерно так

Assembler
1
2
3
4
 
mov rax, 12
mov rdi, 1 048 576; malloc/sys_brk 1 мегабайта
int 80h
как теперь освободить память, выделенную sys_brk? А можно ли в nasm писать вместо цифр значение prot и flags, например mov rdx, PROT_NONE?
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
06.11.2021, 08:54
Цитата Сообщение от arego Посмотреть сообщение
можно ли в nasm писать вместо цифр значение prot и flags, например mov rdx, PROT_NONE?
Для этого nasm, внешний препроцессор или компоновщик должны знать, что подставлять вместо PROT_NONE. Точно так же, как и с другими символическими обозначениями, такими как rdx или mov.
Assembler
9
int 80h
int 128 нужно только для взаимодествия с (устаревшим) 32-разрядным кодом.
64-разрядный linux имеет право его вообще не обрабатывать, если при сборке была отключена совместимость с 32-разрядным linux.
Цитата Сообщение от x86_64 ABI
The kernel interface uses %rdi, %rsi, %rdx, %r10, %r8 and %r9.
2. A system-call is done via the syscall instruction. The kernel destroys registers %rcx and %r11.
3. The number of the syscall has to be passed in register %rax.
4. System-calls are limited to six arguments, no argument is passed directly on the stack.
5. Returning from the syscall, register %rax contains the result of the system-call. A value in the range between -4095 and -1 indicates an error, it is -errno.
https://refspecs.linuxbase.org... tion.A.2.1
Нормальная 64-разрядная программа для linux x86-64 должна использовать инструкцию
Assembler
1
syscall
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.11.2021, 08:54
Помогаю со студенческими работами здесь

Как сделать чтобы обращение к одному и тому же сайту происходило быстрей в FireFox 48.0.2
Собственно имеются ресурсы, к которым обращаюсь по несколько раз за день! Можно ли как-то ускорить сёрфинг по ним? Интернет 3G, поэтому...

Обращение к одному массиву как к массивам с разной размерностью
Доброй ночи, коллеги. Пришлось мне тут переписывать программу с фортрана на делфи и возникла проблема. В Фортране я могу выделить...

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

Как обратиться к одному и тому же запросу
Есть запрос : $result = mysql_query(&quot;SELECT Accounts.Num, accounts.ID,passed.Name AS Name,Passed.Status FROM Accounts, Passed WHERE...

Malloc (выделение памяти двумерному массиву) - проверить код
Здравствуйте, подскажите пожалуйста, есть ли логические ошибки в блоке &quot;Выделения памяти:&quot;? План по выделению памяти: 1....


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru