어셈블리(assembly)/어셈블리 실습

8월 20일 disassembly(디스어셈블리) 약간

송시혁 2013. 8. 20. 16:11

C코드





아래는 디스어셈블리 코드



mov 대입 '='의미. 

dword ptr [a]

dword= 4바이트.

[a]= 변수 'a'

ptr은 포인터와 비슷한 의미. 여기서는 a의 주소에 헥사값 64를 a에 대입한다.

64h =100의 헥사값. (100의 16진수)


add eax, 1

add는 '더한다'라는 명령어. 여기서는 eax에 1을 더한다는 의미. 즉, c코드로 생각하면, a=a+1

eax=eax+1이 되겠다.


++a와 a++은 어셈블리코드로 보면, 똑같다. 실제 컴파일 하는 속도는 ++a와 a++는 차이가 없다는 것을

알 수 있다.


a=b+a;

1. mov eax, dword ptr [b]= eax에 b를 대입하겠다는 의미. a와 b는 메모리 상에서 존재한다. 연산은 cpu만이

할 수 있으므로 먼저 cpu에서 메모리로부터 가져와서 임시저장공간 eax에 넣는다.


2. add eax, dword ptr[a]= eax와 a를 더한다. 당연히 cpu가 연산한다. (연산은 ALU 레지스터가 담당)

3. mov dword ptr[a], eax= eax는 지금 b+a를 연산한 결과값을 cpu가 지니고 있다. 이 결과값을 다시 메모리

    에 있는 'a'라는 변수가 있는 메모리 주소에 보낸다. 그래서 이 3번째 코드가 없다면, 연산은 하지만, 연산한 결과

값은 나타나지 않는다.

b=a;


mov eax, dword ptr[a]= 'a'라는 변수를 eax에 대입한다. 

mov dword ptr[b], eax= eax(a가 가지고 있는 값)를 메모리상에 존재하는 'b'에 대입한다.