외로운 Nova의 작업실
Assembly 언어 공부 - 34(구조체) 본문
안녕하세요, 이번 시간에는 구조체에대해서 정리 및 공부해볼까합니다.
- 구조체
어셈블리에서 구조체는 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
'Programming > Assembly' 카테고리의 다른 글
Assembly 언어 공부 - 36(어셈블리 언어 공부 종료) (0) | 2022.11.25 |
---|---|
Assembly 언어 공부 - 35(메크로) (0) | 2022.10.29 |
Assembly 언어 공부 - 33(전치 암호화 구현) (0) | 2022.10.29 |
Assembly 언어 공부 - 31(스트링 프리미티브 명령어) (0) | 2022.10.10 |
Assembly 언어 공부 - 30(INVOKE,ADDR,PROC,PROTO 디렉티브) (0) | 2022.10.03 |