LINUX.ORG.RU

Доступ к динамически выделенной памяти из asm-кода

 , ,


0

1

Сделал модуль на asm:

BITS 64
SECTION .text

	global L4
	extern arr
	extern arr2
L4:
	LEA RBX,[arr]
	MOV qword [RBX+0], 234
	LEA RBX,[arr2]
	MOV qword [RBX+0], 345
	RET
Он пробует занести в одноэлементные массивы arr,arr2 64-битное значение. Однако, при доступе к arr2[0] из асма - вылетает по segfault. Где ошибка? Раньше под DOS я работал с памятью, устанавливая сегменты. А здесь в 64-битном режиме как?
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
extern __attribute__((fastcall,noinline)) void L4();
uint64_t arr[1];
uint64_t *arr2;
int main() {

	arr[0] = 0;
	arr2 = (uint64_t *)malloc(1*sizeof(uint64_t));
	arr2[0] = 0;
	L4();
	printf("%llu\n",(unsigned long long int)arr[0]); /* %I64u in Windows */
	printf("%llu\n",(unsigned long long int)arr2[0]);
	free(arr2);
	return 0;
}

★★★★★

Последнее исправление: pacify (всего исправлений: 2)

вангуя 50 следующих тредов с аналогичными вопросами

gcc -S -masm=intel -march=native -O3

anonymous
()

extern __attribute__((fastcall,noinline))

а разве для для 64битного ABI fastcall существует? Вроде ж выпилили весь зоопарк stdcall, cdecl, pascal, fastcall и прочие соглашения о вызовах, сделав одно стандартное

Harald ★★★★★
()
Ответ на: комментарий от anonymous
+ MOV RBX,[arr2]

Точно. Наверное я невнимательно пробовал этот вариант.

anonymous:

gcc -S ...

Дык, он в этом случае лишь для Си'шного OBJ-файла сделает дизасм. Или я что-то не понял?
Ассемблер простой бинарник [для дизассемблирования] не делает если есть внешние объекты:

yasm -w -f bin -m amd64 -o func.bin func.asm
ndisasm func.bin > func.S
error: binary object format does not support external references
P.S. Меня всего-лишь интересовал синтаксис нужного asm-оператора. Дизассемблирование этой информации не даст.
P.P.S. Недопонимание этих вещей - от того, что я учил асм для i286, а в универе нам постоянно при изучении Си говорили, что для массивов NAME и &NAME - эквивалентны. Наверное, препод ошибался? Это были 1995-1996 годы.

pacify ★★★★★
() автор топика
Ответ на: комментарий от Harald

а разве для для 64битного ABI fastcall существует?

Я examples для себя пишу. Лишнее в коде оставляю на память.

pacify ★★★★★
() автор топика
Ответ на: комментарий от pacify

я имел в виду

#include<cstdint>
#include<cstdio>

uint64_t a[2];

int main(){
  a[0]=66;
  a[1]=77;
  puts((char*)a);
}

main:
.LFB12:
  .cfi_startproc
  sub rsp, 8
  .cfi_def_cfa_offset 16
  mov edi, OFFSET FLAT:a
  mov QWORD PTR a[rip], 66
  mov QWORD PTR a[rip+8], 77
  call  puts
  xor eax, eax
  add rsp, 8
  .cfi_def_cfa_offset 8
  ret
  .cfi_endproc




#include<cstdint>
#include<cstdio>

int main(){
  uint64_t a[2];
  a[0]=66;
  a[1]=77;
  puts((char*)a);
}

main:
.LFB12:
  .cfi_startproc
  sub rsp, 24
  .cfi_def_cfa_offset 32
  mov rdi, rsp
  mov QWORD PTR [rsp], 66
  mov QWORD PTR [rsp+8], 77
  call  puts
  xor eax, eax
  add rsp, 24
  .cfi_def_cfa_offset 8
  ret
  .cfi_endproc

anonymous
()
Ответ на: комментарий от pacify

Проблема не в асме, а в непонимании в чем конкретно заключается работа компоновщика и как все это устроено.

mix_mix ★★★★★
()
Ответ на: комментарий от mix_mix

а в непонимании в чем конкретно заключается работа компоновщика и как все это устроено.

Я раньше писал на TASM/DOS. Для него не было описаний работы линкера. Можно ли сейчас найти какую-то книгу, где есть сравнительные примеры работы линкера? Сравнение с тем, как было раньше под DOS (с сегментами), и сейчас - для Yasm,NASM/Windows и Linux? Мне нужно не 1000-страничный мануал от INTEL, а что-то краткое, для начинающих. Но в тоже время, чтобы сравнивать со своим опытом 1990х - наглядность для меня имеет большое значение. Теория в 37летнем возрасте уже не очень усваивается, и времени нет «загребать» кучу знаний по-новой. Я встречал какой-то 200-страничный мануал про то, как устроена память под FreeBSD и Дреппера. Но это не то.

pacify ★★★★★
() автор топика
Ответ на: комментарий от pacify

Пацан пришёл на лор с интел-синтаксисом и иным маздайским говном, аля фасткалл, днище екстерны и прочее.

Сравнение с тем, как было раньше под DOS (с сегментами), и сейчас - для Yasm,NASM/Windows и Linux?

Ну это уже синдром секретарши, аля «осёл - и есть интернет». Смысла в объяснении нет.

Можно ли сейчас найти какую-то книгу, где есть сравнительные примеры работы линкера?

То говно, что ты видел - это говно. Задача «линкера» - это пройтись реплейсом имя/дифф - всё. И дос/хреном и масм/говнясм тут не причём.

Но в тоже время, чтобы сравнивать со своим опытом 1990х - наглядность для меня имеет большое значение.

Опыт. Громко сказано, скорее бесполезное и бездумное, бездарное, без малейшего понимания сути, ваяние говна со «знаниями» основанными на убогой, протухшей, не имеющей к реальности никакого отношения макулатуры и мусора из пустых черепушек таких же адептов.

Теория в 37летнем возрасте уже не очень усваивается, и времени нет «загребать» кучу знаний по-новой.

Проблема в том, что она никогда не усваивалась. Это было следствие мейнстрима и обезьяньего эффекта в нём, - подражательства, - т.е. любая обезьяна может подражать среде.

И чем дальше бабуин уходит от мейнстрима, который его несёт - тем в большее он превращается говно. Вернее как, говном он и был, просто это сглаживалось.

Т.е. все твои «знания» - это банальный набор примитивных ассоциаций, аля «желаемый эффект - шаблонное действие». Среда тебя наградила готовыми решения для достижения желаемого эффекта, но она уже ушла, а шаблончики начинают давать сбой.

Примитивный комбинатор готовых решений вместо мозга, способного думать и создать, а в следствии решать задачи - это неизлечимо, да.

При этом всё гуглиться за секунды.

anonymous
()
Ответ на: комментарий от anonymous

При этом всё гуглиться за секунды.

Правописание так еще и вообще в школе проходят, о гуру!

anonymous
()
Ответ на: комментарий от anonymous

Lugovsky, ты что-ли? Как будто с листа зачитываешь.

P.S.Детей-то родил уже, или всё холостяком живёшь?

pacify ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Ты мне можешь описать, что с моим писанием не так - я буду писать так. Ну и да, зачем истинному пацану школа? Это для лахов.

anonymous
()
Ответ на: комментарий от pacify

Lugovsky, ты что-ли? Как будто с листа зачитываешь.

Не угадал.

Ты мне лучше расскажи что понял. По теме. Я что зря портянку писал?

anonymous
()
Ответ на: комментарий от pacify

P.S.Детей-то родил уже, или всё холостяком живёшь?

Ты где нибудь видел беременную правую руку? Вот то то же ... :)

anonymous
()
Ответ на: комментарий от anonymous

anonymous

Как у нас принято - «насрал, убери за собой». Попроси админов, чтобы они за тобой убрали. =)

pacify ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.