기타/컴퓨터공학

어셈블리어 이해 좀 시켜주세요..

바로이순간 2012. 8. 24. 22:32

이 코드는 첫 번째 입력받은 수랑 두 번째 입력 받은 수의 대소관계를 비교하려는 건데요

 (분기문없이 분기문 비슷하게..)


input1 : 첫 번째 입력받은 수가 저장되어 있음

eax : 두 번째 입력 받은 수가 저장되어 있음


결국엔 ecx에  더 큰 수가 저장되는거에요.

 

하나하나 과정을 살펴서 결과를 아는 것까지는 되는데

전체적으로 이해를 못하겠네요.. 어떻게 이해 해야할까요?


---------------------------------------------------------------------------------------


xor     ebx, ebx           ebx를 0으로 만들어 준다.

cmp    eax, [input1]    eax와 [input1]을 비교한다.

setg    bl                     만약 eax가 크다면 bl 을 1로 세트한다.

                                  (만약 eax가 크다면 결과적으로 ebx가 1이 된다.)

neg    ebx                   ebx의 2의 보수를 취한다.

                                  만약 eax가 크다면 ebx는 0xFFFFFFFF 가 된다.

                                  만약 eax가 크지 않다면 ebx는 0x00000000 가 된다.

mov    ecx, ebx           ecx에 ebx의 값을 준다.

and    ecx, eax            ecx에 eax를 and시킨다. 결과는 ecx에 있다.

                                  만약 eax가 크다면 ecx는 eax의 값을 가진다.

                                  만약 eax가 크지 않다면 ecx는 0이 된다.

not     ebx                   ebx를 비트역전 시킨다.

                                  만약 eax가 크다면 ebx는 0x00000000 가 된다.

                                  만약 eax가 크지 않다면 ebx는 0xFFFFFFFF 가 된다.  

and    ebx, [input1]     ebx에 [input1]을 and시킨다. 결과는 ebx에 남는다.

                                  만약 eax가 크다면 ebx는 0이다.

                                  만약 eax가 크지 않다면 ebx는 [input1]이다.

or       ecx, ebx           ecx와 ebx를 or 시킨다. 결과는 ecx에 있다.

                                  만약 eax가 크다면 ecx에는 eax가 있다.

                                  만약 eax가 크지 않다면 ecx에는 [input1]이 있다.

----------------------------------------------------------------------------------------------------------


위의 코드를 c방식으로 바꾼다면


if(eax>[input1]) ebx=0xFFFFFFFF;

else ebx=0x00000000;

ecx=ebx&eax;

ebx=(!ebx)&[input1];

ecx=ecx|ebx;


이렇게 단축시킬수 있습니다.


eax > [input1]이라면

ebx=0xFFFFFFFF;

ecx=eax;

ebx=0;

ecx=ecx|ebx;

즉 ecx=eax; 가 됩니다.


eax <= [input1] 이라면

ebx=0x00000000;

ecx=0;

ebx=[input1];

ecx=ecx|ebx;

ecx=[input1]; 이 됩니다.


위의 과정을 모두 통합적으로 이해하는 것이 필요합니다.