Computer Security

#12 컴퓨터의 데이터표현 2 본문

컴퓨터구조&어셈블리어

#12 컴퓨터의 데이터표현 2

쿠리 Kuri 2022. 5. 26. 18:30

프로그램 기본 구조

 

.MODEL SMALL

-메모리 모델을 정의한다. Small의 경우 데이터 세그먼트와 코드 세그먼트가 각각 하나씩 존재하는데, 대부분의 실습용으로 충분하다.

.DATA,  .CODE
-데이터 세그먼트와 코드 세그먼트를 나타내는 어셈블리어 지시어

.PROC
-프로시저의 시작을 나타내는 지시어. RPOC 앞에는 프로시저의 이름이 들어간다.

.ENDP

-프로시저의 끝을 나타내는 지시어. ENDP 앞에 프로시저의 이름이 들어간다.

.END

-전체 프로그램의 끝을 나타내는 지시어

-END 다음에 들어가는 인수는 옵션이지만, 대부분의 경우 프로그램의 시작지점이 되는 첫 번째 프로시저의 이름(ex. main) 이 들어간다.

 

 

프로그램 실행의 종료

-INT(interupt) 21H(0x21) 는 AH로 수행할 인터럽트 서비스 루틴(ISR)을 지정(어떤 루틴을 실행할지 function code를 지정한다.) 하여 호출하는 명령이다. ISR은 일반적으로 OS에서 제공한다.

OS는 응용 프로그래머가 직접 구현하기 까다로운 입출력이나 각종 시스템과 연관된 루틴들을 제공한다.

-AH의 값이 0x4C일 때는 프로그램의 종료를 요청하며, AL의 값이 프로그램의 반환  코드로 이용된다.

-일반적으로 정상종료를 나타낼 때 0을 사용한다.

 

AX 반으로 쪼개서 AH, AL 나누는데 AH는 function코드, AL은 반환코드로 쓰인다.

 

MOV AH, 4CH  ; 처리 종료 요청

MOV AL, retcode  ; 반환 코드 설정

INT 21H  ; ISR 호출

 

ex)  (대부분의 어셈블러들은 대소문자 구분하지않는다.)

.model small   ; 메모리 모델 정의
.stack 100h   ; 스택 영역을 바이트 단위로 할당
.data      ; 데이터 세그먼트
     ;변수 정의
.code        ; 코드 세그먼트
main proc
   ;main 프로시저의 코드 작성
   ;...
   ; 프로그램 종료
   mov ax, 4c00h
   int 21h

main endp
; 다른 프로시저 정의
end main

 

식별자 규칙

-식별자(identifier)는 프로그램에서 참조할 항목을 표현하기 위해 사용하는 이름이다.

-식별자는 이름(name)과 레이블(label) 두 가지 유형으로 구분된다.

 

이름(name) : COUNTER과 같이 데이터 항목의 주소를 참조한다.

         COUNTER DB 0

 

레이블(label): 다음 문장의 MAIN과 B30처럼 명령어, 프로시저, 또는 세그먼트의 주소를 참조한다.

         MAIN PROC FAR
         B30:  ADD BL,  25

 

 

데이터 정의 지시어

 

정의          바이트크기      구형       신형

바이트          1                 DB         BYTE

워드             2                 DW        WORD
이중워드       4                 DD         DWORD
삼중워드       6                 DF          FWORD

사중워드       8                 DQ         QWORD

10바이트      10                DT          TBYTE

 

정수 상수와 기수법

-정수 데이터를 기술할 때는 십진수 상수 외에도 이진수나 팔진수, 십육진수도 사용 가능하며, 이들 숫자의 진법을 구분하기 위해 MASM은 기수 지정자(redix specifier)를 제공한다. 기수 지정자는 숫자 상수뒤에 접미사 형태로 붙는다.

이진수: b/y (y는 MASM 6.0부터 도입)

ex) 10101100b , 110110y

팔진수: o/q

ex) 42o, 42q

십진수:d/t(십진수 상수의 경우 기수 지정자는 옵션, t는 MASM 6.0부터 도입)

ex) 100, 123d, 456t

십육진수:h

ex)10h, 0abh

 

-십육진수 상수의 경우 맨 앞이 알파벳인경우 십육진수 숫자가 아니라 식별자로 인식될 수 있기 때문에 A~F로 시작하는 상수의 경우 그 앞에 0을 붙이도록 한다.

ex) ABH  ->  0ABH

 

 

배열

-배열은 메모리 공간상에 연속적으로 배치된 데이터들의 집합이다.

-어셈블리어에서 배열은 데이터들을 콤마(,)로 구분하여 나타낸다.

 

ex)

.data

arr1   db  21h, 22h, 23h, 24h, 25h

arr2   dw  1260h, 8589h

 

 

문자와 문자열

-문자나 문자열은 따옴표(' 또는 ") 기호를 사용한다. 큰 따옴표("")와 작은 따옴표('') 모두 사용할 수 있다.

-따옴표 안에 들어가는 문자들은 어셈블러에 의해 ASCII 코드 값으로 변환되어 프로그램에 저장된다.

-ASCII 코드는 한 문자당 1바이트 크기를 가지므로, 바이트 배열로 표현할 수 있다.

 

ex)

.data

str1 db 'Hellow, World!'

->  48 65 6C 6F 2C 20 57 6F 72 6C 64 ...

 

 

반복 카운트: DUP

-DUP를 이용하면 단순 반복되는 상수들을 쉽게 기술가능하다.

        [이름]      Dn     반복_카운트      DUP(수식)

 

ex)

.data

arr1   db  3 dup(10h)   ; 10h 를 3개 반복

arr2  db   3   dup(5 dup(0abh))   ;  abh를 15개 반복

 

초기화되지 않은 변수

-물음표(?) 기호를 이용하면 해당 메모리 영역을 초기화하지 않은 상태로 둘 수있다.

        var1       db   ?

        var2       db  10 dup(?)

위와 같이 DUP에 ? 기호를 사용할 수도 있다.

 

 

기호 상수

 

등호 지시어: 이름에 수식 값을 배정한다. 등호 기호(=) 는 같은 이름에 여러번 사용할 수 있다.

 

EQU 지시어: 동치 지시어로, 단 한 번만 사용 가능하다. 예를 들어, 어셈블러는 FACTOR라는 심볼을 12로 변환한다.

ex)    (재정의 불가)

FACTOR  equ 12

;FACTOR equ 22; 해당 문장은 오류를 발생시킨다.

 

TEXTEQU 지시어: MASM 6.0은 텍스트 데이터를 재정의하기 위해서 TEXTEQU지시어를 도입했다.

               이름        TEXTEQU       <텍스트>

 

ex)  

PROMPT_MSG        TEXTEQU <'add, Change, or Delete?'>

USER_PROMT         DB    PROMPT_MSG

 

-> USER_PROMT  DB  'add, Change, or Delete?'

 

PROMPT_MSG 가  TEXTEQU를 거치면,  'add, Change, or Delete?' 로 변환된다.

 

 

INT 명령어

-소프트웨어 인터럽트. BIOS나 DOS에 있는 인터럽트 서비스 루틴(ISR)을 호출한다.

-INT 다음에는 인터럽트의 종류를 나타내느 숫자 값을 기술한다.

ex) INT 10h 는 비디오 서비스, INT 16h는 키보드 서비스, INT 21h는 MS-DOS 서비스를 호출한다.

 

INT 21H

-DOS에서 제공하는 서비스 루틴을 호출한다.

-운영체제는 입출력, 파일 처리, 메모리 관리 등 프로그래머가 직접 구현하기 까다로운 저수준 영역의 루틴들을 제공한다. 

-DOS에서 제공하는 ISR의 종류도 다양하므로, 이를 지정하기 위해서 AH 레지스터 값을 이용한다.

ex) 그 값으로 4CH를 지정할 경우, 실행 중인 프로세를 종료하는 서비스 루틴을 호출한다.

 

MOV 명령어

-데이터 전송 명령어다. MOV dest, src 형태로 쓴다.

ex) AH 레지스터에 4CH 값을 적재하기 위해서는 다음과 같이 코드를 작성한다.

                       MOV AH, 4CH

 

 

LEA 명령어

-Load Effective Address: 유효 주소 적재

-메모리 변수의 오프셋 주소를 레지스터에 적재(load)하는 명령어다.

-LEA dest, src 형태로 쓴다. 

ex) 문자열 str1의 시작 주소를 DX에 적재하려면 다음과 같이 코드를 작성한다.

                     LEA DX, str1

 

데이터 세그먼트 레지스터 DS의 초기화

-데이터 세그먼트를 사용하려면, 프로그램 시작 부분에 데이터 세그먼트의 시작주소를 나타내는 레지스터인 DS의 값을 초기화 하는 코드를 넣어야 한다.

-데이터 세그먼트의 주소를 나타내는 특수 기호로 @data가 있다.

 

DS 초기화 코드

      MOV AX, @data

      MOV DS, AX

 

 

Comments