최근에 책 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/).
감사합니다.
인수가 x86-64 ABI의 스택에 없습니다. –
qwords는 4bytes가 아닌 8bytes이므로,이 'movq 8 (% rbp), % rdi'를'movq 16 (rbp)'(다음 줄과 같은 일)로 변경하면 인수 용 레지스터를 사용할 수 있습니다. syscall이 x86-64-abi를 사용하도록합니다. – sivizius