송시혁 2013. 8. 29. 16:11


inc = +1증가 명령어

dec=-1증감 명령어


해당 operland는 한 개. 레지스터16,32를 (ex:eax, ax,...)을 쓸수 있고 변수를 선언하여 메모리로 operland로 사용가능.


inc    register16/ register32

//     memory byte/word/dword


dec도 inc와 동일하다.


neg 명령어

위의 표와 같이 operland는 한 개. 레지스터와 메모리를 operland로 쓸 수 있으며, neg명령어를 사용하면, 해당문자에

부호(-)를 붙인다. 예를 들어서 eax의 값이 100이라면, neg eax를 수행하면, -100이 된다.




다음그림은 예제 소스, 각각, add와 sub를 이용하여 사칙연산하는 어셈브리어이다.

C언어는 참 간단했었는데 어셈블리는 정말 어려운거라고 실감했다.


386
.MODEL FLAT

ExitProcess PROTO NEAR32 stdcall, dxExitCode:DWORD

include io.h

cr  equ  0dh
Lf  equ  0ah


.STACK 4096

.DATA  ;;;;;;;;;;전역변수
prompt1  BYTE  "This program will evaluate the expression"   
  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;prompt1의 내용을 화면에 출력한다.
  input  Value,  16;키보드로 부터 입력받는다. 16개까지 가능.
  atoi  Value ;아스키 코드를 정수로 바꾼다. atoi함수에서 'i'는 레지스터가 2byte인 경우 쓴다. 
  mov  dx,   ax ;ax를 dx에 집어넣는다. 최초의 입력값을 백업의 의미.

  output  prompt2
  input  Value,  16
  atoi  Value
  add  dx,   ax;2번째 숫자를 입력받은 뒤에 dx에 백업해두었던 첫번째 숫자와 지금 입력받은 
두 번째 숫자인 ax를 더한다. 즉, dx=dx+ax

  output  prompt3
  input  Value,   16
  atoi  Value
  add   ax,   ax ;ax와 ax를 더한다. *2의 효과
  sub  dx,   ax;dx와 2를 곱한 ax를 뺀다. 그것을 dx에 넣는다.
  
         inc  dx dx를 1증가.
         neg  dx dx를 1가미소

         itoa  Result,  dx itoa는 atoi와 마찬가지로 2byte일 때만 사용가능하며, 정수를 아스키로 바꾼다.


         output  Answer
         
  INVOKE  ExitProcess,     0
        
PUBLIC  _start

END




.386
.MODEL FLAT

ExitProcess PROTO NEAR32 stdcall, dxExitCode:DWORD

include io.h

cr  equ  0dh
Lf  equ  0ah


.STACK 4096

.DATA  ;;;;;;;;;;전역변수
prompt1  BYTE  "This program will evaluate the expression"   
  BYTE  "  2(-x + y- 1)+z", 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  32 DUP (?)   
Answer  BYTE  cr, Lf, "The result is "
Result  BYTE  6 DUP (?)
  BYTE  cr, Lf, 0
.CODE
_start:
  output  prompt1
  input  Value,  32
  atod  Value
  mov  edx,   eax
  neg  edx
  
  output  prompt2
  input  Value,  32
  atod  Value
  add  edx,   eax

  dec  edx

  add  edx,  edx
  
  output  prompt3
  input  Value,   32
  atod  Value
  add  edx,  eax
  
  ;add   ax,   ax
  ;sub  dx,   ax
  
         ;inc  dx
         ;neg  dx

         dtoa  Result,  edx

         output  Answer
         
  INVOKE  ExitProcess,     0
        
PUBLIC  _start

END