Language/Assembly Assembly(Assembly 기초/C소스 어셈블리로 코딩하기)
  • 728x90
    반응형

     

    목차

       

      Assembly 기초

      mov     al, 'A'

      mov     reg32 imm8

       

      • 'A' 아스키코드는 imm8 로 나타낸다.

      mov     eax, number1

      mov     reg32, memory

       

      • cpu 밖으로 bus를 타고 나감으로 속도가 느리다.

      mov     eax, ebx

      mov    reg32, reg32

       

      • 레지스터 간의 이동 이므로 속도가 빠르다.

      mov    [eax], 10    :: [eax] = *eax 동일한 형식

       

      • 포인터를 사용한 것은 indirect 라고 한다. (간접 참조)

      number2 = 10;

      number1 = number2;

       

      • 위와 같은 C언어문법 형태로 어셈블리에서는 불가능하다. (Cpu 를 거치지않고 메모리에서의 이동은 두뇌가 없는 것과 같다.)
      • 기계어 보는 법은 다음과 같다.

       

       

       

       

      mov    number1, eax

      mov    direct, EAX

       

      • 위 메모리뷰 에서 a3는 mov의 기계어 Opcode 이다.

       

      C 소스 Assembly로 코딩하기

      EX) 어셈블리로 바꾸어 코딩할 C소스

      #include <stdio.h>
      
      int main()
      {
          int sum = 0;
          int temp = 0;
      
      
          printf("Enter the x: ");
          scanf("%d", &sum);
          printf("Enter the y: ");
          scanf("%d", &temp);
          sum = temp + sum;
          printf("Enter the z: ");
          scanf("%d", &temp);
          temp = temp * 2;
          sum =sum - temp;
          ++sum;
          -sum;
          printf("(x + y - 2z + 1) is %d\n", sum);
      
          return 0;
      }

       

      위 C소스를 어셈블리로 변환

      EX) first.asm

      .386      
      
      
      .MODEL FLAT
      
      ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD
      
      
      INCLUDE io.h 
      
      cr  EQU  0Dh  
      Lf  EQU  0Ah  
      
      .STACK 4096 
      
      .DATA     
      number1 DWORD  ?  
      number2 DWORD  ?
      
      prompt1 BYTE  "Enter First Number : ", 0
      prompt2 BYTE  "Enter Second Number : ", 0
      prompt3 BYTE  "Enter Third Number : ", 0
      
      string  BYTE  40  DUP  (?)
      
      label1  BYTE  cr, Lf, "(x + y - 2z + 1) is"
      
      sum  BYTE  11  DUP  (?)
        BYTE  cr, Lf, 0
      
      .CODE  
      _start:  
      
        output  prompt1    
      ; printf("Enter First Number : ");
        input  string, 40
      ; scanf("%d", &sum);
        atod  string
        mov  number1, eax
        
        output  prompt2
      ; printf("Enter Second Number : ");
        input  string, 40
      ; scanf("%d", &temp);
        atod  string
        mov  number2, eax
        
        mov  eax, number1
        add  eax, number2
        mov  number1, eax
      ; sum = temp + sum;
      
        output  prompt3
      ; printf("Enter Third Number : ");
        input  string, 40
      ; scanf("%d", &temp);
        atod  string
        mov  number2, eax
      
        mov  eax, number2
        add  eax, eax
        mov  number2, eax
      ; temp = temp * 2;  
      
        mov  eax, number1
        sub  eax, number2
        mov  number1, eax
      ; sum =sum - temp;  
      
        mov  eax, number1
        inc  eax
        mov  number1, eax
      ; ++sum;
        
        mov  eax, number1
        neg  eax
      ; -sum;
      
        mov   eax, number1
        dtoa  sum, eax
      
        output  label1
      
        INVOKE  ExitProcess, 0
      
      PUBLIC  _start
      
      END

       

      실행 결과

       

       

       

       

       

       

      728x90
      반응형
    상단으로