Assembly : SPARC memory 영역

SeungHwanLee·2021년 7월 10일
0

힘겨운 재수강의 길,,복습,,

stack 영역

  • 메모리에서 save 명령어 통해 할당 (%sp의 범위) 즉 main의 범위
  • 하나의 기억공간이 4Byte단위 따라서 주소도 4의배수로 접근

data 영역

  • 정적변수(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명령어로
  • data영역 접근시에는 set명령어를 통해 lable로 접근
    set sum, %o0 !sum의 주소를 구함
    ld [%o0], %l0 !sum의 내용(값)을 읽음 %l0 <- memory[sum]
  • sum, i_m, s_m과 같은 Lable은 주소 32bits 그 자체를 의미
    따라서 접근시 mov가 아닌 set명령어를 통해 32bits 온전히 옮겨와야함


    Align 경계 정렬

  • 작은것에서 큰것으로 갈때 (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의 배수가 될 수 없으므로 오류가 발생한다.

  • 따라서 .align 2를 통해 공간 상대주소를 6으로 맞춰줌

sethi 명령어

  • 합성명령어
  • 상수or주소reg 32bits 쓸때, 22bits & 10bits나누어 계산하기 위함
  • op-code R, A, S (R: 0또는1 => 0일때 A가 reg, 1일때 A가 상수)

    [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에 넣음
  • %hi, %lo 를 사용해서 22/10bits 각각 나눔
    첫 sethi시 상위22bit만 복사 나머지 하위 10bit는 모두 0
    이후 %lo로 하위10bit와 %l0의 0들과 논리 or연산=>복사

응용으로

sethi %hi(i_m), %o0
ld [%o0+%lo(i_m)], %l0

!exact equals to
set i_m, %o0
ld [%o0], %l1
  • 언제 사용?? >> 파이프라이닝시 nop 지울 때

profile
Hongik CE

0개의 댓글