[libasm] Assembly - 변수

Park Sejin·2021년 3월 31일
0
post-thumbnail

NASM은 변수 저장 공간을 할당을 위한 다양한 define directive(지시어)를 제공한다. define directive(지시어)는 저장 공간의 할당을 위해 사용된다. 하나 또는 그 이상의 바이트를 초기화하는데 사용된다.

초기화 된 데이터를 저장 공간에 할당하기

초기화 된 데이터를 저장 공간에 할당하는 구문은 다음과 같다.

[변수 이름]  지시어  초기값  [, 초기값]...

변수 이름은 각 저장 공간의 식별자이다. 어셈블러는 데이터 세그먼트에 정의된 각 변수 이름의 오프셋 값을 처리한다.
다음은 define directive(지시어)의 다섯 가지 기본 형태이다.

지시어목적저장 공간
DBByte 정의1바이트 할당
DWWord 정의2바이트 할당
DDDoubleword 정의4바이트 할당
DQQuadword 정의8바이트 할당
DTTen Bytes 정의10바이트 할당

define directive(지시어)를 사용하는 예이다.

choices		DB 'y'
number		DW 12345
neg_number	DW -12345
big_number	DQ 123456789
real_number1	DD 1.234
real_number2	DQ 123.456

아래의 사항들을 주의해야 한다.

  • 문자의 각 바이트는 16진수 ASCII 코드 값으로 저장된다.
  • 10진수 값은 자동적으로 16진수 수로 변환되어 저장된다.
  • 프로세서는 리틀 엔디언 방식을 사용한다.
  • 음수는 2의 보수 표현으로 변환된다.
  • short, long 부동 소수점 수는 각각 32비트, 64비트로 표현된다.

다음은 define directive(지시어)의 사용을 보여주는 프로그램의 코드이다.

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

section .text
	global _main		; 링커를 위해 반드시 선언해야 한다.

_main:				; 링커에게 시작점을 알려준다.
	mov rdx, 1		; 메세지 길이
	mov rsi, choice		; 출력할 메세지
	mov rdi, 1		; 파일 디스크립터(표준출력)
	mov rax, 0x2000004	; 시스템 콜 번호(write)
	syscall			; 시스템 콜 호출

	mov rax, 0x2000001	; 시스템 콜 번호(exit)
	mov rdi, 0		; exit 함수의 파라미터에 0을 저장한다. 그렇지 않으면 프로그램 종료 시 exit code를 리턴한다.
	syscall			; 시스템 콜 호출

section .data
	choice DB 'y'

컴파일 후 실행하면, 다음과 같은 결과를 확인할 수 있다.

y

초기화 되지 않은 데이터를 위한 저장 공간 할당

reserve directive는 초기화 되지 않은 데이터를 위한 저장 공간을 할당하는데 사용한다. reserve directive는 reserve할 공간 수를 지정하는 한 개의 피연산자를 받는다. 각 define direct에 대응하는 reserve directive가 존재한다.

다음은 reserve directive의 다섯 가지 기본 형태이다.

DirectivePurpose
RESBReserve a Byte
RESWReserve a Word
RESDReserve a Doubleword
RESQReserve a Quadword
RESTReserve a Ten Bytes

여러개 정의하기

프로그램에 여러개의 데이터를 정의할 수 있다. 예를 들어

choice  DB 'Y'		; y의 ASCII 값은 79H
number1 DW 12345	; 12345D = 3039H
number2 DD 123456789	; 123456789D = 75BCD15H

어셈블러는 여러개의 변수 정의에 대해 연속된 메모리를 할당한다.

여러개 초기화하기

TIMES directive는 같은 값으로 여러개를 초기화한다. 예를 들어, 다음과 같은 구문을 사용하여 길이가 9인 marks 배열을 정의하고 모두 0으로 초기화할 수 있다.

marks TIMES 9 DW 0

TIMES directive는 배열과 테이블을 정의하는데 유용하다. 다음은 9개의 에스터리스크를 출력하는 프로그램이다.

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

section .text
	global _main		; 링커를 위해 반드시 선언해야 한다.

_main:				; 링커에게 시작점을 알려준다.
	mov rdx, 9		; 메세지 길이
	mov rsi, stars		; 출력할 메세지
	mov rdi, 1		; 파일 디스크립터(표준출력)
	mov rax, 0x2000004	; 시스템 콜 번호(write)
	syscall			; 시스템 콜 호출

	mov rax, 0x2000001	; 시스템 콜 번호(exit)
	mov rdi, 0		; exit 함수의 파라미터에 0을 저장한다. 그렇지 않으면 프로그램 종료 시 exit code를 리턴한다.
	syscall			; 시스템 콜 호출

section .data
	stars	times 9 db '*'	; times directive로 '*'9개 있는 stars문자열 정의

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

*********

출처

tutorialspoint.com

0개의 댓글