반응형

hello.asm 분석


======================================================

extern printf  : 외부에 있는 printf를 가져다 쓰겠다


section .data ; initialized data segment


msg:    db     'hello world!!!',10(뉴 라인),00(문자열을 마지막을 나타냄) : \n은 못씀

-- 아스키 코드

;;;"hello,world!!!\n" <- c언어로 표현

위와 똑같음 'H','e','l','l','o , world!!!"

section .text

global main


main:  ; entry point

        push    msg

        call    printf


-- main도 레이블입니다. (여기서는 레이블 명이 꼭 main이어야 합니다. )

(gcc에서 main 레이블을 찾기 때문입니다)


======================================================

C언어


 - 문자: '(작은 따옴표)

 - 문자열: "(큰 따옴표)


 - 'hello'(x), 'h'(o)

 - "hello"(o), "h"

 

NASM


 -문자, 문자열: '(작은 따옴표)



data segment에서 문자열을 표현


 - 레이블: <white space> 크기 <white space> 초기값


 - 변수 이름이 아니다!!


 - 변수의 개념과는 다른 개념


 - 주소의 또 다른 표현


함수를 호출하기 전에 문자열의 주소를 미리 push해 놓아야한다





기본 데이터의 단위(32비트)


단위     크기 C정의                        NASM(문자)

byte         1 char                          b 

word         2 short                         w

double word        4 int,long(32비트),float     d

  pointer(32비트)

quad word         8      long long,double          q

ten byte         10



extern printf


section .datal initialized data segment


msg1:   db      '%s %s',10,00 ;char msg1[] = "%s %s\n"

msg2:   db      'hello, ',00

msg3:   db(datasegment의 byte)       'wolrd!!!',00

buffer:  dd       1,2,3,4,5;    int buffer[]={1,2,3,4,5};

section .text

global main


main :  ;entry point

        ; printf("%s %s\n", "hello,","world!!");

        push    msg3

        push    msg2

        push    msg1

        call    printf


bss segment에서의 데이터 표현


- 레이블: <white space> 단위 <white space> 크기

-int a;

-char str[1024];




text segment에서 명령어 표현


 - 레이블:


명령어

명령어

...


CPU가 사용하는 데이터 저장소


1. 메모리


2. 레지스터


 - CPU가 사용하는 고속의 기억소자

 - 특별한 용도를 위해서 사용하는 저장공간

 - CPU당 한개의 레지스터만 제공

 - 레지스터를 새로 생성, 수정, 삭제 등을 할 수 없다.

 

intel ia32 architecture에 intel 레지스터 잘 정리




1). 범용 레지스터


 - EAX(Extended Accumulator Register) : 주로 연산할때 사용(용도가 다양함)

 - EBX(Extended Base            Register) : EAX 보조 용도

 - ECX(Extended Counter       Register) : 명령어 내에서 반복하거나 했을때의 횟수를 저장

 - EDX (Extended Data          Register)


2). 포인터 레지스터

 

 - ESI(Extended Source Index): 주소를 다룸

 - EDI(Extended Dst.     Index): 문자열 복사할때 주로 사용

 - ESP(Extended Stack   Pointer): 주로 스택 세그먼트에서 사용

 - EBP(Extended Base    Pointer): 주로 스택 세그먼트에서 사용

 - EIP(Extended  Instruction Pointer): 명령어에 대한 주소를 가지고 있음

!EIP를 수정함으로써 시스템이 비정상으로 (흐름이 바뀜) 돌아가게 할 수 있습니다


3). 상태 레지스터


 - EFLAGS : 상태정보를 나타냅니다



4). 세그먼트 레지스터(메모리 가상할때 이해해야합니다)





printf 함수 안에 여러개의 인자 넣은 코드 짜보기


C언어



어셈블리



어셈블리에서는 push를 뒤에서부터 넣는걸로 주의해야합니다!



[실습] 다음과 같이 출력하는 어셈블리 프로그램을 작성하세요

(0)_(0)(0)_(0)

(=^.^=)(*^.^*)

(_m_m_)(_m_m_)


코드



결과



  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기