2014-04-28 6 views
1

나는 C로 몇 가지 어셈블리 코드를 연습하고 두 가지 질문에 도움이 필요합니다. 괜찮아 보인다 objdump를 GCC의 기반으로하지만어셈블리 코드를 C로

질문 (어셈블리 코드에 가지 새로운 정지) 나는 컴퓨터없이이 작업을 수행 할 수 있는지 확인하려면 1 :

q1: 
    pushl %ebp 
    movl %esp, %ebp 
    subl $4, %esp 
    cmpl $0, 8(%ebp)\\ compare variable1 to zero 
    jle .L2 \\jump if less than or equal to zero 
    movl $1, -4(%ebp)\\ ?? variable2 = 1?? 
    jmp .L4\\else 
.L2: 
    movl $0, -4(%ebp)\\ variable2 = 0 
.L4: 
    movl -4(%ebp), %eax\\ variable2 = variable1 
    leave 
    ret 

내가 가진 무엇 이었습니까

int main(int x, int z) 
{ 
    if (x < 0) 
     z = 0; 
    else 
     z = x; 
} 

그러나 나는 movl $1, -4(%ebp)의 목적이 무엇인지 확실하지 않았습니다.

질문 2 : 나는 정보

int main(int x) 
{ 
    int result; 
    if (x <= 1){ 
    for (result=1; x != 1; x = x-1) 
      result *= x;} 
    else{return result;} 
} 

내 논리는 그 중 하나에 맞는지 확실하지

을 해석하는 방법

fn: 
    pushl %ebp 
    movl $1, %eax 
    movl %esp, %ebp 
    movl 8(%ebp), %edx 
    cmpl $1, %edx\\ compare variable1 to 1 
    jle .L4\\ less than or equal jump. 
.L5: 
    imull %edx, %eax\\ multiply variable1 by variable 2 
    subl $1, %edx\\ variable1 -1 
    cmpl $1, %edx\\ compare variable1 with 1 
    jne .L5 Loop if not equal 
.L4: 
    popl %ebp\\ return value 
    ret 

.

답변

4

l 하나의 인수 과 하나의 로컬 변수 -4(%ebp)이 있습니다. 반환 값은 %eax입니다. 이 알고, 함수는 더 같습니다

int foo(int arg) 
{ 
    int local; 
    if (arg <= 0) { 
     local = 0; 
    } else { 
     local = 1; 
    } 
    return local; 
} 

Q2 반환 값이 아니다popl %ebp // return value, 즉 발신자의 저장 %ebp (즉, 처음에 밀렸다)를 복원합니다. 또한 루프의 조건은 >이 아니고 !=을 사용해야합니다.for 루프 주위에 if (x > 1) 조건이 없습니다. (Mooing Duck 덕분에이를 지적 해주었습니다.) 또한 기술적으로 루프는 do - while입니다. 그렇지 않으면이 기능을 올바르게 사용할 수 있습니다.

int factorial(int x) 
{ 
    int result = 1; 
    if (x > 1) { 
     do { 
      result *= x; 
      x -= 1; 
     } while(x != 1); 
    } 
    return result; 
} 
+0

고마워요. 왜 그렇지 않은지 설명해 주겠다고 생각하니? 'jne'이 비교를 평등하지 않게 만들 거라 생각했기 때문이죠? – user3395013

+0

@ user3395013 : for 루프 조건은'jne'을 읽고,'jle'은 실제로 루프의 _inside_입니다. –

+0

아 맞습니다. 두 조건이 있습니다. 그렇다면'if'도 필요합니다. – Jester

관련 문제