학교 수업/컴퓨터아키텍쳐

Y86 명령어 연습

stw0218 2026. 4. 12.

기본 문법

명령어 목록

어셈블리어 mrmov는 memory -> register 이런 느낌의 문법... (AT&T 문법)

ollydbg나 x64dbg에서 mov eax, ecx 는 eax에 ecx를 넣는 것과 의미가 반대이다. (인텔 문법)

함수코드

 

ia32의 jmp dest 주소가 pc-relative 주소인것과 달리, y86에서는 direct 주소이다. 예) 0x00400010

특이한 점은 add, sub로 모든 사칙연산을 수행하고, 논리연산을 and, xor로 전부 처리한다... nand나 nor이 있으면 모든 논리를 만들 수 있으므로 and, xor이면 가능할 것 같긴 하다.

곱하기는 더하기 여러번 한다 치고, 나누기는 어떤 식으로 되는거지..?

레지스터
상태코드

 

과제 1.

 

1. 아래의 C-프로그램 statement들을 Y86 어셈블리 코드로 변환하라 :

if (max >= 10) max--; // max는 register 라고 가정(메모리 접근 불필요)
else max++;

 

 

답:

max가 eax라고 가정

if문은 조건을 역으로 생각하는게 if-else 순으로 나열돼서 보기 편하다는 것 같다

    # max 변수를 eax로 가정
    irmovl $10, %ebx    # ebx = 10 (상수 10 저장)
    irmovl $1, %ecx     # ecx = 1 (상수 1 저장)

    # if (max >= 10)
    rrmovl %eax, %edx   # edx = eax (비교용 임시 레지스터)
    subl %ebx, %edx     # edx -= 10
    jl ElseBlock        # eax < 10이면 ElseBlock으로 점프

    # then
    subl %ecx, %eax     # eax--
    jmp End

ElseBlock:
    addl %ecx, %eax     # eax++
End:

 


 

2. 아래의 C-프로그램 statement들을 Y86 어셈블리 코드로 변환하라 :

int sum1(int x) {
  count = 10;
  do {
    x += count;
    count--;
  } while (count);

  return (x);
}

 

 

답:

일단 함수니까 push %ebp, rrmov %esp, %ebp 로 시작하고 끝날때는 반대로... 함수 리턴값은 eax

    # int sum1(int x)
    pushl %ebp
    rrmovl %esp, %ebp
    mrmovl 8(%ebp), %eax     # x를 %eax에 저장

    # 변수 및 상수 초기화
    irmovl $10, %ebx         # count = 10
    irmovl $1, %ecx          # ecx = 1 (상수 1 저장)

LoopStart:
    addl %ebx, %eax          # x += count
    subl %ecx, %ebx          # count--
    jg LoopStart             # count > 0이면 LoopStart로 점프

    # return
    rrmovl %ebp, %esp
    popl %ebp
    ret

 

 

 


 

3. 아래의 C-프로그램 statement들을 Y86 어셈블리 코드로 변환하라 :

int sum2(int x) {
  count = 10;
  while (count) {
    x += count;
    count--;
  }

  return (x);
}

 

답:

    # int sum2(int x)
    pushl %ebp
    rrmovl %esp, %ebp
    mrmovl 8(%ebp), %eax     # x를 %eax에 저장

    # 변수 및 상수 초기화
    irmovl $10, %ebx         # count = 10
    irmovl $1, %ecx          # ecx = 1 (상수 1 저장)

    # while (count > 0)
    andl %ebx, %ebx          # count가 0인지 확인
    jle EndLoop              # count <= 0이면 EndLoop로 점프

LoopStart:
    addl %ebx, %eax          # x += count
    subl %ecx, %ebx          # count--
    jg LoopStart             # count > 0이면 LoopStart로 점프

EndLoop:
    # return
    rrmovl %ebp, %esp
    popl %ebp
    ret

변수는 레지스터에 저장해서 연산한다고 가정했다.

ppt에 eax, ebx 로 표현되어 있어서 4바이트로 가정했는데 특정 슬라이드에서는 rax, rbx로 되어있는 곳도 있어서 과제 작성할 때 주의가 필요할 것 같다.

'학교 수업 > 컴퓨터아키텍쳐' 카테고리의 다른 글

컴아 중간고사 정리  (0) 2026.04.27
컴퓨터하드웨어 기말정리  (0) 2025.06.05

댓글