Задать вопрос

Как передать память из Си в ассемблер?

Хочу сделать обращение к массиву (со смещением) через вставку на ассемблере.

Код без ассемблера выглядит просто и работает:

#include <stdio.h>
#include <stdlib.h>

const unsigned int SIZE = 131049;
const unsigned int INDEX = 10;

int main()
{
	char *arr = (char*)malloc(SIZE * sizeof(char));
	arr[INDEX] = 0x5f;
	
	unsigned int x = arr[INDEX];
	printf("Array adress: %x\nArray adress + INDEX: %x\nResult: %x\n", (void *)arr, ((void *)arr) + INDEX, x);
}


Код на ассемблере падает с segmentation fault:

int main()
{
	char *arr = (char*)malloc(SIZE * sizeof(char));
	arr[INDEX] = 0x5f;
	
	unsigned int newAddress = 0;
	unsigned int x = 0;

	asm volatile (
		"movl %[INDEX], %%eax  \n"
		"addl %[arr], %%eax  \n"
		"movl %%eax, %[newAddress] \n"
		"movl (%%eax), %[x] \n"
		: [newAddress] "=r" (newAddress), [x] "=r" (x)
		: [INDEX] "r" (INDEX), [arr] "m" (arr)
		: "eax", "memory"
	);

	printf("Array adress: %x\nArray adress + INDEX: %x\nResult: %x\n", (void *)arr, newAddress, x);
}


При SIZE < 131049 оба примера работают одинаково. Цифра выведена экспериментально.

Что я делаю не так во втором примере?

PS:

Похоже что это почти 2^17 (131072). Догадываюсь что это как то связано с размерностью регистров, но знаний не хватает чтобы исправить код.

PSPS:

Собираю просто через g++.
  • Вопрос задан
  • 730 просмотров
Подписаться 5 Простой 2 комментария
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Разработчик C++
    9 месяцев
    Далее
  • Нетология
    Специалист по информационной безопасности + нейросети
    12 месяцев
    Далее
  • Компьютерная академия «TOP»
    Учебная программа “Разработка программного обеспечения”
    30 месяцев
    Далее
  • Нетология
    Разработчик на C++: Профессия + специализация + нейросети
    12 месяцев
    Далее
  • Skillbox
    Разработчик на C++
    7 месяцев
    Далее
  • Специалист.ру
    Программирование на языке C (Си)
    1 месяц
    Далее
  • Специалист.ру
    Программирование на Visual С++
    1 месяц
    Далее
  • XYZ School
    Геймплей-программирование
    5 месяцев
    Далее
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Неправильный констрейнт:
[arr] "m" (arr)

вместо "m" должно быть "r". "m" означает память на которую ссылается выражение, "r" -- само выражение.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@asd111
Компилируй в ассемблерный код g++ -S main.c
И твой вопрос отпадет сам собой.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы