힘겨운 재수강의 길,,복습,,
정적변수(static)를 이 영역 메모리공간에 할당할 수 있음
lable을 통해 주소값 나타냄, lable자체가 32bits 주소값을 의미
.word로 초기값 설정 (ex. .word 13, 173, 212)
초기값이 없는 원소의 공간 확보를 위해 .skip 사용
.section ".data" !data영역 선언
nums: .word 17, 11, -161, -32, -8, 93 !word(4byte)크기의 공간에 값을 넣는다
.word 566, 25, 88, 67 ,-90
.skip 4 * 10 !원소공간 40byte확보
!data영역 접근 시 set명령어로
sum, i_m, s_m과 같은 Lable은 주소 32bits 그 자체를 의미
따라서 접근시 mov가 아닌 set명령어를 통해 32bits 온전히 옮겨와야함
작은것에서 큰것으로 갈때 (2Byte -> 4Byte) => 항상 정렬 유념
ex) short x(2byte)의 주소 %fp-6 이후 int y(4byte)올려면 시작주소 %fp-8
why? 4byte단위인 stack에서 변수의 제일 큰 자료형 4byte가 있으므로 주소값이 4의 배수가 되어야 접근 가능
아니면 접근을 못하셔
반면 큰것에서 작은것으로 갈땐 상관없음
int sum(4byte) %fp-4이후 char c(1byte)값 할당시 %fp-5
.align 은 data영역에서의 경계정렬을 위해 사용됨
예를들어
.section ".data"
0 .word 3
4 .byte 5
.align 2 !다음 데이터의 주소는 2의배수이므로
6 .half 5
8 .byte 6
.align 4 !다음 데이터의 주소는 4의배수이므로
12 .word 17
위와 같을때처럼 align없이 상대주소를 따지면 3번째 .half 5의 상대주소는 5가 되므로 메모리 주소는 짝수 즉, 2의 배수가 될 수 없으므로 오류가 발생한다.
[31-30 : op][29-25 : S레지스터]
[24-19 : OP확장][18-14 : R레지스터]
[13 : 0또는 1][2-5 : 상수] [4-0 : 상수 또는 레지스터]
set i_m %l0 !i_m is 32bits label
!equals to
sethi %hi(i_m), %l0 !첫 22bits 먼저 %l0에 넣음
or %l0, %lo(i_m), %l0 !이후 나머지 10bits %l0에 넣음
응용으로
sethi %hi(i_m), %o0
ld [%o0+%lo(i_m)], %l0
!exact equals to
set i_m, %o0
ld [%o0], %l1