使用sys_brk在Linux上的英特尔汇编中进行动态内存分配
所以我尝试用汇编语言(AT&T表示法)在C程序中动态分配内存。问题是我的分配不起作用。当我试图将一个值写入brk地址时,我得到了分段错误(访问冲突)。我还比较了分配前后的brk地址,它们是相同的,所以我猜它不起作用。 我想添加的信息是,我想分配一堆内存页。 代码:使用sys_brk在Linux上的英特尔汇编中进行动态内存分配,linux,assembly,x86,dynamic-memory-allocation,inline-assembly,Linux,Assembly,X86,Dynamic Memory Allocation,Inline Assembly,所以我尝试用汇编语言(AT&T表示法)在C程序中动态分配内存。问题是我的分配不起作用。当我试图将一个值写入brk地址时,我得到了分段错误(访问冲突)。我还比较了分配前后的brk地址,它们是相同的,所以我猜它不起作用。 我想添加的信息是,我想分配一堆内存页。 代码: 您的内联asm不安全,因为您在未通知编译器的情况下对一组寄存器进行了填充。由于这是32位代码,如果您使用的是64位,请确保使用gcc-m32进行构建system@NateEldredge那个么我应该做些什么来保证它的安全,如何告诉编译
您的内联asm不安全,因为您在未通知编译器的情况下对一组寄存器进行了填充。由于这是32位代码,如果您使用的是64位,请确保使用
gcc-m32
进行构建system@NateEldredge那个么我应该做些什么来保证它的安全,如何告诉编译器呢?请阅读GNUCinlineASM手册。指向中的+指南的链接。不要使用asm()
,除非您确切知道自己在做什么。如果您不知道如何使用clobbers之类的工具,您可能希望在.S
文件中编写一个独立函数,您可以调用它。另外,我将使用两个独立的asm()
语句来实现这一点,每个语句只包含int$0x80
,并让编译器从纯C生成所有其他指令。@Steva Alekseyev-是的,这是用于uni项目的
//...
long int PAGE_SIZE = sysconf(_SC_PAGESIZE); //rozmiar strony
int w = 64
int buffer_size = PAGE_SIZE * w;
int address = 0;
__asm__ volatile (
"movl $45, %%eax\n"
"xorl %%ebx, %%ebx\n"
"int $0x80\n" //sys_brk - get the address of brk
"movl %%eax, %%esi\n" //current position of brk
"movl %%eax, %%ebx\n"
"addl %1, %%ebx\n" //4096(bytes)*64
"movl $45, %%eax\n"
"int $0x80\n"
"movl %%esi, %%eax\n"
"movl %%esi, %0\n" //starting addres
"movl $42, (%%esi)\n"
:"=g"(address)
: "g"(buffer_size)
);
//...