[컴퓨터구조]Language of the Machine

최원석·2024년 10월 22일

Control Transfer Operations

Changing Control

  • Conditional instructions are known as branches
  • Unconditional changes in the control flow are called jumps
  • The target of the branch/jump is a label

Conditional Operations

조건에 따른 명령어

조건이 참이라면 L1으로 이동한다.

bep rs1, rs2 L1 // if(rs1==rs2) 참이면 L1으로 이동

명령어

  • beq - a==b
  • bne - a≠b
  • blt - a<b
  • bge - a≥b
  • bltu - a<b
  • bgeu- a≥b
while(A[i] == k)
	i+=1;
// i in x22, k in x24
// address of A[] in x25

Loop: slli x10, x22, 3
			add x10, x10, x25
			ld x9, 0(x10)
			bne x9, x24, Exit
			addi x22, x22, 1
			beq x0, x0, LOOP
Exit:...

❗️slli x10, x22, 3 은 처음 인덱스를 구하기 위해 수행하는 명령어이다.❗️

Target Addressing

Target addresses are always aligned to 2 bytes

  • 타켓 주소는 항상 바이트 단위로 정렬되어있다. 이는 주소가 항상 짝수임을 의미한다.
  • 일부 명령어는 16비트로 인코딩될 수 있다.

Unsigned comparison : bltu, bgeu

부호 없는 정수 비교

  • 대부분의 분기(branch) 타겟은 가까운 위치에 있으며, 앞쪽 또는 뒤쪽으로 이동할 수 있다.
  • 타겟 주소 계산은 = PC + SignExt(12-bit immediate value << 1) SignExtension후 shift해야한다. ( 아니 그러면 (SignExt (12-bit immediate value)) << 1 이렇게 써야하는거 아니냐고…. 쨋든)

Jump addressing:

  • Jump and Link (JAL) 명령어는 20비트의 즉시값을 사용하여 더 큰 범위의 주소로 점프할 수 있다.
  • 타겟 주소는 PC + SignExt(20-bit immediate value << 1)로 계산됩니다.

Signed vs. Unsigned Comparison

Unsigned의 경우 부호비트를 생각하지 않고 모두 “수”를 나타낸 비트라고 생각하고 수행한다.

  • Signed comparison: blt, bge
  • Unsigned comparison: bltu, bgeu

RISC-V: Procedure Call

Procedure Calling in RISC-V

  • 레지스터 x10에서 x17(또는 a0에서 a7)에 매개 변수를 배치
  • 제어를 절차로 전송하고, 반환 주소를 ra(x1)에 저장
  • 절차를 위한 저장소를 획득
  • 절차의 작업을 수행
  • 호출자를 위해 레지스터 a0(및 a1)에 결과를 배치
  • 호출의 다음 명령으로 돌아갑니다(ra의 주소)

Stack

스택의 원리로 관리되는 메모리

  • stack pointer : 레지스터 값 하나가 스택에 저장되거나 스택에서 복구될 때마다 한 워드씩 조정
  • 스택의 아래쪽이 주소 값이 작다.
  • 아래쪽으로 커진다.

Procedure Call Instructions

jal : jump-and-link

  • 지정된 주소로 점프하면서 동시에 현재 명령어의 주소를 $ra 레지스터에 저장
  • ra 돌아올 pc 값을 넣어둔다.
jal ra, func

jalr : jump-and-link-register

  • Callee가 Caller에게 권한을 반납할 때 사용하는 명령어.
  • offset + rs1으로 jump
  • rd는 x0으로 값을 넣어도 값이 변하지 않는다.
jalr rd, offset(rs1)

Stack Frame

프로시저의 저장된 레지스터와 지역 변수의 위치를 표시하는 값

  • contents
    • 반환 정보
    • 매개변수
    • 지역 변수, 임시공간
  • Management
    • 세팅 코드 (Set-up Code) 함수가 호출될 때 스택 프레임을 위한 공간을 할당하는 코드입니다. 이 과정에서 반환 주소와 이전 프레임 포인터를 저장합니다.
    • 완료 코드 (Finish Code) 함수가 완료된 후 스택 프레임의 할당된 공간을 해제하는 코드입니다. 이는 스택에서 데이터를 팝(pop)하여 관리합니다.
    • 스택 포인터 (Stack Pointer, sp) 현재 스택의 최상단을 가리키는 포인터입니다. 함수가 실행되면서 스택 포인터가 이동하여 스택의 상태를 관리합니다.
    • 프레임 포인터 (Frame Pointer, fp, 선택 사항) 현재 스택 프레임의 시작 주소를 가리키는 포인터입니다. 선택적으로 사용되며, 이전 프레임과의 연결을 쉽게 할 수 있게 해줍니다.

Register Saving Conventions

  • “Caller saved“ registers
    • Caller saves temporary values in its frame before the call
    • Contents of these registers can be modified as a result of procedure call
  • “Callee saved“ registers
    • Callee saves temporary values in its frame before using
    • Callee restores them before returning to caller
    • The contents of these registers are preserved across a procedure call
    • RISC-V: s0 – s11 (x8 - x9, x18 - x27)

0개의 댓글