본문 바로가기
CSE/system programing

[시스템 프로그래밍 5-2] 어셈블리어 기호상수 Symbolic Constants

by 뜨거운 개발자 2023. 3. 30.
728x90

Symbolic Constants (기호 상수)

C나 C++을 쓴 사람들은 #define PI 3.14 와 같이 해본 걸 볼 수가 있을텐데, 이것은 우리는 Symbolic Constants라고 불렀다. (전처리 과정을 거쳤다.)

  • 즉 기호상수는 indentifier(Symbol)을 정수 표현식 또는 일부 텍스트와 연결하여 생성된다.
  • 별도의 저장공간을 예약하지 않는다.
    • 프로그램을 스캔할 때 어셈블러만 사용한다.
    • 런타임중에 변경할 수 없다.

1. 동일 서명 지시문 (Equal-Sign Directive)

  • 심볼 이름이 정수 표현식에 연결된다.

사용 : name = expression

  • 일반적으로 표현식은 32비트이 정수값이다.
  • 프로그램이 어셈블 될 때 전처리 단계에서 모든 이름 항복이 표현식으로 대체된다.

이건 마이크로 소프트의 MASM 어셈블러가 제공하는 기능이다.!

  • 사용 이유 가독성과 유지보수에 장점.

현재 위치 카운터($) Current Location Counter

  • 가장 중요한 심볼중에 하나이다.
  • 예를 들어서 다음 선언은 selfPtr이라는 변수를 선언하고 변수의 오프셋 값으로 초기화한다. : selfPtr DWORD $ 즉 자기 자신을 가리키는 주소를 의미하는 변수 선언한 것이다.

키보드 정의에 사용 예시 (읽기 편하고 유지보수에 좋다)

DUP연산자 사용

  • 프로긂 유지보수를 간소화하기 위해 DUP에서 사용하는 카운터는 기호상수여야 한다.

재정의

  • =으로 정의된 기호는 동일 프로그램내부에셔 재정의 할 수 있다.
  • 심볼의 값 변경은 런타임 실행 순서와 관련이 없다.

2. 심볼릭 상수를 사용해서 배열이나 문자열의 크기 계산하기

일반적으로 배열을 어셈블리어에서는 다음과 같이 사용이된다.

다만 배열의 크기를 명시적으로 지정하면 나중에 배열의 요소를 삽입하고 제거할 때 오류가 발생할 수 있다.

  • 더 나은 방법은 어셈블러가 값을 계산하도록 하는 방법이다.
    • $ 연산자 (현재위치 카운터)는 현재 프로그램문과 관련된 오프셋을 반환한다.
    • 따라서 위와 같이 사용가능 (다만 이게 바이트 단위기 때문에 이렇게 사용이 된것이다. 만약 크기가 바이트가 아니면 알아서 나눠서 길이 구하기)
    • ListSize는 목록 바로 뒤에 와야한다.

단어 및 배열 등 단어

!!사이즈로 나눠주기 주의!!

3. EQU Directive(지시어)

  • 기호 이름을 정수 표현식 또는 임의의 텍스트와 연결한다.
  • 세가지 형식이 존재한다.
  • = 과 다른점은 = 는 int형식만 가능했지만(문자열도 다 아스키라 가능) 이건 다른것도 가능하다.
    • 첫번째 형식에서는 표현식은 유효한 정수 표현식이어야 한다.
    • 두번째 형식에서 심볼은 = 또는 EQU로 이미 정의된 기존 심볼의 이름이다.
    • 세번째 형식은 <>괄호 안에 텍스트를 넣는다.
  • 정수로 사용되지 않는 값을 정의 할 때 유용하다.

예시

결과

  • 재정의를 허용하지 않는다.
    • =지시어는 재정의 할 수 있었지만 EQU로 정의된 심볼은 동일한 소스코드파일에서 다시 정의할 수 없다.
    • 이것은 실수를 방지할 수 있다.

4. TEXTEQU Directive(지시어)

  • 텍스트 매크로로 알려진 것을 생성한다.
  • 세가지 형식이 있다.
    • 첫 번째는 텍스트를 할당합니다.
    • 두 번째는 기존 텍스트 매크로의 내용을 할당합니다.
    • 세번째는 상수 정수 표현식을 할당합니다
  • 재정의 가능하다.

Uploaded by N2T

728x90