스택 대신 레지스터를 사용하여 x64 어셈블리에서 C 함수 호출

미노루

이 대답은 나를 당혹스럽게했다.

에 따르면 표준 C 호출 규칙 , C 함수를 호출 할 수있는 표준 방법이다 push스택과 인수 call서브 루틴. 이는 적절한 인수로 다른 레지스터를 설정 한 다음 다른 레지스터를 설정하는 syscall분명히 다릅니다 syscall.

그러나 위에서 언급 한 답변은 다음 GAS 코드를 제공합니다.

        .global main
        .section .data
hello:  .asciz "Hello\n"
        .section .text
main:
        movq $hello, %rdi
        movq $0, %rax
        call printf
        movq $0, %rax
        ret

있는 작품 gcc hello.s -o hello. 호출하는 부분 printf은 다음과 같습니다.

        movq $hello, %rdi
        movq $0, %rax
        call printf

rdi스택이 아닌 레지스터를 사용 하여 인수를에 전달합니다 printf. 위를 다음으로 변경

        push $hello
        call printf

분할 오류가 발생합니다.

printf는 C 함수 이기 때문에 ,와 달리 sys_write인수는 레지스터가 아니라 스택에 전달되어야한다고 생각합니다. 내가 여기서 무엇을 오해하고 있습니까? 다음과 같은 다른 표준 C 함수는 malloc어떻습니까?

(어떤 참조라도 진정으로 감사하겠습니다.)

브렛 헤일

가변 함수에 인수를 전달하는 것은 더 복잡합니다. x86-64 ELF ABI , 섹션 3.5.7을 참조하십시오 . 그렇지 않으면 x86-64는 레지스터를 사용하여 처음 6 개의 인수를 전달합니다 %rdi, %rsi, %rdx, %rcx, %r8, %r9(부동 / 벡터 인수 제외).

사양에 %rax = 0따르면 가변 인수 목록에 벡터 레지스터에 전달 된 부동 소수점 인수가 없습니다 (0). 당신의 접근 방식은 첫 번째 인수 (예를 들어, NUL 종료 문자열 :로, 잘못 "Hello\n")에 전달해야 %rdi하고, %rax함수가 호출 될 때 0이어야합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

x64 VC ++를 호출하는 어셈블리 함수

분류에서Dev

어셈블리 이름을 사용하여 C # 웹 서비스 메서드에 대한 JavaScript 직접 호출

분류에서Dev

리눅스에서 C 코드에서 어셈블러 함수를 호출

분류에서Dev

x64 어셈블리 함수를 호출 한 후 C ++ 변수가 0으로 재설정 됨

분류에서Dev

C 언어에서 시스템 라이브러리 함수 대신 내 함수를 호출하는 방법

분류에서Dev

Python에서 다중 처리를 사용하여 함수 대신 클래스 내에서 함수 호출

분류에서Dev

스택 기반 호출 규칙을 사용한 어셈블리 함수 호출

분류에서Dev

어셈블리에서 제대로 함수를 호출하는 방법

분류에서Dev

JNI를 사용하여 호스트 바이너리에서 C 함수 호출

분류에서Dev

C는 주소 대신 값을 어셈블리 함수 (x64)에 전달합니다.

분류에서Dev

aarch64 어셈블리 함수 호출 이해, 스택 작동 방식

분류에서Dev

x86 아키텍처에서 C에서 어셈블리 함수를 호출하는 방법은 무엇입니까?

분류에서Dev

C ++ (nasm)에서 호출 된 어셈블리 함수의 포인터 주소에 값 복사

분류에서Dev

C 프로그램에서 x86 어셈블리 함수를 호출 할 때 분할 오류

분류에서Dev

C (double), GAS에서 ASM x64 함수 호출

분류에서Dev

Sparc 어셈블리-전역 레지스터가 함수 호출 전체에서 일관되지 않음

분류에서Dev

32 비트 x86 AT & T 어셈블리에서 C 함수 호출 문제

분류에서Dev

ARM 어셈블리에서 읽기 시스템 호출 사용

분류에서Dev

신속하게 어셈블리에 정의 된 함수 호출

분류에서Dev

역 참조를 사용하여 어셈블리의 함수에 대한 포인터를 호출 할 수 있습니까?

분류에서Dev

x86-64 어셈블리 언어의 지역 변수 레지스터에 대한 질문

분류에서Dev

인라인 함수를 사용하여 어셈블리에 대한 호환성 유지

분류에서Dev

ac 함수에서 performSelector를 사용하여 대리자 호출

분류에서Dev

C #에서 x64 C ++ DLL 호출, 프로세스 중단 (업데이트)

분류에서Dev

x86 어셈블리에서 imul에 대해 두 개의 개별 레지스터를 사용하는 것이 더 낫습니까?

분류에서Dev

GNU 어셈블러, 스택을 사용한 함수 호출, 세그 오류

분류에서Dev

C ++ : 파생 클래스에 대한 포인터를 사용하여 가상 함수 호출에 여전히 vlookup이 있습니다.

분류에서Dev

C #의 안전하지 않은 코드 컨텍스트에서 신뢰할 수없는 어셈블리 란?

분류에서Dev

C ++ 함수 호출에 멈춘 보조 스레드를 사용하여 pthread 취소

Related 관련 기사

  1. 1

    x64 VC ++를 호출하는 어셈블리 함수

  2. 2

    어셈블리 이름을 사용하여 C # 웹 서비스 메서드에 대한 JavaScript 직접 호출

  3. 3

    리눅스에서 C 코드에서 어셈블러 함수를 호출

  4. 4

    x64 어셈블리 함수를 호출 한 후 C ++ 변수가 0으로 재설정 됨

  5. 5

    C 언어에서 시스템 라이브러리 함수 대신 내 함수를 호출하는 방법

  6. 6

    Python에서 다중 처리를 사용하여 함수 대신 클래스 내에서 함수 호출

  7. 7

    스택 기반 호출 규칙을 사용한 어셈블리 함수 호출

  8. 8

    어셈블리에서 제대로 함수를 호출하는 방법

  9. 9

    JNI를 사용하여 호스트 바이너리에서 C 함수 호출

  10. 10

    C는 주소 대신 값을 어셈블리 함수 (x64)에 전달합니다.

  11. 11

    aarch64 어셈블리 함수 호출 이해, 스택 작동 방식

  12. 12

    x86 아키텍처에서 C에서 어셈블리 함수를 호출하는 방법은 무엇입니까?

  13. 13

    C ++ (nasm)에서 호출 된 어셈블리 함수의 포인터 주소에 값 복사

  14. 14

    C 프로그램에서 x86 어셈블리 함수를 호출 할 때 분할 오류

  15. 15

    C (double), GAS에서 ASM x64 함수 호출

  16. 16

    Sparc 어셈블리-전역 레지스터가 함수 호출 전체에서 일관되지 않음

  17. 17

    32 비트 x86 AT & T 어셈블리에서 C 함수 호출 문제

  18. 18

    ARM 어셈블리에서 읽기 시스템 호출 사용

  19. 19

    신속하게 어셈블리에 정의 된 함수 호출

  20. 20

    역 참조를 사용하여 어셈블리의 함수에 대한 포인터를 호출 할 수 있습니까?

  21. 21

    x86-64 어셈블리 언어의 지역 변수 레지스터에 대한 질문

  22. 22

    인라인 함수를 사용하여 어셈블리에 대한 호환성 유지

  23. 23

    ac 함수에서 performSelector를 사용하여 대리자 호출

  24. 24

    C #에서 x64 C ++ DLL 호출, 프로세스 중단 (업데이트)

  25. 25

    x86 어셈블리에서 imul에 대해 두 개의 개별 레지스터를 사용하는 것이 더 낫습니까?

  26. 26

    GNU 어셈블러, 스택을 사용한 함수 호출, 세그 오류

  27. 27

    C ++ : 파생 클래스에 대한 포인터를 사용하여 가상 함수 호출에 여전히 vlookup이 있습니다.

  28. 28

    C #의 안전하지 않은 코드 컨텍스트에서 신뢰할 수없는 어셈블리 란?

  29. 29

    C ++ 함수 호출에 멈춘 보조 스레드를 사용하여 pthread 취소

뜨겁다태그

보관