2016-06-19 13 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)
しかし、それは同じ結果 "x"の3倍だけを出力します。
ヒープサイズを大きくするにはどうすればよいですか? the man page for int brk(void *addr); describesのNOTES部として

+0

なぜそれが第三の呼び出しで 'InicialHeap'に格納されている値を追加し、2番目の呼び出しで100を追加しますが、ないだろうか? –

+1

straceでプログラムを再実行して結果を投稿できますか?例えば、 'strace。/ a.out'のようにします。 Straceはすべてのシステムコールを出力し、パラメータをデコードし、戻り値を表示してデコードします。あなたのOSは何ですか? linuxでは、brkは少し奇妙です:http://linux.die.net/man/2/brk。 – osgx

+0

この質問への回答ではありませんが、このSOの回答にNASM(Not GNU assembler)を使用している32ビットコード(64ビットではない)の例があります:http://stackoverflow.com/a/33903235/3857942コードは 'brk' 32ビットシステムコールを使用しますが、そのコード内のアイデアは最小限の労力でアセンブラ内の64ビットシステムコールを使用するように適応可能でなければなりません。 –

答えて

0

、システムコール(= 12__NR_brk)は、実際brk()、ないsbrkを実装するが、現在のブレークではなく整数を返します。

@osgxのコメントとして、straceの下でプログラムを実行して、どのような戻り値が得られているかを確認してください。例えばあなたは戻り値を保存し、brk()にあなたの次の呼び出しを行う必要があり、そこから

brk(0)         = 0x24c6000 

strace /bin/trueから、あなたは、ダイナミックリンカが現在のブレークを見つけるためにbrk(0)を使用してオフに開始するために、それは通常のだと見ることができますそれと相殺されている。


あなたの現在のコードは明らかに動作しないことができます。

movq $100, %rdi 
movq $12, %rax 
syscall    ;; brk((void*)100) 
関連する問題