[libasm] Assembly - 상수

Park Sejin·2021년 4월 1일
0
post-thumbnail

NASM에서 상수를 정의하는 몇가지의 지시어가 있다. 이미 EQU 지시어를 이전 장에서 사용했다. 다음 세 가지 지시어에 대해 다루어 볼 것이다.

  • EQU
  • %assign
  • %define

EQU 지시어

EQU 지시어는 상수를 정의하는데 사용된다. EQU 지시어 구문은 다음과 같다.

상수명 EQU expression

예를 들어,

TOTAL_STUDENTS equ 50

어셈블리 코드 상에서 다음과 같이 상수를 사용할 수 있다.

mov ecx, TOTAL_STUDENTS
cmp eax, TOTAL_STUDENTS

EQU 구문의 피연산자는 표현식이 될 수 있다.

LENGTH equ 20
WIDTH  equ 10
AREA   equ length * width

AREA를 200으로 정의하는 코드이다.

예제
다음은 EQU 지시어 사용을 설명하는 코드이다.

❗️   64비트 Intel macOS에서 동작하는 코드이다.

SYS_EXIT	equ 0x2000001	; exit 시스템 콜 번호
SYS_WRITE	equ 0x2000004	; write 시스템 콜 번호
STDIN		equ 0		; 표준입력
STDOUT		equ 1		; 표준출력
section .text
	global _main

_main:
	mov	rax, SYS_WRITE
	mov	rdi, STDOUT
	mov	rsi, msg1
	mov	rdx, len1
	syscall

	mov	rax, SYS_WRITE
	mov	rdi, STDOUT
	mov	rsi, msg2
	mov	rdx, len2
	syscall

	mov	rax, SYS_WRITE
	mov	rdi, STDOUT
	mov	rsi, msg3
	mov	rdx, len3
	syscall

	mov	rax, SYS_EXIT
	mov	rdi, 0		; exit 함수의 파라미터에 0을 저장한다. 그렇지 않으면 프로그램 종료 시 exit code를 리턴한다.
	syscall

section .data
	msg1	db 'Hello, programmers!', 0xA,0xD
	len1	equ $ - msg1

	msg2	db 'welcome to the world of,', 0xa,0xd
	len2	equ $ - msg2

	msg3	db 'Linux assembly programming! '
	len3	equ $ - msg3

위의 코드를 컴파일하고 실행하면, 다음과 같은 결과를 얻을 수 있다.

Hello, programmers!
Welcome to the world of,
Linux assembly programming!

%assign 지시어

%assign 지시어는 EQU 지시어와 같이 숫자 상수를 정의하는데 사용된다. %assign 지시어는 재정의를 허용한다. 예를 들어, 다음과 같이 TOTAL 상수를 정의할 수 있다.

%assign TOTAL 10

그 후에, TOTAL을 다음과 같이 재정의 할 수 있다.

%assign TOTAL 20

%define 지시어

%define 지시어는 숫자 상수와 문자열 상수 정의 모두 허용한다. %assign 지시어는 C언어의 #define과 유사하다. 다음과 같이 상수 PTR을 정의할 수 있다.

%define PTR [EBP + 4]

위 코드에서 PTR은 [EBP + 4]로 대체된다.
%define 지시어는 재정의가 가능하고 대소문자를 구분한다.

출처

tutorialspoint.com

0개의 댓글