본문 바로가기
코스웨어/13년 스마트컨트롤러

9월 4일 어셈블리 숙제

by 알 수 없는 사용자 2013. 9. 4.
728x90
반응형

  int a = 100;

0041136E  mov         dword ptr [a],64h  

변수 a의 주소에 100을 대입한다.

++a;

00411375  mov         eax,dword ptr [a]  

00411378  add         eax,1  

0041137B  mov         dword ptr [a],eax  

변수 a의 값을 레지스터 eax로 읽어와 1을 더한 후, 결과값을 다시 변수 a에 저장한다.

if (a < 0)

0041137E  jns         main+3Bh (41138Bh)  

SF비트가 0이 아니면(1이면) 명령어 주소 0x41138B로 점프한다. -> 다음 else if 문으로 점프

{

--a;

00411380  mov         eax,dword ptr [a]  

00411383  sub         eax,1  

00411386  mov         dword ptr [a],eax  

00411389  jmp         main+55h (4113A5h)  

변수 a의 값을 eax로 옮겨와서 1을 빼준후, 그 결과값을 다시 변수 a의 주소로 옮겨준다.

연산을 모두 다 마치고 if-else문 밖으로 무조건 분기한다.(0x4113A5)

}

else if (a == 0)

0041138B  cmp         dword ptr [a],0  

0041138F  jne         main+4Ch (41139Ch)  

a의 값과 0이 같은지 비교한다.

만약 두 값이 같지 않으면(jump not equal) 0x41139C, 즉 else{}절로 분기한다.

jnz를 사용하려면 앞에서 a의 값을 체크할 때 Zero Flag가 0이 되었는지 여부를 알아야 하지만, 

이미 eax를 이용한 연산이 이루어졌을 가능성이 있으므로 cmp 명령어를 사용한 것으로 보인다.

{

a = a + 2;

00411391  mov         eax,dword ptr [a]  

00411394  add         eax,2  

00411397  mov         dword ptr [a],eax  

a == 0 이라면 위의 명령문을 실행하는데, a의 값을 eax에 옮겨와 2를 더한 후,

다시 메모리의 a의 주소에 결과값을 대입시켜준다.

}

else

0041139A  jmp         main+55h (4113A5h)  

위의 두 조건과 else도 아니라면 if-else 구문을 벗어난다(0x4113A5)

{

++a;

0041139C  mov         eax,dword ptr [a]  

0041139F  add         eax,1  

004113A2  mov         dword ptr [a],eax  

a의 값을 eax로 옮겨와서 1을 증가시킨 후 결과값을 다시 a에 대입시킨다.

}

a = a + 100;

004113A5  mov         eax,dword ptr [a]  

004113A8  add         eax,64h  

004113AB  mov         dword ptr [a],eax  

a의 값을 eax로 옮겨와 100을 더해준 후 다시 결과값을 a에 대입한다.

return 0;

004113AE  xor         eax,eax  

}

728x90