mov : 값을 가져온다.
lea : [주소값]을 가져온다.
int num = 10;
008F18B2 mov dword ptr [num], 0Ah // [num]주소에 0Ah(10)을 저장
int * ptr = #
008F18B9 lea eax,[num] // eax에 [num]주소 값을 저장
008F18BC mov dword ptr [ptr],eax // [ptr]에 eax 값을 저장
*ptr = 12;
008F18C5 mov eax,dword ptr [ptr] // eax에 [ptr]의 값을 저장 ([num]주소 값이 저장됨)
008F18C8 mov dword ptr [eax],0Ch // eax 레지스터 자체에가 아닌, eax 값을 주소로 사용하여
메모리([num]주소)에 0Ch(12)을 저장
메모리 주소를 가르킬 때 []를 사용한다.
[eax]는 eax 값으로 주소를 가르킨다는 의미다.
dword ptr은 4Byte 단위로 접근하겠다는 의미다.
※ ebp 레지스터 값이 0x0010이고 0x0014 위치에 값 30이 저장되어 있다면,
mov eax, [ebp+4] 명령을 통해 eax 레지스터엔 값 30이 저장되고
lea eax, [ebp+4] 명령을 통해 eax 레지스터엔 0x0014가 저장된다.
num = v;
002818DE mov eax,dword ptr [v]
002818E1 mov dword ptr [num],eax // dword ptr[num], dword ptr[v] ?
mov의 좌∙우변 동시에 메모리 엑세스가 올 수 없는 이유? (레지스터끼리는 가능)
메모리를 불러오면 반드시 읽은 데이터를 누군가(레지스터)가 점유하고 있어야 하기 때문이다.
읽은 메모리값을 다시 덮어쓰기 전까지 유지할 수단이 필요하며, 메모리 스스로 읽고 나서 다시 특정 위치에 쓰는 걸 할 수 없기에 컴퓨터는 연산 시 상수값 쓰기가 아닌 이상 레지스터가 요구된다.
안녕하세요 .. 글 도중에 c 언어 아래에 어셈블리어를 쓰시던데요 혹시 clang 이나 gcc 에서 혹은 다른컴파일러로 변환했을때 위에 박스 안에 있는 코드처럼 자동으로 변환해주는 방법이 있나요? 아니면 그냥 각 부분마다 스스로 체크해야하는건가요?.. 되게 바보같은 질문이지만 어셈블리어를 통해 c/cpp 배울때 꼭 봐봐야되는 부분이 있어서 여쭤봅니다.