Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用sys_brk在Linux上的英特尔汇编中进行动态内存分配_Linux_Assembly_X86_Dynamic Memory Allocation_Inline Assembly - Fatal编程技术网

使用sys_brk在Linux上的英特尔汇编中进行动态内存分配

使用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那个么我应该做些什么来保证它的安全,如何告诉编译

所以我尝试用汇编语言(AT&T表示法)在C程序中动态分配内存。问题是我的分配不起作用。当我试图将一个值写入brk地址时,我得到了分段错误(访问冲突)。我还比较了分配前后的brk地址,它们是相同的,所以我猜它不起作用。 我想添加的信息是,我想分配一堆内存页。 代码:


您的内联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)
    );

//...