2016-06-19 152 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)