Language/Assembly

Assembly(Assembly 기초/C소스 어셈블리로 코딩하기)

Dexter_- 2017. 7. 25. 15:48
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
    반응형