8086 processor는 1MB까지의 memory를 취급한다.
16bit 두 개를 갖고, 20bit를 만들어내어 addressing을 하면 1MB가 된다.
segment address가 가상으로 5자리라고 생각하여
➡️ Code Segment와 Offset이 달라도 같은 물리 번지를 나타낼 수 있다.
CS와 offset의 조합이 몇 개가 있을 수 있는가?
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
Segment 선언
24319102.pdf 검색
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 별로 각각 해석하는 과정이 필요하다.
MOD 00 → R/M Table 1에서 골라 쓴다
MOD 01 → R/M Table 2에서 8bit를 쓴다
MOD 10 → R/M Table 2에세 16bit를 쓴다
MOD 11 → REG Field에서 골라 쓴다
* 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
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