Assembly (2)

Hyungseop Lee·2023년 5월 21일
0
post-custom-banner

8086의 주소 지정

  • 8086 processor는 1MB까지의 memory를 취급한다.

  • 16bit 두 개를 갖고, 20bit를 만들어내어 addressing을 하면 1MB가 된다.

  • segment address가 가상으로 5자리라고 생각하여

    • 1000 + 1234 = 10000 + 1234 = 11234
    • (segment address) + (offset address) = effective address(유효주소)

8086의 주소 지정 (2)

  • 만약, CS가 1000, offset이 1000일 때, 그 위치를 나타내는 주소는?
    → 11000
  • 만약, CS가 1100, offset이 0000일 때, 그 위치를 나타내는 주손소는 ?
    → 11000

➡️ Code Segment와 Offset이 달라도 같은 물리 번지를 나타낼 수 있다.

CS와 offset의 조합이 몇 개가 있을 수 있는가?


명령의 구성(1)

  • label : 명령행이 존재하는 번지를 지정. (생략 가능)
  • OP code : Operation Code. 연산자, 명령의 종류
  • Operand : 피연산자. (상황에 따라 0~2개)
    ➡️ 방향은 뒤에서 앞으로

의사 명령어(Pseudo Code)

  • Segment 이름과 Segment register의 대응 관계를 선언

    • ASSUME CS : CODE, DS : DATA
      → 이 한줄은 compiler한테 알려주는 것.
      CODE와 DATA가 있으니 그렇게 알고 프로그램을 만들어 줘.

    • 내가 실제 program을 만들 때는 CS, DS를 직접 써서 이용하는 과정이 필요하다.

    • ENDS : Segment가 끝났다

    • END : Program 전체가 끝났다

  • 예제

CODE SEGMENT
    ASSUME CS:CODE

    MOV AH, 12H
    MOV AL, 34H
    ADD AH, AL

    MOV AH, 4CH
    INT 21H

CODE ENDS
    END
  • CODE SEGMENT만 있다. (STACK, DATA, EXTRA SEGMENT는 없다)
  • CS는 MOV AH, 12H부터 자동으로 잡힌다.
    DS는 안잡힌다. (다행히 이 program에는 DS가 없다.)

Program 초기 작성

  • Segment 선언
    • Code Segment, Data Segment, Stack Segment 중 필요한 Segment를 선언
    • Code Segment는 반드시 필요
    • Data Segment는 Data가 필요할 때만 필요.

명령어 구성과 기계어 생성

  • 24319102.pdf 검색

    • imm : immediate, 숫자
    • mem : memory
    • segreg, segment register
    • MOV 연산을 금지시킨 경우 (Intel에서 다음의 format은 사용할 수 없게 막아놨다)

      MOV imm, imm : 어떤 숫자를 어떤 숫자로 복사하라
      MOV mem, mem : 어떤 memory를 어떤 memory로 복사하라

      (1) MOV reg, mem
      (2) MOV mem, reg

      위 두 과정을 거쳐야 memory를 memory로 복사할 수 있다.
      MOV seg, seg : segment register를 segment register로 복사할 수 있다.

  • 8086을 봤을 때

    • MOV reg to reg : 2 Clock

    • MOV immed to reg : 4 Clock

    • MOV acc to mem : 10 Clock
      → 똑같은 MOV 명령이더라도, 어떤 것을 MOV하는지에 따라 5, 6배의 속도 차이가 날 수 있다.

    • 곱셈 연산은 118 ~ 133 Clock 동안 수행된다.
      (MOV나 ADD보다 훨씬 더 많이 소요된다.)
      그래서 단순 Shift연산을 통해 곱셈을 대신할 수 있다.
      MUL 연산보다 훨씬 빠르게 수행된다. (2 Clock만 소요)

  • 명령어들은 fetch하고 decode한다고 했는데.
    예를 들어 MOV는 9가지의 format이 있었다.
    9가지 각각의 format 별로 각각 해석하는 과정이 필요하다.


Encoding of 8086 Instructions

MOD 00 → R/M Table 1에서 골라 쓴다
MOD 01 → R/M Table 2에서 8bit를 쓴다
MOD 10 → R/M Table 2에세 16bit를 쓴다
MOD 11 → REG Field에서 골라 쓴다

example 1


* Reg, Reg의 Opcode : 100010

  • d (direction) = 0 : reg → r/m ⇒ reg = BL r/m = AL
    d (direction) = 1 : r/m → reg ⇒ r/m = BL, reg = AL
    d (direction) = 1 이니까
    r/m 자리에 BL(011), reg 자리에 AL(000)

  • 또한 register ← register니까 mod = 11

    따라서 encoding해보면?
    opcode d w mod reg r/m
    100010 1 0 11 000 011 = 8AC3

example 2

example 2

  • opcode : 100010 (MOV)

  • d : 0 (from REG to R/M)

  • REG : 011 (REG = BL)

  • R/M : 000 (R/M = AL)

  • mod : 11

    따라서 encoding해보면?
    opcode d w mod reg r/m
    100010 0 0 11 011 000 = 88D8

example 3

profile
model compression
post-custom-banner

0개의 댓글