Untitled

mail@pastecode.io avatar
unknown
assembly_x86
2 years ago
12 kB
2
Indexable
Never
### 8085 program to move blocks of bits from source location to a destination location: ###

2000	MVI	C, 05	[C] <- 05
2002	LXI	H, 2500	[H-L] <- 2500
2005	LXI	D, 2600	[D-E] <- 2600
2008	MOV	A, M	[A] <- [[H-L]]
2009	STAX	D	[A] -> [[D-E]]
200A	INX	H	[H-L] <- [H-L] + 1
200B	INX	D	[D-E] <- [D-E] + 1
200C	DCR	C	[C] <- [C] – 1
200D	JNZ	2008	Jump if not zero to 2008
2010	HLT		Stop

Explanation – Registers A, D, E, H, L, C are used for general purpose:

MOV is used to transfer the data from memory to accumulator (1 Byte)
LXI is used to load register pair immediately using 16-bit address (3 Byte instruction)
MVI is used to move data immediately into any of registers (2 Byte)
STAX is used to store accumulator into register pair indirectly (3 Byte instruction)
DCR is used to decrease register by 1 (1 Byte instruction)
INX is used to increase register pair by 1 (1 Byte instruction)
JNZ is used to jump if not zero to given memory location (3 Byte instruction)
HLT is used to halt the program

### 8085 program to add two 8 bit numbers: ###

2000	LDA 2050	A<-[2050]
2003	MOV H, A	H<-A
2004	LDA 2051	A<-[2051]
2007	ADD H	A<-A+H
2008	MOV L, A	L←A
2009	MVI A 00	A←00
200B	ADC A	A←A+A+carry
200C	MOV H, A	H←A
200D	SHLD 3050	H→3051, L→3050
2010	HLT	 
Explanation – 


LDA 2050 moves the contents of 2050 memory location to the accumulator.
MOV H, A copies contents of Accumulator to register H to A
LDA 2051 moves the contents of 2051 memory location to the accumulator.
ADD H adds contents of A (Accumulator) and H register (F9). The result is stored in A itself. For all arithmetic instructions A is by default an operand and A stores the result as well
MOV L, A copies contents of A (34) to L
MVI A 00 moves immediate data (i.e., 00) to A
ADC A adds contents of A(00), contents of register specified (i.e A) and carry (1). As ADC is also an arithmetic operation, A is by default an operand and A stores the result as well
MOV H, A copies contents of A (01) to H
SHLD 3050 moves the contents of L register (34) in 3050 memory location and contents of H register (01) in 3051 memory location
HLT stops executing the program and halts any further execution

### 8085 program to multiply two 8 bit numbers: ### 

Memory Address	Mnemonics	Comment
2000	LHLD 2050	H←2051, L←2050
2003	XCHG	H↔D, L↔E
2004	MOV C, D	C←D
2005	MVI D 00	D←00
2007	LXI H 0000	H←00, L←00
200A	DAD D	HL←HL+DE
200B	DCR C	C←C-1
200C	JNZ 200A	If Zero Flag=0, goto 200A
200F	SHLD 3050	H→3051, L→3050
2012	HLT	 
Explanation – Registers used: A, H, L, C, D, E 

LHLD 2050 loads content of 2051 in H and content of 2050 in L
XCHG exchanges contents of H with D and contents of L with E
MOV C, D copies content of D in C
MVI D 00 assigns 00 to D
LXI H 0000 assigns 00 to H and 00 to L
DAD D adds HL and DE and assigns the result to HL
DCR C decrements C by 1
JNZ 200A jumps program counter to 200A if zero flag = 0
SHLD stores value of H at memory location 3051 and L at 3050
HLT stops executing the program and halts any further execution

### 8085 programs to find 2’s complement with carry: ### 

2000	LDA 2050	A←2050
2003	CMA	A←complement of A
2004	INR A	A←A+01
2005	MOV L, A	L←A
2006	MVI A 00	A←00
2008	ADC A	A←A+A+Carry
2009	MOV H, A	H←A
200A	SHLD 3050	L→3050, H→3051
200D	HLT	 
Explanation – Registers used: A, H, L 

LDA 2050 loads content of 2050 in A
CMA complements the contents of A
INR A increases A by 01
MOV L, A copies contents of A in L
MVI A 00 moves 00 in A
ADC A adds A, A, Carry and assigns it to A
MOV H, A copies contents of A in H
SHLD 3050 stores value of H at memory location 3051 and L at 3050
HLT stops executing the program and halts any further execution

### 8085 program to find square root of a number: ###

MEMORY ADDRESS	MNEMONICS	COMMENT
2000	MVI D, 01	D <- 01
2002	MVI E, 01	E <- 01
2004	LDA 2050	A <- M[2050]
2007	SUB D	A <- A – D
2008	JZ 2011	Jump if ZF = 0 to memory location 2011
200B	INR D	D <- D + 1
200C	INR D	D <- D + 1
200D	INR E	E <- E + 1
200E	JMP 2007	Jump to memory location 2007
2011	MOV A, E	A <- E
2012	STA 3050	A -> M[3050]
2015	HLT	END
Explanation – Registers used A, D, E:

MVI D, 01 – initialize register D with 01
MVI E, 01 – initialize register E with 01
LDA 2050 – loads the content of memory location 2050 in accumulator A
SUB D – subtract value of D from A
JZ 2011 – make jump to memory location 2011 if zero flag is set
INR D – increments value of register D by 1. Since it is used two times, therefore value of D is incremented by 2
INR E – increments value of register E by 1
JMP 2007 – make jump to memory location 2007
MOV A, E – moves the value of register E in accumulator A
STA 3050 – stores value of A in 3050
HLT – stops executing the program and halts any further execution

### 8085 program to count the number of ones in contents of register B : ###

2000	MVI B 75	B ← 75
2002	MVI C 08	C ← 75
2004	MVI D 00	D ← 00
2006	MOV A, B	A ← B
2007	RRC	Rotate right without carry
2008	JNC 200C	Jump if Not Carry
200B	INR D	D ← D+1
200C	DCR C	C ← C-1
200D	JNZ 2007	Jump if Not Zero
2010	MOV A, D	A ← D
2011	STA 3050	A → 3050
2014	HLT	Stops execution
Explanation:

MVI B 75 moves 75 decimal numbers into the B register
MVI C 08 moves 08 decimal number into C register, which is taken as counter as the number is of 8 bites
MVI D 00 moves 00 number into d register
MOV A, B moves the contents of B register into A (accumulator) register
RRC rotates the contents of A (which is 75 with binary equivalent 01110101) right
JNC 200C jumps to 200C address and performs the instructions written there if the carry flag is not zero
INR D increases the value of the D register by adding one to its contents
DCR C decreases the value of the C register by subtracting one from its contents
JNZ 2007 jumps to the 2007 address and performs the instructions written there if the zero flags are not zero
MOV A, D moves the contents of the B register into the A register
STA 3050 store the contents of A at 3050 memory location
HLT stops execution

### 8085 program to add numbers in an array: ###

2000	LDA 2050	A <- [2050]
2003	MOV B, A	B <- A
2004	LXI H, 2051	H <- 20 and L <- 51
2007	MVI A, 00	A <- 00
2009	MVI C, 00	C <- 00
200B	ADD M	A <- A+M
200C	INR L	M <- M+1
200D	JNC 2011	
2010	INR C	C <- C+1
2011	DCR B	B <- B-1
2012	JNZ 200B	
2015	STA 3050	3050 <- A
2018	MOV A, C	A <- C
2019	STA 3051	3051 <- A
201C	HLT	Terminates the program
Explanation –

LDA 2050: load accumulator with content of location 2050
MOV B, A: copy contents of accumulator to register B
LXI H, 2051: store 20 to H register and 51 to L register
MVI A, 00: store 00 to accumulator
MVI C, 00: store 00 to register C
ADD M: add accumulator with the contents of memory location given in HL register pair
INR L: increase address by 1
JNC 2011: if not carry, jump to location 2011 otherwise to the location given in PC
INR C: increase content of register C by 1
DCR B: decrease content of register B by 1
JNZ 200B: if not zero, jump to location 200B otherwise to the location given in PC
STA 3050: store contents of accumulator to memory location 3050
MOV A, C: copy contents of register C to accumulator
STA 3051: store contents of accumulator to memory location 3051
HLT: terminates the program

### 8085 program to convert binary numbers to gray: ###

2000	STC	CY <- 1
2001	CMC	CY <- 1's Compliment of CY
2002	LDA 2050	A <- 2050
2005	MOV B,A	B <- A
2006	RAR	Rotate accumulator right with carry
2007	XRA B	A = A XOR B
2008	STA 3050	3050 <- A
200B	HLT	Stop
Explanation –

STC is used to set carry flag (CY) to 1.
CMC is used to take 1’s compliment of the contents of carry flag (CY).
LDA 2050 is used load the data from address 2050 in A.
MOV B, A is used to move the data of A into B.
RAR is used to rotate the bits of A along with carry flag (CY) to right one time.
XRA B is used to perform XOR operation between the contents of register A and B.
STA 3050 is used to store the contents of A to 3050.
HLT is used end the program.

### 8085 program to perform AND operation in nibbles of 8 bit number: ###

2000	LDA 2050	A <- M[2050]
2003	ANI 0F	A <- A (AND) 0F
2005	MOV B, A	B <- A
2006	LDA 2050	A <- M[2050]
2009	ANI F0	A <- A (AND) F0
200B	RLC	Rotate accumulator left by one bit without carry
200C	RLC	Rotate accumulator left by one bit without carry
200D	RLC	Rotate accumulator left by one bit without carry
200E	RLC	Rotate accumulator left by one bit without carry
200F	ANA B	A <- A (AND) B
2010	STA 3050	M[3050] <- A
2013	HLT	END
Explanation – Registers A, B are used for general purpose.

LDA 2050: load the content of memory location 2050 in accumulator A.
ANI 0F: perform AND operation in A and 0F. Store the result in A.
MOV B, A: moves the content of A in register B.
LDA 2050: load the content of memory location 2050 in accumulator A.
ANI F0: perform AND operation in A and F0. Store the result in A.
RLC: rotate the content of A left by one bit without carry. Use this instruction 4 times to reverse the content of A.
ANA B: perform AND operation in A and B. Store the result in A.
STA 3050: store the content of A in memory location 3050.
HLT: stops executing the program and halts any further execution.

### 8085 program to find smallest number between two numbers: ###

2000	LDA	[2500]	[A]<-[2500]
2003	MOV B, A	 	[B]<-[A]
2004	LDA	2501	[A]<-[2501]
2007	CMP B	 	[A]<-[A]-[B]
2008	JC *	[200C]	jump carry
200B	MOV A, B	 	[A]<-[B]
200C	STA	[2502]	[A]->[2502]
200F	HLT	 	STOP
Explanation – 
 

LDA is used to load accumulator (3 Byte instruction). 
 
CMP is used to compare the content of accumulator (1 Byte instruction). 
 
STA is used to store accumulator direct using 16-bit address (3 Byte instruction).
 
JC jump if carry (3 Byte instruction). 


### 8085 program to find 1’s and 2’s complement of 16-bit number: ###

2000	LHLD	[3000]	[H-L] <- [3000]
2003	MOV	A, L	[A] <- [L]
2004	CMA		[A] <- [A^]
2005	MOV	L, A	[L] <- [A]
2006	MOV	A, H	[A] <- [H]
2007	CMA		[A] <- [A^]
2008	MOV	H, A	[H] <- [A]
2009	SHLD	[3002]	1’s complement
200C	INX	H	[H-L] <- [H-L] + 1
200D	SHLD	[3004]	2’s complement
2010	HLT		Stop
Explanation –

A is an 8-bit accumulator which is used to load and store the data
LHLD is used to load register pair H-L direct using 16-bit address (3 Byte instruction)
MOV is used to transfer the data from accumulator to register(any) or register(any) to accumulator (1 Byte)
CMA is used to complement content of accumulator (1 Byte instruction)
SHLD is used to store data from register pair H-L into memory direct using 16-bit address (3 Byte instruction)
INX is used to increase H-L register pair by 1 (1 Byte instruction)
HLT is used to halt the program


### 8085 program to exchange content of HL register pair with DE register pair: ###

F000
16, 56
MVI D,56H
Load D with56H
F002
1E, 78
MVI E,78H
Load D with78H
F004
26, CD
MVI H,CDH
Load D with CDH
F006
2E, EF
MVI L,EFH
Load D withEFH
F008
EB
XCHG
Exchange the content of DE and HL
F009
76
HLT
Terminate the program


8085 program to swap two 8 bit numbers using Direct addressing mode:

2000	LDA	[3000]	[A] <- [3000]
2003	MOV	H, A	[H] <- [A]
2004	LDA	[3001]	[A] <- [3001]
2007	MOV	D, A	[D] <- [A]
2008	XCHG		[H-L] [D-E]
2009	HLT		Stop
Explanation – Registers A, H, D are used for general purpose.

LDA is used to load accumulator direct using 16-bit address (3 Byte instruction)
MOV is used to transfer the data (1 Byte instruction)
XCHG is used to exchange the data of both the register pair (H-L), (D-E) (1 Byte instruction)
HLT is used to halt the program.