• 어셈블리 프로그램을 작성하는 방법
    • 어셈블리 프로그램을 작성하기위하여는 editor 가 필요하다
    • editor 는 어떤 것을 사용해도 무관하다.
    • 즉 edit.exe 나 turbo-C 의 tc.exe 상에서 작성해도 되며 또한 hwp, MS word 등 어떤 툴을 사용하여도 된다.
    • 단 화일의 확장자는 asm 으로 주어야만 한다.

    •  
      예) edit 를 이용하여 프로그램 작성        

      C:\edit pgm1_1.asm (return)        

               
        TITLE PGM1_1: SAMPLE PROGRAM        
         .MODEL SMALL        
         .STACK   100H        

         .DATA        
         A DW     2        
         B DW     5        
         SUM DW   ?        

         .CODE        
         MAIN     PROC        
         ;initialize DS        
             MOV  AX,@DATA        
             MOV  DS,AX        
         ;add the numbers        
             MOV  AX,A      ;AX has A        
             ADD  AX,B      ;AX has A+B        
             MOV  SUM,AX    ;SUM = A+B        
         ;exit to DOS        
             MOV  AX,4C00H        
             INT  21H        
         MAIN ENDP        
         END  MAIN        
        (save and exit)

         
         
       
         
  • 어셈블리 프로그램을 어셈블하여 실행화일 만드는 방법
    • 어셈블리 화일을 실행화일 (기계어 화일)로 만들기 위해서는 assembler 가 필요하다.
    • 어셈블러 프로그램은 여러회사것이 있는데 여기서는 대부분의 학생이 갖고 있는 Turbo-C 2.0 에 있는 tasm.exe 와 tlink.exe 를 사용하는것을 설명하겠다.
    • 위의 화일이 없는 학생은 여기를 클릭하여 download 받을것
    • 위화일은 winzip v.6.2 로 compress 되어있음으로 winzip 으로 압축을 풀것

    •  
      예) pgm1_1.asm 을 어셈블하여 실행화일 만들기        
               
        위에서 download 받은 두 화일을 하나의 디렉토리에 놓는다.        
        또한 pgm1_1.asm 화일을 동일 디렉토리에 놓는다.        
        예로 여기서는 위의 세화일이 C:\asmtest 디렉토리에 있다고 가정함        
                 
        명령
        설명
        C:\asmtest\tasm pgm1_1.asm (return)  이렇게 하면 pgm1_1.obj 화일이 만들어진다 (dir 로 확인바람)
        C:\asmtest\tlink pgm1_1.obj (return) 이렇게 하면 pgm1_1.exe 화일이 만들어진다  (dir 로 확인바람)
        C:\asmtest\pgm1_1 (return) pgm1_1.exe 화일을 수행시킨다
         
       
  • 실행화일을 debugging 하는 방법
    • debugging 이란 프로그램의 수행을 제어하여 프로그램의 동작을 살펴보고 프로그램의 틀린부분을 고치는 일을 말한다.
    • debugging 을 하기위해서는 debugging 을 수행해주는 프로그램이 있어야한다.
    • 여기서는 dos 상에서 수행되는 debug.exe 를 이용하여 debugging을 하는 방법을 설명하겠다.

    •  
               
        명령
        설명
        C:\debug pgm1_1.exe pgm1_1.exe 디버깅 시작
        - 화면에 왼쪽과 같이 표시됨
        -? (return) debug 프로그램의 명령들을 보여줌
        -u offset_address (return) pgm1_1 프로그램을 offset_address 부터 보여줌 (-u (return) 하면 처음부터 보여줌)
        -t (return) 첫명령부터 한명령씩 수행(이때 각 레지스터의 값및 플래그 레지스터의 값이보임)
        -g (return) 프로그램의 끝까지 실행
        -a offset_address offset_address 부분의 어셈블리 명령어를 바꿈
        -d offset_address 범위 offset_address 부터 범위의 갯수만큼 16진수로 표시해줌
        -p =주소 숫자 주소부터 숫자만큼 실행함
        -r 레지스터명 레지스터의 현재값을 표시해주고 변경값을 물어봄 (그냥 (return) 을 치면 값이 변경되지 않음)
         
       
  • 예제
    • 위프로그램을 debugging 하는 한 과정

    •  
      과정
      설명
      C:\asmtest>debug pgm1_1.exe     
      -
      debug 구동
      -u    
      3170:0000 B87131     MOV     AX,3171    
      3170:0003 8ED8      MOV     DS,AX    
      3170:0005 A10400       MOV     AX,[0004]    
      3170:0008 03060600    ADD     AX,[0006]    
      3170:000C A30800     MOV     [0008],AX    
      3170:000F B8004C      MOV     AX,4C00    
      3170:0012 CD21       INT     21    
      3170:0014 0200      ADD     AL,[BX+SI]    
      3170:0016 050007     ADD     AX,0700    
      3170:0019 000C      ADD     [SI],CL    
      3170:001B 8E064E55    MOV     ES,[554E]    
      3170:001F 32C9      XOR     CL,CL    
      -    
       
      pgm1_1.exe 를 unassemble 한다.   
      3170:0000 에서 3170은 segment address 0000 은 offset address 이다.   
       
      -t   

      AX=3171  BX=0000  CX=0018  DX=0000  SP=0100  BP=0000  SI=0000  DI=0000   
      DS=3160  ES=3160  SS=3172  CS=3170  IP=0003   NV UP EI PL NZ NA PO NC   
      3170:0003 8ED8          MOV     DS,AX   
      -

      trace 명령으로 한스템 수행한다.   
      수행후 각 레지스터의 값 및 다음수행할 명령어가 보인다.
      -t   

      AX=3171  BX=0000  CX=0018  DX=0000  SP=0100  BP=0000  SI=0000  DI=0000   
      DS=3171  ES=3160  SS=3172  CS=3170  IP=0005   NV UP EI PL NZ NA PO NC   
      3170:0005 A10400       MOV  AX,[0004]        DS:0004=0002   
      -   
       

      trace 명령으로 한스템 수행한다.   
      이제 DS 가 초기화된다.   
      이때 DS 는 3171 이 되었다.
      -d 3171:0004   
      3171:0000              02 00 05 00-07 00 0C 8E 06 4E 55 32   
       
      변수 A 의 값이 DS:0004 에 있음으로 메모리의 내용을 보니 02 00 으로 되어있다.   
      이는 0002 를 의미한다.    
      DS:0006 에는 변수 B의 값이 들어있다. 05 00 임으로0005 이다.   
      이는 프로그램에서 초기화시켜준 값과 같다.   
       
      -t   

      AX=0002  BX=0000  CX=0018  DX=0000  SP=0100  BP=0000 SI=0000 DI=0000   
      DS=3171  ES=3160  SS=3172  CS=3170  IP=0008   NV UP EI PL NZ NA PO NC   
      3170:0008 03060600     ADD    AX,[0006]          DS:0006=0005   
       

      trace 명령으로 한스템 수행한다.   
      MOV AX,[0004]에 의하여 AX 내용이 0002 로 바뀌어 있다. 다음 명령은 ADD AX,[0006] 이다   
       
      -t   

      AX=0007  BX=0000  CX=0018  DX=0000  SP=0100  BP=0000  SI=0000  DI=0000   
      DS=3171  ES=3160  SS=3172  CS=3170  IP=000C   NV UP EI PL NZ NA PO NC   
      3170:000C A30800     MOV    [0008],AX         DS:0008=0007   
       

      trace 명령으로 한스템 수행한다.   
      이제 [0006]의 5와 AX 에 있던 2 가 더해져서 AX의 내용이 7이 되었다.   
       
      -t   

      AX=0007  BX=0000  CX=0018  DX=0000  SP=0100  BP=0000  SI=0000  DI=0000   
      DS=3171  ES=3160  SS=3172  CS=3170  IP=000F   NV UP EI PL NZ NA PO NC   
      3170:000F B8004C        MOV     AX,4C00   
       

      trace 명령으로 한스템 수행한다.   
      MOV [0008], AX 명령이 수행되었다.   
      결국 3171:0008의 내용이 0007이 된다.   
       
      -g   

      프로그램이 정상적으로 종료되었습니다   
       

      프로그램을 끝까지 실행한다.
      -t   

      AX=3171  BX=0000  CX=0018  DX=0000  SP=0100  BP=0000  SI=0000  DI=0000   
      DS=3160  ES=3160  SS=3172  CS=3170  IP=0003   NV UP EI PL NZ NA PO NC   
      3170:0003 8ED8          MOV     DS,AX   
       

      처음부터 다시 trace 한다.   
       
      -e 3171:0004   
      3171:0004  02.10   
       
      변수 A 값에 강제로 10을 할당한다
      -g   

      프로그램이 정상적으로 종료되었습니다   
       

      프로그램을 끝까지 실행한다.
      -d 3171:0004   
      3171:0000              10 00 05 00-15 00 0C 8E 06 4E 55 32   
       
      3171:0004 에는 10이 들어있고 결과에는 0015 가 들어있다.
      -a 0005   
      3170:0005 mov ax, [0002]   
      3170:0008   
       
      0005 번지의 어셈블 명령을 mov ax, [0004] 에서 mov ax, [0002] 로 바꾸었다.   
       
      -u 0   
      3170:0000 B87131      MOV     AX,3171   
      3170:0003 8ED8       MOV     DS,AX   
      3170:0005 A10200      MOV     AX,[0002]   
      3170:0008 03060600     ADD     AX,[0006]   
       
      프로그램이 빠뀌어 있음을 보았다.   
       
       
     
MASM 어셈블러 사용법및 debug, codeview 의 사용법은 교재 부록 D 와 E 를 참조할것