Translation and Startup
Translation and Startup
Translation Example
• 0 ~ 100의 정수 제곱합을 계산하고 출력
label : 주소를 symbolic하게 나타낸 것
sd : 8바이트의 데이터를 어딘가에 저장해라. mips 명령어에 존재X. 실제 Assembler에 의해서 두개로 바뀐 걸 볼 수 있음.
macro : 반복되는 코드들을 간단하게 표현해서 사용
comment : 주석. mips에서는 #을 이용
Translation
컴파일러
– Inputs:
• Programming language code 및 명령어 집합
• 메모리 및 레지스터 구성
– Output: Assembly language code
– Compiler’s function
• Specific to ISA and machine organization
• 레지스터에 변수를 할당
• C를 어셈블리 언어로 변환
• 레지스터를 사용하는 subroutine (or procedure)을 컴파일할 때 레지스터 $s0~$s7을 저장 및 복원
– 최적화 예시
• 공통 하위 표현식 제거
– Example: x[i] = x[i] + 4, x[i]의 메모리 주소는 한 번만 생성
• Strength reduction: replace integer multiply by 2k with shift left
• Unnecessary instructions: 프로그램의 후반부에서 사용되지 않는 값은 메모리에 저장되지 않을 수 있다 (eliminate sw).
Translation and Linking
• Assembler
– 어셈블리 프로그램을 기계 명령으로 변환 : object program
• 레지스터 $at를 사용하여 pseudoinstructions을 core instructions 으로 변환.
– 부품으로부터 완전한 프로그램을 작성하기 위한 정보를 제공.
• Header: 객체 모듈의 내용 설명
• 텍스트 segment : translated 명령어
• 정적 데이터 segment : 프로그램 수명 동안 할당된 데이터
• Relocation info(재배치 정보) : 로드된 프로그램의 절대 위치에 따라 달라지는 콘텐츠
• Symbol 테이블 : 글로벌 정의 및 외부 참조
• 디버깅 정보 : 소스 코드와 관련짓기 위한 정보
• Linker
– 실행 가능한 이미지를 생성.
• segments를 병합
• 라벨 해결(주소 결정)
• 패치 위치 의존 및 외부 참조
– 로더 재배치 시 수정 위치 종속성을 남길 수 있다
Symbol Table
• assembly 프로세스 중에 작성된 Symbol 테이블
– 기호: 프로그램 이름 및 레이블
• 라벨: 명령 또는 데이터를 저장하는 특정 메모리 워드를 식별.
– 다음 첫 번째 단어의 기호 주소
– 객체 코드에서 기호의 최종 값(주소)이 결정되지 않음.
– 내부 기호(문 라벨): 상대 주소를 지정.
– 외부 기호(서브루틴 이름, 라이브러리 프로시저라고 함): 확인되지 않음
Static Linking
• Example C Program
Relocating Code and Data
Loading a Program
secondary storage의 이미지 파일에서 메모리로 Load
1. 헤더를 읽고 세그먼트 크기를 결정합니다.
2. virtual address space(가상 주소 공간)을 만듭니다.
3. 텍스트와 초기화된 데이터를 메모리에 복사합니다.
• 또는 페이지 테이블 엔트리를 설정하여 § 가상 메모리에서 장애가 발생할 수 있도록 합니다. Virtual memory
4. 스택에 인수(arguments)를 설정합니다.
5. 레지스터 초기화 ($sp, $fp, $gp 포함)
6. startup routine으로 이동합니다.
• 인수를 $a0, …에 복사하고 메인 호출
• 메인이 돌아오면 syscall을 종료합니다.
From Program to Process (Loading)
Dynamic Linking
• Only link/load library procedure when it is called
– 재배치 가능한 절차 코드 필요
– 참조되는 모든 라이브러리의 정적 링크에 의한 이미지 팽창을 방지합니다.
– 새 라이브러리 버전을 자동으로 선택
MIPS Assembly Programming
MIPS Assembly Language
• 언어 구성 및 구문
– 순서 : 하드웨어에 실장된 MIPS 순서
– 의사 명령 : 어셈블러에 의해 제공되지만 하드웨어에 구현되지 않은 명령 -> 명령으로 변환됨
– 지시 : 프로그램을 번역하는 방법, 마침표로 시작하는 방법
– 주석 : 샤프 기호(#)로 시작합니다.
– 식별자: 영숫자, 언더바(_) 및 닷(.)의 시퀀스.
• 숫자로 시작하면 안됨.
• 명령 또는 의사 명령 연산 코드를 사용할 수 없습니다.
– Label : 행의 선두에 콜론 symbolic 심볼주소가 이어집니다.
– 번호: 기본 10
• 16진수의 경우 0x를 사용합니다.256과 0x100은 같은 값을 나타냅니다.
– 문자열: 큰따옴표(")로 묶음
Assembly Directives
• 프로그램을 번역하지만 기계 명령어를 작성하지 않는 방법
– 마침표로 시작하는 Names
Composing Simple Assembler Directives
• assembler directive를 작성하여 다음 목표를 각각 달성합니다.
– a. 오류 메시지 "Warning: The printer is out of paper!" 를 메모리에 넣기
– b. 값이 4인 "size"라는 상수를 설정합니다.
– c. "width"라는 정수 변수를 설정하고 4로 초기화합니다.
– d. "mill"이라는 상수를 1,000,000(100만)의 값으로 설정합니다.
– e. 길이 250의 정수 벡터 “vect” 를 위한 공간을 확보합니다.
• Solution:
– a. noppr: .asciiz “Warning: The printer is out of paper!”
– b. size: .byte 4 # small constant fits in one byte
– c. width: .word 4 # byte could be enough, but ...
– d. mill: .word 1000000 # constant too large for byte
– e. vect: .space 1000 # 250 words = 1000 bytes
Pseudoinstructions
• Instructions provided by an assembler but not implemented in hardware
– Converted in real instructions by assembler: $at is used
• not $s0 # complement ($s0)
– nor $s0,$s0,$zero
• move $t0, $t1
– add $t0, $zero, $t1
• blt $t0, $t1, L (less than)
– slt $at, $t0, $t1
– bne $at, $zero, L
• abs $t0,$s0
– add $t0,$s0,$zero
– slt $at,$t0,$zero
– beq $at,$zero,+4
– sub $t0,$zero,$s0
Macro
• 자주 사용되는 일련의 명령에 이름을 붙이는 메커니즘
• 매크로는 사용자 정의(user-defined)이고, procedures (have arguments)와 유사합니다
Registers and Memory Layout
Registers Usage
Memory Layout
QtSpim
QtSpim Simulator for MIPS programs
QtSpim User Interface
QtSpim Simulation
IO and control functions of syscall in QtSpim
Assembly Program Examples
Assembly program Example
• C code:
– 처음에, 변수는 메모리에 있다.
– 저장된 레지스터에 로드하고 결과를 계산하여 메모리에 저장
– 그다음 콘솔에 출력.
• Compiled MIPS code:
Assembly program Example
• Shift and Logic Operation
– At first, $s0 = 0x000055AA, $s1 = 0x0000AA55, $s2 = 0xAA550000
– operations의 결과는?
• Compiled MIPS code:
– Results
• $to: 0x000AA550
• $t1: 0x0AA55000
• $t2: 0xFAA55000
• $t3: 0x00000000
• $t4: 0x0000FFFF
• $t5: 0x0000FFFF
• $t6: 0xFFFF0000
Concluding Remarks
• 컴파일러 : HLL -> 어셈블리 프로그램
• Assembler : Assembly program » 기계 명령
– 오브젝트 파일: 헤더, 텍스트, 데이터, 재배치 정보, 기호 테이블, 디버그 정보.
• Linker : 실행 가능한 이미지 생성
• 지침: 프로그램 번역 방법
• 의사 명령: 하드웨어에 구현되지 않고 프로그래밍이 용이함
• 매크로: 자주 사용하는 코드 바꾸기
• MIPS 어셈블리 프로그램용 QtSpim 시뮬레이터
– 텍스트, 데이터 View
– 레지스터
– 메시지 및 콘솔