-
20140728 (add, sub, inc, dec, neg, mul)부산IT학원/스마트컨트롤러 2014. 7. 28. 10:05
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
예제)
'부산IT학원 > 스마트컨트롤러' 카테고리의 다른 글
20140730 (rounding factor, adc, sbb, clc, stc, cmc, jmp, cmp) (0) 2014.07.30 20140729 (Assembly imul, idiv, div, cbw, cwd, cdq, cwde, movsx, movzx) (0) 2014.07.29 20140725 (Assembly Flags Register) (0) 2014.07.25 20140724 (ASM mov, xchg) (0) 2014.07.24 20140723 (Assembly 기초, windbg 사용법) (0) 2014.07.23