20140728 (add, sub, inc, dec, neg, mul)

111일차










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

Assembly

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




------- add, sub Instruction


(덧셈, 뺄셈)




위의 표에서 메모리와 상수 간에 명령어의 속도를 보면 다른 것보다 상당히 느리다.

예제 코드로 설명을 덧붙이자면...



int A = 0;


A = 0;

while(A < 10)

{

A++;

}



A를 한번 더 초기화하면서 위의 표를 참고 하면 엄청나게 많은 시간이 소모되었다.

최적활를 위해서 소스를 짤 때에 이런 것을 유의하여 작성해야 한다.










------- inc, dec Instruction


(increase, decreace 1 증가, 감소)





386 속도    용량

add   eax ,  1                2            5

inc   eax                      2            1



똑같은 +1 을 하는 코드를 사용한다면

inc를 사용하는게 용량면에서 좋다.






그런데 MS 컴파일러는 최적화를 하지 않는다.

MS Visual Studio를 통해 확인해 본다면



아래와 같은 소스를 짜고 저 위치에 Break Point를 걸고





F5로 디버그 모드를 실행 후, 디스어셈블리를 확인 할 수 있다.





아래 Assembly 소스를 보면 add, sub을 사용하였다.




속도면에서는 add, sub과 inc, dec의 차이는 없지만,

용량면에서 차이가 나기 때문에 inc, dec를 써주면 더 최적화된 소스이나,

컴파일러마다(?) 이런 요소를 상관하지 않을 수 있으므로

사람의 손이 필요하다.



위에서

mov    eax, dword ptr [a]

라는게 있는데 C로 치자면 포인터이다.

a   는 값 a

[a]   는 a에 저장된 주소를 따라간다는 뜻이다.








몇 가지 예제













------- neg Instruction


(negative : 부호를 반대로. 2의 보수법을 취함)








몇 가지 예제

1.







2. -(x + y - 2z + 1)







3. 2(-x + y -1) + z













------- mul, imul Instruction


곱셈

mul : 부호가 없을 때

imul : 부호가 있을 때




1. 1byte 연산


mul 0x77


=> AX = AL * 0x77




2. 2byte 연산


mul 0x1234


=> DX : AX = AX * 0x1234



3. 4byte 연산


mul 0x12345678


=> EDX : EAX = EAX * 0x12345678





예제)




설정

트랙백

댓글