대학교 학부 과정 중 컴퓨터 구조 수업 시간에 사용되는 Y86-64( http://csapp.cs.cmu.edu/ )의 개선버전. 오리지널 버전의 Y86-64에 일부 명령어를 새롭게 추가한 후 파이썬으로 재구성하여 제작됨.
- flask
- 파이썬을 이용하여 simulator.py를 실행한 후 웹 브라우저로 접속(기본 값 기준 localhost:5500으로 접속)
- 초기 화면에서 NEW 탭을 선택할 경우 새로운 세션을 생성할 수 있음. RESTART 탭을 선택할 경우 UUID 입력으로 이전에 실행한 세션을 다시 시작할 수 있음
- 텍스트 필드에 목적 파일의 경로를 입력한 후 LOAD를 클릭해 목적 파일을 적재
- RESTART, STEP, RUN을 이용하여 프로그램을 다시 시작하거나 한 단계씩 또는 끝까지 실행할 수 있음
- SHUTDOWN으로 현재 세션을 종료 할 수 있음
- 시뮬레이터 실행 후 Object Code 영역을 클릭
- List of Examples에서 예제 파일을 선택하거나 우측 텍스트 영역에 어셈블리 코드 작성
- 우측 하단의 ASSEMBLE 버튼을 클릭하여 어셈블 진행
- 어셈블이 정상적으로 완료되면 시뮬레이터 화면으로 넘어가고, 오류가 있을 경우 alert이 나오며 오류 코드를 표시함
번호(hex) | 명령어 | 길이 | 설명 |
---|---|---|---|
00 | halt | 1B | CPU 동작 정지 |
10 | nop | 1B | No operation |
20 | rrmovq rA,rB | 2B | register -> register |
21 | cmovle rA,rB | 2B | 비교 값이 작거나 같을 때 레지스터의 값을 레지스터로 복사 |
22 | cmovl rA,rB | 2B | 비교 값이 작을 때 레지스터의 값을 복사 |
23 | cmove rA,rB | 2B | 비교 값이 같을 때 레지스터의 값을 복사 |
24 | cmovne rA,rB | 2B | 비교 값이 같지 않을 때 레지스터의 값을 복사 |
26 | cmovg rA,rB | 2B | 비교 값이 클 때 레지스터의 값을 복사 |
30 | irmovq const,rB | 10B | 레지스터를 정수로 초기화 |
40 | rmmovq rA,D(rB) | 10B | 레지스터의 값을 메모리로 복사 |
50 | mrmovq D(rB),rA | 10B | 메모리의 값을 레지스터로 복사 |
60 | addq rA,rB | 2B | rB = rB + rA |
61 | subq rA,rB | 2B | rB = rB - rA |
62 | andq rA,rB | 2B | rB = rB & rA |
63 | xorq rA,rB | 2B | rB = rB ^ rA |
64 | or rA,rB | 2B | rB = rB |
65 | shl rA,rB | 2B | rB = rB << rA |
66 | shr rA,rB | 2B | rB = rB >> rA (logical) |
67 | sar rA,rB | 2B | rA = rB >> rA (arithmetics) |
68 | cmp rA,rB | 2B | null = rB - rA |
69 | test rA,rB | 2B | null = rB & rA |
6A | not rA,rB | 2B | rB = ~rA |
70 | jmp const | 9B | const로 점프 |
71 | jle const | 9B | 비교 값이 작거나 같을 때 점프 |
72 | jl const | 9B | 비교 값이 작을 때 점프 |
73 | je const | 9B | 비교 값이 같을 때 점프 |
74 | jne const | 9B | 비교 값이 같지 않을 때 점프 |
75 | jge const | 9B | 비교 값이 같거나 클 때 점프 |
80 | call const | 9B | const 위치의 함수 호출 |
90 | ret | 1B | 함수를 반환 |
A0 | pushq rA | 2B | rA의 값을 스택에 저장 |
B0 | popq rA | 2B | 스택의 값을 rA에 저장 |
01 | .elemrkq const | 8B | 프로그램에 포함된 인접하고 연속된 8바이트 정수 원소의 개수. 데이터 영역은 7바이트 |
02 | .dummy n | nB | 더미 공간을 만들기 위한 매크로. 2 이상의 숫자만 사용 가능 |
03 | .align 8 | n <= 8B | 8바이트 정렬을 위한 매크로. 값으로 8만 사용 가능 |
- | .quad const | 8B | 64비트 정수를 프로그램 자체에 기록하는 키워드 |
번호(hex) | 명령어 | 길이 | 설명 |
---|---|---|---|
64 | or rA,rB | 2B | rB = rB |
65 | shl rA,rB | 2B | rB = rB << rA |
66 | shr rA,rB | 2B | rB = rB >> rA (logical) |
67 | sar rA,rB | 2B | rA = rB >> rA (arithmetics) |
68 | cmp rA,rB | 2B | null = rB - rA |
69 | test rA,rB | 2B | null = rB & rA |
6A | not rA,rB | 2B | rB = ~rA |
실제 동작 시에는 역할이 없으나 역 어셈블리 시 사용되는 명령어.
번호(hex) 명령어 길이 설명 ------------------------------------------------------------------- 01 .elemrkq const 8B 프로그램에 포함된 인접하고 연속된 8바이트 정수 원소의 개수. 데이터 영역은 7바이트 02 .dummy n nB 더미 공간을 만들기 위한 매크로. 2 이상의 숫자만 사용 가능 03 .align 8 n <= 8B 8바이트 정렬을 위한 매크로. 값으로 8만 사용 가능
.dummy 지시어로 생성한 영역에서 처음과 끝 8바이트 영역을 초기화하지 않고 바로 읽을 시 0이 아닌 값이 인출 될 수 있음. 만일 초기화 하지 않고 바로 접근할 수 있는 경우 .dummy가 아닌 .quad 0을 연속으로 작성하는 것으로 생성하는 것을 권장함.
.elemrkq 지시어는 .quad 키워드로 생성한 연속된 정수 원소의 개수를 프로그램 내부에 기록하는 키워드. 따로 작성하지 않더라도 프로그램 동작에는 큰 문제는 없으나 역 어셈블링이 불가능함. 작성은 .quad로 작성 된 연속 된 정수 원소의 첫 번째 위치에 그 개수를 기록하면 된다. 단, 레이블을 통해 접근할 경우 .elemrkq와 첫 번째 .quad 사이에 레이블이 있어야 함.
예시)
올바른 예시
.elemrkq 2 .quad 0x1 .quad 0x2
.elemrkq 2 variables: .quad 0x1 .quad 0x2
올바르지 않은 예시
.elemrkq 4 .quad 0x1 .quad 0x2 .main: # 각종 프로그램 처리 .align 8 .quad 0x3 .quad 0x4
variables: .elemrkq 2 .quad 0x1 .quad 0x2
파이프라인 모델의 경우 memiotest.yps 예제를 포함한 일부 코드가 정상적으로 동작하지 않는 문제점이 존재함
다음과 같은 문법은 어셈블이 되지 않고 오류 메시지를 표출함
mrmovq label,%rdx # -> mrmovq label(%null),%rdx로 수정하여 작성할 것 rmmovq %rdx,label # -> mrmovq %rdx,label(%null)로 수정하여 작성할 것