본문 바로가기

교육/ASSEM

[어셈블리어]inc(증가), dec(감소), mul(곱셈)명령

자주쓰는 메모리를 cache영역에 저장해두고 필요할 때마다 메모리 영역까지 갈 필요없이 cache영역으로 가서 저장해둔 메모리를 사용할 수 있다. 


각 명령어에 해당하는 OP코드가 없으면 컴파일 에러가 난다.

즉 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



  • dword ptr [a] 은 원래 a메모리값의 주소가 들어가 있어야한다.
    • dword ptr [a] 는 비주얼 스튜디오에서 사용자가 보기 편하게 해준 것.


 - (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에 저장이 된다.
DX(앞의 2byte) AX(뒤의 2byte)




 unsigned int short     smart = 0x12345678;

mul Test

의경우 Test = 4byte, EAX도 4byte 이기 때문에 두배인 8byte레지스터에 저장이 되야하기 때문에
앞의 4byte는 EDX 뒤의 4byte는 EAX에 저장이 된다.

EDX(앞의 4byte) EAX(뒤의 4byte)



imul은 음수를 곱할때 사용하는 곱셈명령어이다.