해결된 질문
24.07.21 17:04 작성
·
58
0
답변 2
0
2024. 07. 24. 17:09
강의 중 설명은 스택을 이용한 스택 머신의 경우 그런 논리로 이해할 수 있다는 것입니다. 그러나 꼭 그렇게 해야 하는 것은 아닙니다. CPU의 특성에 따라 얼마든지 달라질 수 있습니다. 무엇보다 범용CPU 기계어로 번역될 때는 결과가 바르고 최적화와 관련한 문제가 없다면 결국 맞는 것입니다.
스택을 이용한 설명은 여러 방식 중 하나로 이해하시면 되겠습니다. 그리고 a값이 1 증가하는 시점은 mov dword ptr [a], eax 명령이 실행되는 지점 입니다. 그런데 그 전에 eax의 값을 증가시킨 직접적인 연산은 inc eax 명령입니다. 참고하시기 바랍니다. 😄
0
안녕하세요, 인프런 AI 인턴입니다.
b = 3 + a++;
연산에서 후위증감 연산자 ++
는 식의 평가가 완료된 후에 변수 a
의 값을 증가시킵니다. 따라서 이 연산이 진행되는 과정을 세부적으로 살펴보면 다음과 같습니다.
a
의 현재 값(예제에서는 2)을 평가하여 이 값을 식에 사용합니다.3
과 a
의 현재 값을 더합니다. 즉, 3 + 2 = 5가 됩니다.b
에 할당합니다.a
의 값이 1 증가하여 a
는 3이 됩니다.어셈블리어 코드를 통해 이 과정을 더 명확히 이해할 수 있습니다. 코드는 다음 단계로 구성됩니다.
mov eax, dword ptr [a]
: a
의 값을 eax
레지스터로 이동합니다.add eax, 3
: eax
에 저장된 값에 3
을 더합니다.mov dword ptr [b], eax
: eax
의 값을 b
에 저장합니다.mov eax, dword ptr [a]
: 다시 a
의 값을 eax
로 이동합니다.inc eax
: eax
에 저장된 값(즉, a
의 값)을 1 증가시킵니다.mov dword ptr [a], eax
: eax
의 증가된 값을 다시 a
에 저장합니다.이 코드는 b = 3 + a++;
연산을 어셈블리어로 표현한 것으로, 해당 연산이 어떻게 실행되는지 세부적으로 보여줍니다. 결론적으로, b
의 최종 결과는 5가 되고, a
는 연산 후 3이 됩니다.
![The image contains a block of assembly language code alongside a line of C code that seems to give context to what the assembly is accomplishing. Here’s a breakdown of the contents:The C code snippet:
b = 3 + a++;
This line suggests that ‘b’ is being assigned the value of 3 plus the current value of ‘a’, and then ‘a’ is incremented after its current value is used in the expression (due to the post-increment operator ++
).The assembly code appears to correspond to the execution of the above C code line in a step-by-step manner, as a compiler might translate it for a machine to execute:1. mov eax, dword ptr [a]
: This line moves the value of variable ‘a’ into the eax
register.
2. add eax, 3
: This adds 3 to the value currently in eax
.
3. mov dword ptr [b], eax
: This moves the result from eax
into variable ‘b’, thereby setting ‘b’ to the value of ‘a’ + 3.
4. mov eax, dword ptr [a]
: This moves the value of ‘a’ into eax
again.
5. inc eax
: This increments the value in eax
.
6. mov dword ptr [a], eax
: This moves the incremented value back into ‘a’.The final line in the C code (printf("a: %d, b: %d", a, b);
) is a standard print statement in C, which prints the values of ‘a’ and ‘b’ as decimal integers.It’s important to note that the corresponding assembly code for the entire C code snippet including the printf
function call would be more extensive than what is shown in the image. The assembly code provided is likely only demonstrating the assignment and increment operations before the printf
function call.](https://cdn.inflearn.com/public/files/posts/96c8a87c-48ed-4d28-8150-f0993f893e20/aa.png)