자주쓰는 메모리를 cache영역에 저장해두고 필요할 때마다 메모리 영역까지 갈 필요없이 cache영역으로 가서 저장해둔 메모리를 사용할 수 있다.
즉 add에 add eax, a 의 경우 OP코드가 05로 존재하지만 add 20, eax의 경우 컴파일 할 OP코드가 없기 때문에 컴파일 불가능.
- 논리적으로는 20 = 20 + eax의 수식이 불가능 하기 때문에 컴파일이 안되는 걸로 보이지만
- 컴파일 상으로는 20 = 20 + eax 라는 형식자체가 없기 때문에 컴파일 에러가 뜬다.
inc의 386 클럭 = 2, byte = 1
add의 386 클럭 = 2, byte = 5
inc - 1을 증가시키는 어셈블리 명령어
dec - 1을 감소시키는 어셈블리 명령어
- 속도는 386클럭을 확인하면 2로 동일하지만 byte가 다름
- 1만을 증가 시킬 때에는 ADD명령어를 이용하여 1을 증가시키는 것 보다 byte용량이 훨씬 효율적
- C -
|
- 어셈블러 -
비주얼스튜디오에서 컴파일 한 어셈블러를 확인하면 ++a를
이런식으로 컴파일 한 것을 확인 할 수 있다. 비주얼스튜디오는 컴파일 최적화를 수행할 때 속도를 우선적으로 최적화 하기 때문임 (386클럭은 2로 동일하니까) byte를 아끼고 최적화 하려면 직접 어셈블러를 수정해야 한다. mov eax, dword ptr [a] inc eax mov dword ptr [a], eax
|
- (x + y - 2z + 1)연산 .386 .MODEL FLAT ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD include io.h cr equ 0dh Lf equ 0ah .STACK 4096 .DATA prompt1 BYTE "This program will evaluate the expression", cr, Lf, Lf BYTE " - (x + y - 2z + 1)", cr, Lf, Lf BYTE "for your choice of integer values.", cr, Lf, Lf BYTE "Enter value for x: ", 0 Prompt2 BYTE "Enter value for y: ", 0 Prompt3 BYTE "Enter value for z: ", 0 Value BYTE 16 DUP (?) Answer BYTE cr, Lf, "The result is" result BYTE 6 DUP (?) BYTE cr, Lf, 0 .CODE _start: output Prompt1 input Value, 16 atoi Value mov dx,ax output Prompt2 input Value, 16 atoi Value add dx,ax output Prompt3 input Value, 16 atoi Value add ax,ax sub dx,ax inc dx neg dx itoa Result, dx output Answer INVOKE ExitProcess, 0 PUBLIC _start END |
2(- x + y + 1)연산
.CODE _start: output Prompt1 input Value, 16 atoi Value mov dx,ax neg dx output Prompt2 input Value, 16 atoi Value add dx,ax dec dx add dx,dx output Prompt3 input Value, 16 atoi Value add dx, ax itoa Result, dx output Answer |
mul은 곱셈명령어
- add의 경우 add eax, 3일때 eax + 3의 결과를 eax에 대입하는데 mul은 곱하는값의 두배의 레지스터에 값을 저장한다.
- mul은 기본적으로 EAX레지스터를 사용한다.
AL * 0x77 ?? * 77 AL mul 0x77 AX = AL * 0x77 |
unsigned int short Test = 0x1234; ;Test는 기본적으로 eax에 있는 값과 연산함 mul Test 의 경우 Test = 2byte, AX도 2byte 이기 때문에 두배인 4byte레지스터에 저장이 되야하는데 EAX에 저장이 되지 않고 앞의 2byte는 DX에 뒤의 2byte는 AX에 저장이 된다.
mul Test 의경우 Test = 4byte, EAX도 4byte 이기 때문에 두배인 8byte레지스터에 저장이 되야하기 때문에 앞의 4byte는 EDX 뒤의 4byte는 EAX에 저장이 된다.
|
imul은 음수를 곱할때 사용하는 곱셈명령어이다.
'교육 > ASSEM' 카테고리의 다른 글
[어셈블리어]imul과 div(idiv)와 확장명령어 (0) | 2014.07.30 |
---|---|
[어셈블리어] adc와 Jump (0) | 2014.07.30 |
[어셈블리어] mov와 xchg (0) | 2014.07.25 |
[어셈블리어] 연산에 따른 flags register의 값 (0) | 2014.07.25 |
어셈블리어 기초3 (0) | 2014.07.23 |