Assembly

2013.08.28_ASM_Basic Instruction

성엽이 2013. 8. 28. 11:30

------------------------ 4장 Basic Instruction -------------------------


inc and dec instructions

 

     - inc 와 dec 명령어

 


   => C 언어에서 ++ or -- 와 동일, 7F FF FF FF 가 양수의 가장 큰 수 이므로, 여기서 ++ 을 하면 Overflow 되면서 음수가 되기 때문에 EFLAGS의 SF , OF 가 1이 됨



      - neg Instruction



 => 2의 보수를 취한 것과 같음.




 연산 해보기 예제 소스 

 .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

  itoa  Result,dx
  
  output  Answer

  INVOKE  ExitProcess, 0

PUBLIC  _start



Macros in IO.H

 

 => atod 는 아스키를 숫자로 바꿔주는 매크로이며, 바꾼 숫자는 자동으로 EAX 레지스터에 저장이 된다.

 => atoi 도 마찬가지로 아스키를 숫자로 바꿔주는 매크로이고, atod 와는 크기의 차이가 있다. atod 와 마찬가지로 이 값은 자동으로 AX 레지스터에 저장이 된다.

 => output 은 Null 을 만나면 종료됨.




 Multiplication Instructions

 

 mul and imul Instructions

 

 

 

 



 설명

 => mul 은 양수 곱셈을 뜻함. imul 은 정수 곱셈을 뜻함

     정수 곱셈에는 Operand(s)의 갯수가 3가지 경우가 있다. 예제를 통해 확인 할 수 있다.

     

                             

 mul           source


 imul          source

 imul          register,   source

 imul          register,   source,   immediate


 => 중요한 점은 곱셈을 했을 때, 결과값이 확장이 되는 경우가 있으므로 CPU에서 자료값의 크기를 정해둔다. 예를들어


 mul          al     => al(1byte) * bl(1byte) = ax (2byte) 

 mul          ax    => ax(2byte) * bx(2byte) = ax(2byte) , dx(2byte)

 mul          eax  => eax(4byte) * ebx(4byte) = eax(2byte), edx(2byte)

 => al 을 곱셈연산을 하면 최대 2byte 가 나오므로 ax 에 저장해야하며, 

     ax 는 ax 에 다 저장하지 못한 값을 dx 에 따로 저장해 둔다.

     eax 도 마찬가지로 저장하지 못한 값을 edx 에 저장해둔다.

     이때, dx 나 edx 에 의해서 EFLAGS 의 값이 변하는데, dx 나 edx 가 0이 되면 OF 의 값이 0 이고 0 이 아닌 값이 오면 1 이 된다. 




                                                     => DX 가 변화가 없이 0 이므로 CF, OF 가 0 이다.                                                     



                                                     => 별 특이한 점 없음.



                                                     => Operand(s) 를 3개 썼을 때, Carry 값은 무시하고 정해준 값의 자리수 만큼만 나온다.

                                                     실제로 08F2 * 1000 을 하면 22 F1 50 이 나오는데 22 는 버림