어셈블리 명령어: movl a, b
실행 전: a = 10, b = 999
실행 후: a = 10, b = 10
원본(a) 은 원래 값을 유지한다.
move 라는 단어는 Ctrl+X, Ctrl+V 라는 뉘앙스인데,
실제로는 Ctrl+C, Ctrl+V 이다.
#include <stdio.h>
int main(void) {
int a = 10;
int b = 999;
printf("=== movl 실행 전 ===\n");
printf("a = %d (주소: %p)\n", a, (void*)&a);
printf("b = %d (주소: %p)\n\n", b, (void*)&b);
// 인라인 어셈블리로 movl 직접 실행
// GCC / Clang 기본 AT&T문법: movl [출발지], [목적지]
__asm__ (
"movl %1, %0\n\t" // %1(출발지 a)의 값을 %0(목적지 b)로 복사
: "=r" (b) // 출력(Output): 수정되는 목적이 변수 b (%0)
: "r" (a) // 입력(Input): 읽기만 하는 출발지 변수 a (%1)
);
printf("=== movl 실행 후 ===\n");
printf("a = %d (여전히 10으로 온전히 유지됌)\n", a);
printf("b = %d (999에서 10으로 덮어씌워짐)\n\n", b);
// 원본 a를 이후에도 정상적으로 재사용할 수 있는지 확인
int c = a + 5;
printf("a를 재사용한 계산 (a + 5) = %d\n", c);
return 0;
}
./test_mov
=== movl 실행 전 ===
a = 10 (주소: 0x7fffff6bf00c)
b = 999 (주소: 0x7fffff6bf010)
=== movl 실행 후 ===
a = 10 (여전히 10으로 온전히 유지됌)
b = 10 (999에서 10으로 덮어씌워짐)
a를 재사용한 계산 (a + 5) = 15
movl을 수행하더라도
원본 레지스터/변수 a에는 아무런 부작용(쓰레기 값 발생, 비워짐 등)이 없으며,
단순 Read & Copy 동작임을 직접 확인했다.