⋅ 두 프로세서가 메모리 영역을 공유할 때
P1이 쓰기 전에 P2가 읽어버릴 수도 있으므로 순서 정하기. lock/unlock (1이면 사용불가, 0이면 사용가능)
⋅ 하드웨어 지원 필요
-원자적 read/write 메모리 연산 / 다른 접근X
-lw와 sw를 사용하는 경우는 원자적이지 않은 swap
⋅ 단일 명령 (완벽히 교환. 둘 사이에 다른 주소X)
swap $s0, 0($s1)
⋅ Load linked: rt, offset(rs)
-값만 가져오는 게 아니라 연결까지(ll은 항상 성공)
⋅ Store conditional: sc rt, offset(rs) #sw+상태저장
-store 성공 시 rt에 1을 반환, 실패 시 rt에 0 반환
-ll의 결과값이 바뀐 경우 store 실패

⋅ 비휘발성 저장장치의 프로그램을 실행할 수 있는 프로그램으로 변환하기 위한 4단계
1. C프로그램을 컴파일러가 어셈블리언어 프로그램으로
2. 어셈블러가 기계어 모듈(목적 파일)로
3. 링커가 그 모듈과 기계어로 된 라이브러리 링크
4. 로더가 기계어로 된 프로그램 실행
5. 메모리로 들어감
⋅ 어셈블러 명령어는 기계 명령어를 일대일로 나타냄.
⋅ 의사 명령어: 어셈블러 레벨에서만 사용됨. at이라는 임시 레지스터가 추가로 필요하므로 비용 발생,
$at는 레지스터 1번이 할당되어 있음
symbol table: 전역 정의 및 외부 참조 레이블 저장
relocation(재배치) 정보: 프로그램이 메모리에 적재될 때 절대 주소를 사용해야 하는 명령어, 데이터 word 표시
디스크의 이미지 파일에서 메모리로 로드
1. 세그먼트 크기 결정을 위해 헤더 읽기 / 영역 판단
2. 가상 주소 공간 생성 / 메모리 공간 확보
3. 텍스트 및 초기화된 데이터를 메모리에 복사
4. 스택에 인수 셋팅 (스택 통해서 인수 전달하므로)
5. 레지스터 초기화 ($sp, $fp, $gp, $sp 등)
6. Jump to 시작 루틴 / 메인함수 첫 줄 실행
-인수를 레지스터에 복사하고 main 호출, return시 exit 시스템 호출을 사용해 프로그램 종료
호출 시에만 링크/로드 라이브러리 프로시저
Lazy Linkage>swap 프로시저:

⋅ 배열:
⋅ 포인터: 배열로 짠 코드보다 빠름
⋅ 배열 버전은 shift가 루프 내부에 있어야 함.
⋅ 산술/논리 명령 결과에 대한 조건 코드 사용
⋅ 각 명령어는 조건부일 수 있다.
⋅ 64-bit로 전환하면서, ARM은 전면적 점검을 수행함.
⋅ ARM v8은 MIPS와 유사하다. (v7->v8 변경 사항)
⋅ 이전 버전과의 호환성을 통한 진화
⋅ 가변 길이 인코딩
⋅ 강력한 인스트럭션 사용-> 고성능 이라는 오해
⋅ 고성능을 위해 어셈블리 언어로 코드 작성하는 것이 좋을 것이라는 오해
⋅ 이전 버전과 호환성이 좋다는 게 명령어 세트가 변하지 않았을 것이라는 오류
⋅ 바이트 주소를 사용할 때, 인접 워드 간 주소 차이가 1이 아니라 4라는 것을 잊지 않기.
⋅ 프로시저 반환 후 프로시저 외부에서 자동 변수에 대한 포인터를 사용하지 말 것. (이미 없어진 자동 변수에 대한 포인터 사용하면 예기치 못한 일 발생 가능성)