2016-06-19 6 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의 참고 섹션으로

+0

(100)를하지만, 세 번째 호출에 InicialHeap''에 저장된 값을 추가하지 :


명확하게 현재 코드가 작동하지 않을 수 있습니까? –

+1

strace로 프로그램을 다시 실행하고 결과를 게시 할 수 있습니까? 예를 들어,'strace./a.out'. Strace는 모든 syscall을 출력하고 매개 변수를 디코딩하며 반환 값을 표시하고 디코딩합니다. 당신의 OS는 무엇입니까? 리눅스에서 brk는 조금 이상합니다 : http://linux.die.net/man/2/brk. – osgx

+0

이 질문에 대한 대답은 아니지만 NASM (Not GNU assembler)을 사용하는 일부 32 비트 코드 (64 비트가 아님)는이 SO 답변에서 찾을 수 있습니다. http://stackoverflow.com/a/33903235/3857942. 이 코드는'brk' 32 비트 시스템 콜을 사용하지만, 최소한의 노력으로 어셈블러에서 64 비트 시스템 콜을 사용할 수 있도록 그 코드의 아이디어를 적용 할 수 있어야합니다. –

답변

0

, 시스템 호출 (= 12__NR_brk)은 실제로하지 sbrkbrk() 구현하지만 정수가 아닌 현재 휴식을 반환합니다.

@osgx 주석으로 strace에서 프로그램을 실행 해보면 어떤 반환 값을 얻을 수 있는지 알아보십시오. 예 : 당신이 반환 값을 저장하고 brk()에 다음 전화를해야한다, 거기에서

brk(0)         = 0x24c6000 

: strace /bin/true에서, 당신은 동적 링커가 현재 휴식을 찾아 brk(0)를 사용하여 시작하는 것이 정상입니다 것을 볼 수 있습니다 그걸 상쇄하고 두 번째 통화에

movq $100, %rdi 
movq $12, %rax 
syscall    ;; brk((void*)100) 
왜 추가 할 수