2016-06-19 150 views
0

我试图通过更改brk将堆大小增加100,我不知道为什么我的代码无法工作。
这里是代码的一部分,试图做到这一点:无法更改堆大小AMD64

movq $0, %rdi 
movq $12, %rax 
syscall 
movq %rax, InicialHeap 

movq InicialHeap, %rsi 
mov $str, %rdi 
call printf 

movq $100, %rdi 
movq $12, %rax 
syscall 

movq %rax, %rsi 
mov $str, %rdi 
call printf 

movq InicialHeap, %rdi 
movq $12, %rax 
syscall 

movq InicialHeap, %rsi 
mov $str, %rdi 
call printf 

movq $60, %rax 
syscall 

程序应打印出类似这样:
X(打印InicialHeap)
X + 100(打印InicialHeap + 100)
X(打印InicialHeap)
但它只打印3次相同的结果“x”。
我需要做些什么来增加我的堆大小?

+0

为什么会加100在第二个电话,但不能添加存储在'InicialHeap'在第三个电话的价值? –

+1

你可以重新运行你的程序strace和发布结果?例如,'strace。/ a.out'。 Strace将打印所有系统调用,解码其参数并显示和解码返回值。你的操作系统是什么?在linux brk中有点奇怪:http://linux.die.net/man/2/brk。 – osgx

+0

虽然不是对这个问题的回答,但是可以在这个SO回答中找到一些使用NASM(非GNU汇编程序)的示例32位代码(不是64位):http://stackoverflow.com/a/33903235/3857942。该代码确实使用'brk' 32位系统调用,但该代码中的想法应该适用于在汇编器中使用64位系统调用,而且花费最少。 –

回答

0

作为the man page for int brk(void *addr); describes注释部分,系统调用(__NR_brk = 12)实际实现brk(),不sbrk,但返回当前休息,而不是一个整数。

作为@osgx评论,请尝试在strace下运行您的程序以查看您获得的返回值。例如从strace /bin/true,你可以看到,这是正常的动态链接程序使用brk(0)找出当前突破开始:

brk(0)         = 0x24c6000 

从那里,你应该保存返回值,让你的下一次调用brk()与此相抵。


您当前的代码显然不能工作:

movq $100, %rdi 
movq $12, %rax 
syscall    ;; brk((void*)100)