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
예제)