2016-10-19 4 views
2

실제로 사용할 수있는 메모리 포인트는 무엇입니까? 그것은이 C 코드에서 직접 코딩 것조립 인텔 x86을 사용하여 인수를 정의 할 수 있습니다.

int power(int x, int y);             * 
;***************************************************************************** 
%define x [ebp+8] 
%define y [ebp+12] 
power: 
    push ebp  
    mov ebp, esp 

    mov eax, y ;move y into eax 
    cmp eax, 0 ;compare y to 0 
    jne l10; ;if not equal, jump to l10 
    mov eax, 1 ;move 1 into eax 
    jmp l20; ;jump to l20, the leave, ret label 

l10: 
    mov eax, y ; move y into eax 
    sub eax, 1 ; y-1 
    push eax ; push y-1 onto stack 
    mov ebx, x ; move x into ebx 
    push ebx ; push x onto stack 
    call power ; call power/recursion 
    add esp, 8 ; add 8 to stack(4*2) for the two vars 
    imul eax, x ; multiply the returned value from call by x 

l20: 
    leave ; leave 
    ret ;ret 

: 내가 힘이 어셈블리 코드 (A, B) 재귀에 의해이

int power_c(int x, int y) { 
    if (y == 0) { 
     return 1; 
    } else { 
     return power_c(x, y - 1)*x; 
    } 
} 

ASM은 코드가 완벽하게 작동을, 어떤이 조정이 좋을 것 제안 , 나는 아직 조립에 익숙하지 않다. 내 질문은, 내가 실제로 인수를 정의하는 데 사용할 수있는 주소는 무엇입니까? 여기에 두 개가 있는데 두 개를 사용합니다.

%define x [ebp+8] 
%define y [ebp+12] 

내가 더 있으면 그냥 늘리면됩니까? 모두 int, 4bytes라고할까요?

%define x [ebp+8] 
%define y [ebp+12] 
%define z [ebp+16] 
%define a [ebp+20] 
%define b [ebp+24] 

내가 이상의 인수를 정의 할 필요가 코드를 사용하다가 충돌했습니다, 난 그냥이 알아낼 수 없습니다, 어떤 도움을 크게 감상 할 수있다.

+1

x와 y는 지역 변수가 아닌 함수 인수입니다. 그들은 다르게 취급됩니다. – AShelly

+0

나는 본다. 나는 그들이 전혀 다르지 않다고 생각하지 않았다. 이 점을 명확히 해 주셔서 감사합니다. – Monkleys

+0

@AShelly 여기, https://en.wikibooks.org/wiki/X86_Disassembly/Functions_and_Stack_Frames에서 설명했습니다. 질문에서 변경, 편집을 확인하십시오. – Monkleys

답변

3

인수이 스택에 전달됩니다. 호출자가 호출을 전달합니다. 이 공간은 함수가 시작될 때 이미 예약되어 있습니다. 프로토 타입을 power_c(int x, int y, int z)으로 변경하면 z는 [ebp+16]이됩니다.

로컬 변수 (또는 자동)은 사용자의 책임입니다. 표준 방법은 @Peter Cordes가 주석에서 언급 한대로 esp에서 필요한 공간을 빼는 것입니다. 그래서 당신이 할 것, ab 변수를 만들려면 :

sub esp, 8 
%define a [ebp+4] 
%define b [ebp-8] 

주를이 시점에서 ebp == esp+8 그. 우리는 esp가 아닌 ebp을 기준으로 변수를 정의하므로 push 및 pop 명령 (스택 포인터를 변경 함)을 계속 사용할 수 있습니다. 함수를 종료하기 전에 espebp (mov esp, ebp)으로 설정하여 반송 주소가 올바르게 검색되도록하십시오.

+0

https://en.wikibooks.org/wiki/X86_Disassembly/Calling_Conventions#Standard_C_Calling_Conventions는이 계획을 상당히 잘 설명합니다. – AShelly