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의 최종 값을 찾으려고합니다.
는 감사
감사합니다! 이것은 나를 위해 많은 것을 정리합니다. 그래도 나는 mov $ 56, 44 (% esp)와 같이 어떤 일이 일어나는지 이해하는 데 어려움을 겪고 있습니다. 거기에 무슨 일이 일어날까요? 56 비트가 너무 커서 5 비트 레지스터에 넣을 수없는 값입니까? – juliensaad
우선, esp는 32 비트 폭입니다. 둘째로 전혀 변하지 않습니다. 명령은 값 56을 esp보다 44 바이트 큰 메모리 주소로 이동합니다. – hirschhornsalz
죄송합니다, 제 이해는 여전히 매우 낮습니다. 그래서 esp는 그 위치에 뒤 따르는 32 비트로 표현됩니다. 즉 mov 16 (% esp), 9 달러는 esp의 16 번째 비트부터 9를 쓸 것입니까? – juliensaad