블로그 이미지
송시혁

calendar

1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30

Notice

Tag

Recent Post

Recent Comment

Recent Trackback

Archive

2*((length*width)+(length*height)+(width*height))를 어셈블리로 구하기




아래소스는 메모리 변수를 3개나 써서 구현한거.


.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 find the area of a rectangle", cr,Lf, Lf
  BYTE  "Width of rectangle? ",  0  
prompt2  BYTE  "Length of rectangle? ",  0
prompt3  BYTE  "height  of rectangle: ",  0
value  BYTE  16  DUP  (?)
answer  BYTE  cr, Lf, "The area of the rectangle is "
area  BYTE  11  DUP  (?)
  BYTE  cr, Lf, 0
length1  DWORD  ?
width1  DWORD  ?
height1  DWORD  ?
  
.CODE
_start:
Prompt:
  output  prompt1
  input  value,  16
  atod  value
  mov  length1,  eax                    ;length
  
 // 처음 키보드로부터 입력받은 eax(length)를 변수 length1에 백업.
  
  output  prompt2
  input  value,  16
  atod  value
  mov  width1,  eax                     ;width, 두번째 키보드로 부터 입력받은 eax를 width1로 백업
  mul  length1                             ;eax=length*width, 백업해 두었던 length1과 eax를 곱한다.
  mov  ebx,  eax                        ;eax를 ebx에 저장.
  
//ebx=length*widtd의 값을 가지고 있다.

  output  prompt3
  input  value,  16  
  atod  value  
  mov  height1,  eax                    ;height를 백업
  mul  length1                             ;eax=length*height    
  mov  ecx,  eax                        ;eax를 ecx에 대입     
  add  ebx,  ecx                         ;ebx=ebx+ecx
  
  mov  eax,  width1                     ;
  mul  height1
  add  ebx,  eax
  add  ebx,  ebx


  
  dtoa  area,  ebx
  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 find the area of a rectangle", cr,Lf, Lf
  BYTE  "Width of rectangle? ",  0  
prompt2  BYTE  "Length of rectangle? ",  0
prompt3  BYTE  "height  of rectangle: ",  0
value  BYTE  16  DUP  (?)
answer  BYTE  cr, Lf, "The area of the rectangle is "
area  BYTE  11  DUP  (?)
  BYTE  cr, Lf, 0

  
.CODE
_start:
Prompt:
  output  prompt1
  input  value,  16
  atod  value
  
  mov  edx,  eax ;length를 먼저 백업한다.
  
  
  output  prompt2
  input  value,  16
  atod  value
  mov  ecx,  eax  ;width를 ecx에 백업
  mov  ebx,  edx  ;ebx=width ,ebx에 width를 백업
  imul  edx,  eax  ;edx=length*width 
  
  
  output  prompt3
  input  value,  16  
  atod  value  
  imul  ecx,  eax  ;ecx=length*height, imul명령어를 사용하여 곱한다.
  add  edx,  ecx  ;edx=edx+eax , edx=(length*width)+(length*height)
  imul  ebx,  eax  ;eax=height*width, 백업해두었던 ebx와 현재 eax(height값)를 곱한다.
  add  edx,  ebx  ;최종적으로 edx=(length*width)+(length*height)와 eax=height*width를 더한다.
  add  edx,  edx ;그리고 2개를 더한다. 곱하기 2의 효과이다. 
  
  dtoa  area, edx  ;정수를 아스키코드로 변환하여 화면에 출력한다.
  output  answer
  
  
         
  INVOKE  ExitProcess,     0
        
PUBLIC  _start

END

메모리 여기서는 변수를 사용하면, cycle이 느려서 컴파일이 느리다. 그래서 같은 결과의 소스라도 어셈브리는 최적화가

관건이다. 그래서 어셈블리가 어렵다. 필자가 작성한 소스는 완전한 최적하가 아니다. 배우는 단계라서 조금 더 공부하고

올릴예정이다.


posted by 송시혁