9086/8086_documentation.md

59 lines
4.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## ISA
Instructions vary from 1 to 6 bytes.
### Instructions format
| 6bit | 1bit | 1bit | 2bit | 3bit | 3bit |
| ---------------- | --------- | ---- | ---- | ---- | ---- |
| Opcode | D bit | W bit | MOD | REG | R/M |
* **D**-bit : the register specified in the Register ID field is a source register (D = 0) or destination register (D =1).
* **W**-bit : specifies whether the instruction is a byte instruction (W = 0) or a word instruction (W = 1).
On some instructions:
* **S**-bit : An 8-bit 2's complement number. It can be extended to a 16-bit 2s complement number depending on the W-bit by making all of the bits in the higher-order byte equal the most significant bit in the low order byte. This is known as sign extension.
| S | W | Operation |
| --- | --- | -------------- |
| 0 | 0 | 8bit operation |
| 0 | 1 | 16bit operation with 16bit immediate operand |
| 1 | 0 | invalid? |
| 1 | 1 | 16bit operation with a sign extended 8bit immediate operand
* **V**-bit : V-bit decides the number of shifts for rotate and shift instructions. If V = 0, then count = 1; if V = 1, the count is in CL register. For example, if V = 1 and CL = 2 then shift or rotate instruction shifts or rotates 2-bits
* **Z**-bit : Used as a compare bit with the zero flag in conditional repeat and loop instructions. ex branch if zero is set or clear.
| Register ID / REG | Register Name |
|:-------------------:|:-------------:|
| 0 0 0 | AL AX |
| 0 0 1 | CL CX |
| 0 1 0 | DL DX |
| 0 1 1 | BL BX |
| 1 0 0 | AH SP |
| 1 0 1 | CH BP |
| 1 1 0 | DH SI |
| 1 1 1 | BH DI |
The second byte of the instruction usually identifies the instruction's operands. The **MOD** (mode) field weather on of the operands is in memory or if both are registers. In some instructions like the immediate-to-memory type the **REG** field is used as an extension of the opcode. The encoding of **R/M** depends on how MOD is set. if MOD=11 (register-register mode) then **R/M** specifies the second Register using the Register ID. otherwise it specifies how the effective address in memory is calculated
|R/M | Memory Mode with no displacement [ 0 0 ] | Memory mode with 8 bit displacement [ 0 1 ] | Memory Mode with 16 bit displacement [ 1 0 ] | Register Mode [ 1 1 ] W = 0| Register Mode [ 1 1 ] W = 1 |
|---- | ---------------------------------------- | ------------------------------------------- | -------------------------------------------- | --------------------------- | --------------------------- |
|000 | [BX] + [SI] | [BX] + [SI] + d8 | [BX] + [SI] + d16 | AL | AX |
|001 | [BX] + [DI] | [BX] + [DI] + d8 | [BX] + [DI] + d16 | CL | CX |
|010 | [BP] + [SI] | [BP] + [SI] + d8 | [BP] + [SI] + d16 | DL | DX |
|011 | [BP] + [DI] | [BP] + [DI] + d8 | [BP] + [DI] + d16 | BL | BX |
|100 | [SI] | [SI] + d8 | [SI] + d16 | AH | SP |
|101 | [DI] | [DI] + d8 | [DI] + d16 | CH | BP |
|110 | d16 (direct) | [BP] + d8 | [BP] + d16 | DH | SI |
|111 | [BX] | [BX] + d8 | [BX] + d16 | BH | DI |
Example instructions:
| Bytecode | AT&T Syntax | meaning |
| ---------- | --------------- | ---------------------------------------------------------- |
|81 c0 aa 55 | add $0x55aa,%ax | write 0x55aa to register ax |
|03 06 aa 55 | add 0x55aa,%ax | write the contents of memory locaton 0x55aa to register ax |
|fe c0 | inc %al | increment register al |
|ff c0 | inc %ax | increment register ax |
|40 | inc %ax | increment register ax |