2012-02-08 2 views
0

어셈블리에서 다음 코드를 분석하려고합니다.이 세그먼트에서 절차 적으로 호출 된 어셈블리 코드의 .L2 레이블과 연결된 코드가 있습니까?

sub $48, %esp 
mov $56, 44(%esp) 
mov $3, 40(%esp) 
mov $0, 36(%esp) 
mov 44(%esp), %eax 
mov %eax, 32(%esp) 
jmp .L2 
.L3: 
mov 32(%esp), %eax 
sub 40(%esp), %eax 
mov %eax, 32(%esp) 
add $1, 36(%esp) 
.L2: 
mov 32(%esp), %eax 
cmp 40(%esp), %eax 
ja .L3 
mov 36(%esp),%eax 
mov 32(%esp),%edx 

필자의 이해가 명확하면 처음 6 줄이 정상적으로 호출되고 프로그램이 .L2 :로 점프하고 코드를 실행합니다. R [eax] == R [40 + R [esp]이면 코드는 .L3으로 이동합니다.

제 질문은 이후에 어떤 일이 발생합니까? .L3이 실행되고 코드가 .L2로 바뀌거나 .L3을 실행 한 직후에 자동으로 마지막 두 줄로 건너 뛰기 때문에 코드가 .L2로 이동합니까?

또한 어셈블리 코드를 읽는 데 대한 몇 가지 팁을 사용할 수 있습니다. eax와 edx의 최종 값을 찾으려고합니다.

는 감사

답변

1

당신이 올바른지 : .L3 점프 후, 거기 JA의 .L3 사이의 모든 6 개 지침은 순서대로 실행되며, 조건부 점프가 촬영되지 때까지 그 과정 자체를 반복합니다.

코드를 잘 읽는 것처럼 들립니다.

+0

감사합니다! 이것은 나를 위해 많은 것을 정리합니다. 그래도 나는 mov $ 56, 44 (% esp)와 같이 어떤 일이 일어나는지 이해하는 데 어려움을 겪고 있습니다. 거기에 무슨 일이 일어날까요? 56 비트가 너무 커서 5 비트 레지스터에 넣을 수없는 값입니까? – juliensaad

+0

우선, esp는 32 비트 폭입니다. 둘째로 전혀 변하지 않습니다. 명령은 값 56을 esp보다 44 바이트 큰 메모리 주소로 이동합니다. – hirschhornsalz

+0

죄송합니다, 제 이해는 여전히 매우 낮습니다. 그래서 esp는 그 위치에 뒤 따르는 32 비트로 표현됩니다. 즉 mov 16 (% esp), 9 달러는 esp의 16 번째 비트부터 9를 쓸 것입니까? – juliensaad

관련 문제