프로그래밍[Univ]/하드웨어

[하드웨어] Assembly Part 1 (IA-32)

Cloud Travel 2012. 5. 10. 00:38
* Assembly Language

 - Integer Constant : 부호와 하나이상의 숫자 + 접미에 진수가 붙음(radix)

   [{+|-}] digits [radix]

   [radix] > h | r | q | o | t | d | y | b

    > h : hexa, r : encoded real, q or o : octa, t : decimal(alterute)

      d : decimal, y : binary(alterate), b : binary

    ※ 16진수는 변수와의 구분을 주기 위해서 만앞에 0을 붙여준다.

    ※ 만약 radix가 없다면 10진수로 생각!!

     ex) 26    decimal  /  32q   octa  /  1101b   binary   / 0A2h    hexa


 - Integer Expression : 정수 값과 산술 연산자를 포함하는 수학식, 32bit에 저장

 

 - 실수 상수 : 10진 실수(decimal real)와 부호화된 실수(encoded real) 2개의 타입이 존재.

   [sign] integer.[integer][exponent]

   [sign] > { + , - }

   [exponent] > E [{+,-}] integer

    ex) +3.0 , 26.E5


 - character constant : 홑 따음표나 겹따음표로 둘러싸인 하나의 문자

    ex) 'a'


 - String constant : 홑 따음표나 겹따음표로 둘러싸인 문자들의 열

    ex) 'ABC', "Good morning"

   > 스트링의 끝은 \0(null)로써 알려주는데, 자동적으로 들어가지는 않는다.

    ex) variable BYTE 'ABC' > 3BYTE 이다.

   > 내부에 다른 종류의 따음표가 들어오는 것은 관계가 없다.

   > 같은 종류가 내부에 온다면 쌍의 개수가 같아야 한다.

    ex) 'abc'(O), 'a'b'c'(O), 'a'bc'(X), "a'bc"(O), "a"b"c"(O)

 

 - reserved word : 특별한 의미를 갖고 있으며 올바른 문맥에서만 사용 가능

    ex) MOD, ADD, MUL, 수학연산자들, Symbol


 - identifier : 프로그래머가 작성한 변수 이름으로 대소문자 구분을 하지 않는다.


 - directive : 소스코드를 어셈블 할 때 어셈블러가 인식하고 활용하는 명령어

                  프로그램을 나눠즈는 구분자 역할을 한다.

    ex) .data : 변수를 포함한 프로그램 영역

        .code : 명렬어를 포함하는 프로그램 영역

        [name] proc : 프로시져의 시작지점(프로시져 - 메소드, 프로세스 개념)

 

 - label : 명령어 혹은 데이터의 위치를 표시하는 하나의 식별자

  > code label : 프로그램의 코드 영역에서 레이블은 (:)로 끝난다.

  > data label : 프로그램의 데이터 영역에서 사용될 경우 콜론으로 끝낼 수 없다.

  > [Label1:] instruction mnemonic [operands] 


 - instruction mnemonic : 수행되는 동작을 식별하기 위한 짧은 단어

     ex) mov(두개의 사이즈가 같아야 한다), add, sub, mul, jmp, call, ...

  > Label과 variable은 주소값을 가지고 있는 것이다.(포인터 역할)

   ex) Label 1: mov ax, 0

                     mov bx, 1

                     ...

                     jmp Label 1   ; Label1로 돌아감.(위치로 가는 것이아니라, 주소로 찾아가는 것)

         Label2 : BYTE "ABCDE"  ; A위치의 주소값을 가지고 있다.

 

 - operend : 레지스터 이름, 변수이름, 상수표현, 상수값이 피연산자로 올 수 있다.


 - comment : ';'한줄 주석 / 사용자 지정 symbol ~ symbol


* Program ex... 3정수의 합

TITLE ADD AND SUBSTRACT

; THIS PROGRAM ADDS AND SUBSTRACTS 32BIT INTEGERS

INCLUDE Irvin32.inc

.code ; code segment의 시작을 알린다.

main PROC ; PROC : 디텍티브가 프로시저 시작을 알린다.

move eax, 1000h ; EAX = 1000h

add eax, 4000h ; EAX = 5000h

sub eax, 2000h ; EAX = 3000h

call DumpRegs ; display register

; 현재 CPU의 register 값을 표시하는 프로시져 호출

exit ; 미리 정의된 MS함수를 간접적으로 호출

main ENDP

END main


- segment : 코드, 데이터, 스택 세그먼트로 구성되어 있다.

 > code segment : 프로시저를 하나 이상 포함하며, 프로그램의 모든 실행문이 있는 시작을 알린다.

 > stack segment : 프로시저 매개변수나 지역변수들을 가진다.

 > data segment : 변수를 저장


* Assemble-Link-Execute cycle

 ⓐ text editor를 사용해 source file을 생성

 ⓑ assembler는 source file을 object file로 변환

    (옵션에 따라 listing file도 생성, listing file : 프로그램 소스 코드 복사본

 ⓒ linker에 object file을 읽은후 의해서 link library안에 있는 프로시져를 호출하는지 점검 후

    필요한 프로시저는 object 파일과 합쳐서 executable file을 생성

    (옵션에 따라 map file을 만들 수 있다, map file : 링크될 프로그램에 포함된 세그먼트 정보)

    (map file has "exe module name, list of public symbol, start address, segment name, ...)

 ⓓ loader를 이용해 실행 파일을 메모리로 읽어 드리고 프로그램의 실행 결과 값을 도출한다.


* Data 정의

 - 데이터 정의문

   [name] directive initializer [initializer] ...

   ※ initializer는 필수이다. ?로 표시해서 라도 null로 초기화

   ex) VALUE1 BYTE 'A'

       VALUE2 SBYTE -128

       VALUE3 BYTE ? ; 프로그램 실행시 값이 할당 될 것을 알름

       LIST BYTE 10,20,30,40 ; 배열과 같이 생성 

       STRING1 BYTE "GOOD AFTERNOON", 0

       ; 0 C의 \0와 같이 0으로 문자열의 끝을 알린다.

       VALUE3 BYTE 20*30, 1 ; 2BYTE짜리이다. ','로 구분되는 것으로 새야한다.

       STRING3 BYTE "HELLO", 0DH, 0AH, 0

       ; 0DH, 0AH > CR | LF 로 커서를 다음줄 맨왼쪽으로 보낸다. 총 8byte이다.


 - 각 변수를 지정해주면 OFFSET값이 0부터 BYTE크기 만큼씩 증가한다.


* Symbol constant

 - 저장 공간을 미사용하며, 실행중에 값이 변하지 않는다.

 - 변수와의 차이점!!

 - equal sign

  name = expression

  ex) count = 500

      mov ax, count

      -------------

      mov ax, 500

      어떻게 작성을 하나 어셈블러는 아래와 같이 동작할 것이다.

 - symbol을 사용하는 이유 : 프로그램 사용시 500을 자주 사용시, 나중에 유지 부수때 이점이 있다.


* 배열과 문자열의 크기 계산

 - 어셈블러가 자동적으로 계산하게 만드는 것이 system 가용성 면에서 좋다.

 - size는 현재 위치를 나타내는 카운터 '$'를 사용한후 list offset을 감하고, 데이터 size로 나눈다.

  ex) list BYTE 10,20,30,40

      listSize = ($-list)/size

 - 정확한 길이를 알기 위해서는 배열 생성과 동시에 길이를 계산해 주는 것이 좋다.


* DUP(duplicate)

 - TYPE 개수 DUP(data)

   ex) BYTE 20 DUP(0)  => 20개의 0의 BYTE가 복제된다.(20BYTE)

        1BYTE * 20 DATA VALUE = 0

        BYTE 4 DUP ("ABC") 

        1BYTE * 4 * 3BYTE = 12BYTE

        WORD 5 DUP(1000H)

        2BYTE * 5 * 1 = 10BYTE

        ATABLE BYTE 4 DUP(3 DUP(0), 2 DUP(X))

                    1BYTE * 4 * ( 3 + 2 )  = 20 BYTE    // ','로 구분을 잘하자 000XX000XX000XX000XX


* EQU directive

 - 심벌 이름을 정수 수식이나 임의의 문자와 연결 = const 개념

 - Equal sign과 다르게 redefine이 불가능하다.

 - text를 EQU할때는 '<>'로 묶어준다.

   syntax) name EQU expression

   ex) MATRIX1 EQU 10*10 
        MATRIX2 EQU <10*10>

        M1 WORD MATRIX1 ; 100으로 치환. 100값을 가진 WORD 하나가 생성

        M2 WORD MATRIX2 ; 10*10의 문자열로 치환. 5*2 = 10BYTE의 데이터공간을 소모

 - TEXTEQU 디렉티브

  > 문자 메크로를 만들 수 있다. 특정 행동을 정의

  > redefine이 가능하다.