CS/컴퓨터 구조

[컴퓨터 구조](10)[어셈블리어 1]

황올뱀 2025. 1. 20. 16:12

어셈블리의 데이터 형식

  • 1, 2, 4, 8 바이트의 정수형 데이터
    • 데이터 값, 주소
  • 4, 8, 10 바이트의 부동소수점 데이터
  • 배열이나 구조체 같은 형태 없이 메모리 상에 연속으로 할당됨

어셈블리의 연산

  • 레지스터 or 메모리 데이터에 대한 산술 기능 수행
  • 메모리와 레지스터 사이 데이터 전송
  • 전송 통제: 프로시저로 점프, 조건부 분기

x86-64의 정수 레지스터 (64비트 길이)

  • %rax
  • %rbx
  • %rcx
  • %rdx
  • %rdi
  • %rsp: 특수 용도 레지스터라 보통 계산에 사용 안함
  • %rbp
  • %r8, %r9 ... %15
  • 8바이트이지만, 하위 4바이트, 2바이트에 참조 가능 (예전 프로그램과 호환성)

어셈블리의 데이터 이동

  • 피연산자 형식 (AT&T문법)
    • 상수 정수 데이터: 숫자 앞에 $를 붙임
    • 예시) $0x3A65, $-533
    • 레지스터: 16개의 정수 레지스터 중 하나 (1, 2, 4 바이트로 인코딩)
    • 예시) %rax, %rcx (레지스터의 내용)
    • 메모리: 레지스터에 주어진 주소의 메모리의 8개의 연속 바이트. 괄호로 감싸기
    • 예시) (%rax) (주소가 레지스터값인 변수의 값)
  • MOV 연산: MOV A B: A를 B로 옮겨라 (복사해서 넣어라): A에 있는 값은 그대로 남아있고 B에 복사됨.
    • AT&T문법에서는 mov뒤에 명시적으로 참조할 데이터 크기 적음: movb(move byte), movw(move word), movq(move quad word(64비트)) 등
    • x86-64에서는 메모리에서 메모리로 바로 옮길 수 없게 설정해놓음.
    • 예시) movq 0x6444 0x3232 (x)
    • movq 0x6444 %rax -> movq %rax 0x3232 (o)
    • 예시) movq $0x40 %rax: rax 레지스터의 값을 0x40으로 변경하기
    • 예시) movq $0x40 (%rax): rax가 가리키는 메모리 주소에 있는 값을 0x40으로 바꿔라
    • 약간 x = 0x40 과 포인터 역참조 *p = 0x40같은 느낌이다
    • Intel 문법에서는 mov B A가 A를 B로 옮겨라 이고, AT&T 문법에서는 movq A B가 A를 B로 옮겨라이다. (어순 다름)
728x90
반응형