2014-10-03 4 views
-2

저는 어셈블리 언어를 배우는 데있어서 새로운 점을 알기 시작했습니다. 그래서 여러분 중 일부가 문제 해결에 도움이 될지 궁금합니다. 어셈블리 언어 지침을 C 코드와 비교하고 어떤 C 코드가 어셈블리 지침과 동일한 지 알려주는 숙제가 있습니다. 어셈블리 지시 사항은 다음과 같습니다.어셈블리 언어 - 작동 원리

pushl %ebp // What i think is happening here is that we are creating more space for the function. 
movl %esp,%ebp // Here i think we are moving the stack pointer to the old base pointer. 
movl 8(%ebp),%edx // Here we are taking parameter int a and storing it in %edx 
movl 12(%ebp),%eax // Here we are taking parameter int b and storing it in %eax 
cmpl %eax,%edx // Here i think we are comparing int a and b (b > a) ? 
jge .L3 // Jump to .L3 if b is greater than a - else continue the instructions 
movl %edx,%eax // If the term is not met here it will return b 
.L3: 
movl %ebp,%esp // Starting to finish the function 
popl %ebp // Putting the base pointer in the right place 
ret // return 

이 내용에 대한 이해를 바탕으로 설명을하려고합니다. 그러나 이것에 대해서는 완전히 잘못된 것일 수 있습니다. 중 하나에 해당하는 것으로 생각된다 C 기능에 대한 옵션은 다음과 같습니다

int fun1(int a, int b) 
{ 
unsigned ua = (unsigned) a; 
if (ua < b) 
return b; 
else 
return ua; 
} 
int fun2(int a, int b) 
{ 
if (b < a) 
return b; 
else 
return a; 
} 
int fun3(int a, int b) 
{ 
if (a < b) 
return a; 
else 
return b; 
} 

나는 정답은 fun3 생각 ..하지만 난 아주 확실하지 않다.

+0

우리는 당신을 위해 숙제를하지 않을 것입니다. –

+2

@Puciek : 실제로 OP에는 생성 된 명령에 대한 추정 된 해석을 보여주는 주석이 있습니다. –

+3

농담입니까? – drleifz

답변

5

우선, StackOverflow에 오신 것을 환영합니다. 훌륭한 장소, 정말로 그렇습니다.

이제 처음부터 도움을 받으십시오. 많이; 아주 많이.

당신은 나와 당신, 그리고 다른 모든 사람들을 대단히 도울 수있는 좋은 의견을 가지고 있습니다. 그러나 그것들을 읽는 것이 괴로운 것은 너무 추합니다.

공백, 많은 행, 빈 줄 및 서로 관련된 작은 그룹으로 지침을 그룹화하는 방법은 다음과 같습니다.

조건부 점프 후 빈 줄 하나를 삽입하고 절대 점프 후 빈 줄 두 개를 삽입하십시오. (오래된 속임수, 가독성을 위해 큰 작업)

둘째, 주석이 깔끔하게 정렬되도록 정렬하십시오. 그것은 천 배나 좋아 보인다.

90 초짜리 텍스트가 나와 함께 준비되어 있습니다. 저를 믿으십시오, 전문가는이 종류의 소스 코드로 당신을 천 시간 더 잘 존중할 것입니다 ...

pushl %ebp    // What i think is happening here is that we are creating more space for the function. 
    movl %esp,%ebp   // Here i think we are moving the stack pointer to the old base pointer. 

    movl 8(%ebp),%edx  // Here we are taking parameter int a and storing it in %edx 
    movl 12(%ebp),%eax  // Here we are taking parameter int b and storing it in %eax 


    cmpl %eax,%edx   // Here i think we are comparing int a and b (b > a) ? 
          // No, Think like this: "What is the value of edx with respect to the value of eax ?" 

    jge .L3     // edx is greater, so return the value in eax as it is 

    movl %edx,%eax   // If the term is not met here it will return b 
          // (pssst, I think you're wrong; think it through again) 

    .L3: 

    movl %ebp,%esp   // Starting to finish the function 
    popl %ebp    // Putting the base pointer in the right place 
    ret      // return 

지금 당장 귀하의 문제를 다시 확인하십시오. 그가 받고있는 것은 비교 명령과 관련된 JGE 명령의 "감지"입니다. 여기

는 "학문적 경험"

이 비즈는 cmpl %eax,%edx 명령 이러한 종류의 생존을 이해하는 데 필요한 혼동 - 오 - 매틱 물건, 지침

의 형태 중 하나 " 비교할"입니다

은? "... 소스 피연산자에 대한 대상 피연산자의 값이 무엇입니까 ... ", 그 구문을 볼 때이 같은 아이디어 무언가를 형성

주의 할을 시도 내가 절대적으로 n AT & T 구문을 사용하면 좋으므로 누구나이 문제를 해결할 수 있습니다.

어쨌든,이 특정한 경우에, 당신은 문구 같은 당신의 마음에있는 생각 ...

"... 내가 cmpl %eax,%edx을보고 그렇게 생각 할 수 있습니다 eax에 대해, edx의 값이 ...조건부 점프 인 다음 명령의 의미 ","

당신은 다음과 당신의 마음에 그 문장을 완성 ".

인간의 뇌의 패러다임 프로세스는이 같은 문장을 형성하기 위해 밖으로 작동 ...

"eax에 관하여 ... edx의 값이 크거나 같은, 그래서 ... 점프"당신이 ab의 위치에 대해 올바른지 다음,

그래서 당신은 c 에 "... ... b의 값, a에서 그 값이 크거나 관련하여, 그래서 나는을 이동합니다"

을 패러다임 뇌 스크램블러를하고 이런 식으로 뭔가를 얻을 수 ...

JGE은 "반대의 의미는"

자, 이제 그렇게 C에서 그 return을 발생 ("이하의 경우 점프"즉,) JL의, 당신이 경우 위치하고 있습니다, 이것의 이해를 얻으려면과 관련된 은 조립 언어에서 ret 명령 그러나 그것은 같은 것이 아닙니다.

C 프로그래머는 어셈블리 언어 서브 루틴 Eax

  • 에 값을 배치합니다

    • 그 의미하는 것은 ... "... 이 함수는 int로을 ... 반환"말할 때 서브 루틴은 Ret 명령
    • 서브 루틴은 다음 실행할 후 스택을 고정하고 산뜻한 위해 다시 넣어

    난이도가 한 번 더 높아집니다.

    이 다음과 같은 조건 점프는

    • JG
    • JGE
    • JNG
    • JL
    • JLE
    • ... 산술 비교 연산을 체결 에 적용
    • JNL

    저기있다! 이 모든 일에서 당신을 망치려는 함정!

    부호가 있거나 부호가없는 비교를 하시겠습니까 ???

    그런데, 서명되지 않은 숫자가 서명 된 숫자와 비교되는 첫 번째 함수처럼 아무 것도하지 않은 것을 본 적이 없습니다. 심지어 합법적인가?

    그래서 어쨌든, 우리는 이러한 모든 사실을 놓고, 우리가 얻을 : 이 어셈블리 언어 루틴 리턴 값을 a에가, 그렇지 않으면 b의 값을 반환 b의 값보다 작은 경우.

    이 값은 부호있는 정수로 평가됩니다.

    는 (. 내가 바로 것을 찾은 것 같아,. 누군가가 정말 전혀 어셈블러의 구문을 좋아하지 않는 나의 논리를 확인)

    을 어쨌든, 나는 당신이 사람을 물어보고 싶은하지 않는 것이 합리적으로 확신 인터넷에서 특정 숙제 문제에 대한 구체적인 대답을 제공하기 때문에이 설명에서 알아낼 수 있도록 남겨 두겠습니다.

    필자는 비교와 서명 및 서명되지 않은 사업의 논리와 의미에 대해 충분히 설명 했으므로이 문제를 해결할 수 있습니다.

    아, 다시 말하지만, 필자는 항상 Intel 문법 (예 : Masm, Tasm, Nasm, 무엇이든)을 사용합니다. 그래서 내가 거꾸로 뭔가를 가지고 있다면, 저를 위해 그것을 바로 고쳐주십시오.

  • +1

    좋은 답변, 고마워. 하지만 "AT & T"구문은 무엇입니까? –

    +0

    이 페이지가 인텔과 AT & T 구문의 차이점을 이해하는 데 도움이되는지 확인하십시오 ... http://asm.sourceforge.net/articles/linasm.html –

    +0

    흠 .. 감사합니다 .. 유용합니다. –