2016-06-04 5 views
1

최근에 책 Programming from the Ground Up에서 x86 어셈블리를 배우려고했지만 x86-64 컴퓨터가있어서 한 점에서 일이 잘못되기 시작합니다. . 내가 함수를 다루는 곳, 특히 의 힘 예제를 얻었습니다. 이 예제에서 그는 스택에 매개 변수를 푸시 한 다음 나중에 함수에 레지스터에 복사합니다. (주석 물론어셈블리 x86-64 스택에서 함수 매개 변수를 가져옴

pushl $3      # second argument 
pushl $2      # first argument 
call power      # call function 
... 
power: 
    pushl %ebp     # save old base pointer 
    movl %esp, %ebp    # make stack pointer the base pointer 
    subl $4, %esp     # get room for our local storage 

    movl 8(%ebp), %ebx   # put first argument in %eax 
    movl 12(%ebp), %ecx   # put second argument in %ecx 

, 이것은 32 비트이고, 나는 64 비트를 실행하는거야, 그래서 나는 이런 식으로 뭔가와 끝까지하는 레지스터와 명령어 접미사를 업데이트하려고 : 여기처럼 자신의 코드가 어떻게 표시되는지를 보여줍니다)이 시간이 필요하지 말아야 :

pushq $3 
pushq $2 
call power 
... 
power: 
    pushq %rbp 
    movq %rsp, %rbp 
    subq $4, %rsp 

    movq 8(%rbp), %rdi 
    movq 12(%rbp), %rsi 

을 감안할 때, 난 그냥 사용하기로되어있어 실제 레지스터를 혼동 할 수도 있지만 나는 완전히 확실하지 않다.

(gdb) i r rdi 
rdi   0x400081 4194433 
: 내가 아는 내가 명령 한 후 GNU 디버거 %의 RDI의 값을 인쇄 할 때 나는 다음과 같은 얻을 고려하여 메모리 주소가 아니라 그것의 내용을 가지고있는 것처럼 movq 8(%rbp), %rdi이 날 것으로 보인다이다

또한 어셈블리 애호가들을위한 포럼 같은 것이 있습니까? 나는 기본적인 검색을 해왔지만 하나를 찾지 못했다. (단지 하나의 포스트를 가진 x86 어셈블리 포럼을 제외하고 그것은 환영 포스트, http://www.x86-assembly.org/).

감사합니다.

+1

인수가 x86-64 ABI의 스택에 없습니다. –

+0

qwords는 4bytes가 아닌 8bytes이므로,이 'movq 8 (% rbp), % rdi'를'movq 16 (rbp)'(다음 줄과 같은 일)로 변경하면 인수 용 레지스터를 사용할 수 있습니다. syscall이 x86-64-abi를 사용하도록합니다. – sivizius

답변

3

표준 64 비트 규칙은 스택을 사용하지 않으므로 레지스터에 처음 몇 개의 인수 (허용 유형)를 전달합니다. 물론 자신 만의 코드로 스택을 사용할 수 있습니다. 그들은 적절한 크기, 8 바이트 대신 4

subq $ 4 %의 RSP를 사용하도록하지만, 당신은 당신의 오프셋을 조정해야

당신이 무엇을 알고하지 않으면 당신은 정말 8의 배수를 사용한다 하고있다.

movq 8 (%의 RBP), %의 RDI

당신은이 첫 번째 인수 될 것으로 기대하지만 그것은 아니다. 실제로 각 항목은 8 바이트이므로 스택의 리턴 주소입니다. 따라서 0(%rbp)에 푸시 된 rbp이 있고 8(%rbp)이 반송 주소입니다. 따라서 16(%rbp)이 첫 번째 인수이고 24(%rbp)이 두 번째 인수입니다.

대부분의 환경에서 여전히 32 비트 코드를 작성할 수 있으므로이 책을 계속 사용하려면 64 비트로 조정하지 말고 32 비트 코드를 사용하는 것이 좋습니다.

추신 : 디버거를 사용하기위한 쿠키를 얻었습니다.