145 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			Groff
		
	
	
	
	
	
			
		
		
	
	
			145 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			Groff
		
	
	
	
	
	
| .\" $Header$
 | |
| .TH I86_AS 1
 | |
| .ad
 | |
| .SH NAME
 | |
| i86_as \- assembler for Intel 8086
 | |
| .SH SYNOPSIS
 | |
| /usr/em/lib/i86_as [options] argument ...
 | |
| .SH DESCRIPTION
 | |
| This assembler is made with the general framework
 | |
| described in \fIuni_ass\fP(6).
 | |
| .SH SYNTAX
 | |
| .IP segments
 | |
| An address on the Intel 8086 consists of two pieces:
 | |
| a segment number and an offset. A memory address is computed as
 | |
| the segment number shifted left 4 bits + the offset.
 | |
| Assembly language addresses only give the offset, with the exception of
 | |
| the address of an inter-segment jump or call (see \fIaddressing modes\fP
 | |
| below).
 | |
| For each segment type (.org, .text, .data, or .bss) the segment number
 | |
| must be given with the .sbase pseudo-instruction.
 | |
| The syntax is:
 | |
| .br
 | |
| 	.sbase <segment-id> expression
 | |
| .br
 | |
| with segment-id one of .org, .text, .data, or .bss.
 | |
| Example:
 | |
| .br
 | |
| 	.sbase .text 0x1000
 | |
| 
 | |
| .IP registers
 | |
| The Intel 8086 has the following 16-bit registers:
 | |
| .br
 | |
| Four general registers: ax (accumulator), bx (base), cx (count), and dx (data).
 | |
| The upper halves and lower halves of these registers are separately
 | |
| addressable as ah, bh, ch, dh, and al, bl, cl, dl respectively.
 | |
| .br
 | |
| Two pointer registers: sp (stack pointer) and bp (base pointer).
 | |
| .br
 | |
| Two index registers: si (source index) and di (destination index).
 | |
| .br
 | |
| Four segment registers: cs (code), ds (data), ss (stack), and es (extra).
 | |
| .IP "addressing modes"
 | |
| .nf
 | |
| .ta 8n 16n 24n 32n 40n 48n
 | |
| syntax		meaning
 | |
| 
 | |
| expr		the value of \fIexpr\fP is immediate data or
 | |
| 		an address offset. There is no special
 | |
| 		notation for immediate data.
 | |
| 
 | |
| register	one of the aforementioned general registers
 | |
| 		or their upper or lower halves, or one of the
 | |
| 		four segment registers.
 | |
| 
 | |
| (expr)		the value of expr is the address of the operand.
 | |
| 
 | |
| (reg)
 | |
| expr (reg)	the value of \fIexpr\fP (if present) + the contents of
 | |
| 		\fIreg\fP (which must be a pointer or an index register)
 | |
| 		is the address of the operand.
 | |
| 
 | |
| (preg) (ireg)
 | |
| expr (preg) (ireg)
 | |
| 		the value of \fIexpr\fP (if present) + the contents of
 | |
| 		\fIpreg\fP (which must be a pointer register) + the
 | |
| 		contents of \fIireg\fP (which must be an index register)
 | |
| 		is the address of the operand.
 | |
| 
 | |
| The next addressing mode is only allowed with the instructions
 | |
| "callf" or "jmpf".
 | |
| 
 | |
| expr : expr	the value of the first \fIexpr\fP is a segment number,
 | |
| 		the value of the second \fIexpr\fP is an address offset.
 | |
| 		The (absolute) address of the operand is computed
 | |
| 		as described above.
 | |
| .fi
 | |
| 
 | |
| .IP instructions
 | |
| Each time an address is computed the assembler decide which segment register
 | |
| to use. You can override the assembler's choice by prefixing the instruction
 | |
| with one of eseg, cseg, sseg, or dseg; these prefixes indicate that the
 | |
| assembler should choose es, cs, ss, or ds instead.
 | |
| .br
 | |
| Example: 
 | |
| .ti +8
 | |
| dseg movs
 | |
| .SH "SEE ALSO"
 | |
| uni_ass(6),
 | |
| ack(1),
 | |
| .br
 | |
| MCS-86 assembly language reference manual, 1978, Intel Corporation
 | |
| .SH EXAMPLE
 | |
| .nf
 | |
| .ta 8n 16n 24n 32n 40n 48n
 | |
| An example of Intel 8086 assembly language:
 | |
| 
 | |
| 	_panic:
 | |
| 		push	bp
 | |
| 		mov	bp,sp
 | |
| 	.data
 | |
| 	_35:
 | |
| 	.word	24944
 | |
| 	.word	26990
 | |
| 	.word	14947
 | |
| 	.word	32
 | |
| 	.text
 | |
| 	call _disable
 | |
| 	mov ax,_35
 | |
| 	push ax
 | |
| 	call _str
 | |
| 	pop si
 | |
| 	push 4(bp)
 | |
| 	call _str
 | |
| 	pop si
 | |
| 	call _nlcr
 | |
| 	call _exit
 | |
| 	mov sp,bp
 | |
| 	pop bp
 | |
| 	ret
 | |
| 	.extern _nopanic
 | |
| 	_nopanic:
 | |
| 		push	bp
 | |
| 		mov	bp,sp
 | |
| 	.data
 | |
| 	_38:
 | |
| 	.word	28526
 | |
| 	.word	24944
 | |
| 	.word	26990
 | |
| 	.word	14947
 | |
| 	.word	32
 | |
| 	.text
 | |
| 	mov ax,_38
 | |
| 	push ax
 | |
| 	call _str
 | |
| 	pop si
 | |
| 	push 4(bp)
 | |
| 	call _str
 | |
| 	pop si
 | |
| 	push 6(bp)
 | |
| 	call _octal
 | |
| 	pop si
 | |
| 	mov sp,bp
 | |
| 	pop bp
 | |
| 	ret
 | |
| .fi
 |