Collapse OS Documentation Browser

doc/asm/8086.txt

../ 6502.txt 6809.txt 8086.txt avr.txt intro.txt z80.txt

8086 assembler specificities

Load with "8086A".

Argtypes

Mnemonics are followed by argument types. For example, MOVri,
moves 8-bit immediate to 8-bit register.

'r' = 8-bit register           'x' = 16-bit register
'i' = 8-bit immediate          'I' = 16-bit immediate
's' = SREG register

Mnemonics that only have one signature (for example INT,) don't
have operands letters.

Mod/rm mnemonics

Mnemonics with "[]" argtypes are "mod/rm" mnemonics are are
designed to be fed with a "modrm argument". For example, if we
want to INC the byte in memory where DI points to, we would
write "[DI] [b] INC[]," If we want to increase the word at DI+1,
it would be "[DI] 1 [w]+ INC[],".

There are 2 kinds of modrm mnemonics: single and dual. Single
are for ops like "INC[]" or ops pairing a modrm with an
immediate such as "CMP[]i". Dual are for ops like "ADD[]" which
pairs a register with a memory address.

Single:

[m]    Direct memory address (byte)
[M]    Direct memory address (word)
[r]    8b register
[x]    16b register
[b]    Indirect byte
[w]    Indirect word
[b]+   Indirect byte + displacement (8b)
[w]+   Indirect word + displacement (8b)

Dual:

r[]    Indirect byte to 8b register
x[]    Indirect word to 16b register
[]r    8-bit register to indirect byte
[]x    16-bit register to indirect word
r[]+   Indirect byte + displacement (8b) to 8b register
x[]+   Indirect word + displacement (8b) to 16b register
[]+r   8b register to indirect byte + displacement (8b)
[]+w   16b register to indirect word + displacement (8b)

Remember that BP is only valid with displacement mod/rm.

NOTE: the []i form also works with [x]. It auto-detects whether
"i" is 16b or 8b and writes the proper form.

Flow examples

IFZ, NOP, THEN, ( no ELSE, yet )
BEGIN, NOP, BR JRi, ( unconditional )
BEGIN, NOP, Z? BR ?JRi, ( conditional )
LSET L1 NOP, L1 JMPi, ( backward near jump )
FJR JRi, TO L1 NOP, L1 FMARK ( forward short jump )

BR, LSET, FMARK come from the HAL convenience layer, see
doc/hal.txt

Instructions list

r -> AL BL CL DL AH BH CH DX
x -> AX BX CX DX SP BP SI DI
s -> ES CS SS DS
[] -> mod/rm
i -> immediate

RET   CLI   STI   HLT   CLD   STD   NOP   CBW   REPZ  REPNZ
LODSB LODSW CMPSB SMPSW MOVSB MOVSW SCASB SCASW STOSB STOSW

CALLi
JMPr is for "register jump" and takes a register as an agument
JMPf is for "far jump" and has signature "segment offset --"

INC[r,x,[]]
DEC[r,x,[]]
POP[x,[]]
PUSH[x,[],s]
MUL[r,x]
DIV[r,x]
XOR[rr,xx]
OR[rr,xx]
AND[rr,xx,ALi,AXI]
ADD[rr,xx,[]i,ALi,AXI]
ADC[rr,xx,[]i,ALi,AXI]
SUB[rr,xx,[]i,ALi,AXI]
INT

CMP[rr,xx,[],[]i]
MOV[rr,xx,[],ri,xI,sx,rm,xm mr,mx,ALm,AXm,mAL,mAX]

("1" means "shift by 1", "CL" means "shift by CL")
ROL[r1,x1,rCL,xCL]
ROR[r1,x1,rCL,xCL]
SHL[r1,x1,rCL,xCL]
SHR[r1,x1,rCL,xCL]


Collapse OS and its documentation are created by Virgil Dupras and licensed under the GNU GPL v3.

This documentation browser by James Stanley. Please report bugs on github or to james@incoherency.co.uk.

This page generated at 2024-12-26 21:05:04 from documentation in CollapseOS snapshot 20230427.