외로운 Nova의 작업실

Assembly 언어 공부 - 34(구조체) 본문

Programming/Assembly

Assembly 언어 공부 - 34(구조체)

Nova_ 2022. 10. 29. 17:45

안녕하세요, 이번 시간에는 구조체에대해서 정리 및 공부해볼까합니다.

 

- 구조체 

어셈블리에서 구조체는 c언어의 구조체와 비슷합니다. 구조체의 변수들은 어셈블리에서 필드라고 부릅니다.

 

- 구조체 정의하기

구조체를 정의할때는 아래와 같은 코드를 사용합니다.

name STRUCT
	filed-declarations
name ENDS

마우스 커서의 x좌표와 y좌표를 저장하는 COORD 구조체의 예시입니다.

COORD STRUCT
	X WORD ?
    Y WORD ?
COORD ENDS

 

- 구조체 필드 정렬하기

가장 좋은 메모리 I/O 성능을 위해서는 구조체 멤버는 이의 데이터 타입에 맞는 주소에 정렬되어야합니다. 그렇지 않으면 이 멤버들을 접근하는데 CPU는 좀 더 많은 시간이 필요합니다. 예를들어 WORD는 2의 배수 주소에 정렬되어야하고, DWORD는 4의 배수 주소에 정렬되어야합니다. 정렬을 위해선 ALIGN 명령어를 사용합니다.

ALINGN datatype

예시로 ALIGN DWORD 명령어를 입력하면 그 즉시 메모리 주소를 4의배수에 정렬되게 메모리 주소를 맞춥니다. 아래는 Employee 구조체를 ALIGN을 사용하여 정렬한 예시입니다.

Employee STRUCT
    IdNum		BYTE "000000000"; 9
    LastName 	BYTE 30 DUP(0) 	; 30
    ALIGN		WORD			; 1 byte add로 40바이트에 맞춰줌
    Years		WORD 0			; 2
    ALIGN		DWORD			; 2 byte add로 4의 배수인 44바이트에 맞춰줌
    salaryHistory DWORD 0,0		; 8
Employee ENDS

 

- 구조체 선언하기

구조체를 선언할때는 <> 를 사용하여 필드의 값들을 정의할 수 있습니다. 코드부터 보시죠.

.data
point1 COORD <5,10>

point1이라는 이름을 가진 x값은 5, y값은 10을 가진 COORD 구조체를 선언한 코드입니다. 만약 필드에대한 값을 선언해주지 않는다면 정의할때의 값으로 진행되게 됩니다. 또한 초기설정자의 필드보다 더 짧을 경우, 남아있는 자리는 공백문자로 채워집니다. 구조체 배열을 선언할때는 DUP를 사용하여 선언할 수 있습니다. 아래는 예시입니다.

ALLpoints COORD 3 DUP(<0,0>)

- 구조체 멤버 참조하기

구조체 멤버에대해 참조하기위해선 .연산자를 사용합니다. 바로 코드부터 보시죠

.data
worker Employee<>

.code
mov dx, worker.Years
mov worker.SalaryHistory, 2000
mov [worker.SalaryHistory+4], 3000
mov edx, OFFSET worker.LastName

구조체 배열의 멤버에 접근하기위해서는 인덱스를 사용합니다.

.data
department Emplyee 5 DUP(<>)
.code
mov esi, 4
mov department[esi].Years, 5
Comments