Assembly Language Programming in VESP
Aritmetic and logic operations
Conditional jumps
Memory Reference
Example-1: addition: A + B
|
0000--add
|
- Add B to A and
leave the result in A
|
|
7000
--hlt
|
- Halt
|
Example-2: subtraction: B-A
|
1000-cmp
|
-Complement
A
|
|
0000-add
|
- Add B to A and
leave the result in A
|
|
2001;
0001
|
- lda- Load 1 into
B
|
|
0000-add
|
- Add B to A and
leave the result in A (increment A)
|
Example-3: Conditional jump
|
Loc 0:
5006-jez
|
-Jump to location
6 if A = 0
|
|
Loc 1:
6008-jps
|
-Jump to location
8 if A > 0
|
|
Loc 2:
7000
|
-Halt
|
|
|
|
|
|
|
|
|
|
|
Loc 6: 2005;
0002
|
|
|
Loc 7:
7000
|
|
|
Loc 8:
7000
|
|
Example-4: Memory Reference
|
Loc 0: 3000;
0001
|
-Move B to
A
|
|
Loc 1: 3001;
0000
|
-Move A to
B
|
|
Loc 2:
3000;000A
|
-Move the word
into A
|
A straightline vesp program that adds the 4 numbers in locations 2 through 5, and stores the sum in ox0080.
(Its entry, and execution over vesp.)
Location 0100: 2002----load 7 into location 2
Location 0101: 0007
Location 0102: 2003----load 15 into location 3
Location 0103: 000F
Location 0104: 2004----load 2 into location 4
Location 0105: 0002
Location 0106: 2005----load -31 into location 5
Location 0107: FFE1
Location 0108: 3000----move the contents of location 2 into A
Location 0109: 0002
Location 010A: 3001----move the contents of locations 3 into B
Location 010B: 0003
Location 010C: 0000----add A and B and save the result in A
Location 010D: 3001----move the contents of location 4 into B
Location 010E: 0004
Location 010F: 0000----add A and B and the save the result in A
Location 0110: 3001----move the contents of location 5 into B
Location 0111: 0005
Location 0112: 0000----add A and B and the save the result in A
Location 0113: 3080----move the contents of A into location 80
Location 0114: 0000
Location 0115: 7000
Enter 0 if you wish to execute the program, 1 to step it,2 to exit to the main menu: 0
Machine Cycle 1: PC = 100,
FETCH SUBCYCLE
MAR = 0100, IR = 2002,
Clock cycle = 2
DECODE SUBCYCLE
The decoded instruction is: LDA
Clock cycle = 2
EXECUTE SUBCYCLE
Clock cycle = 3
A = 0000, B = 0000, Z = 0, S = 0, C = 0, F = 0
MAR = 0100, PC = 0102, IR = 2002, reset = 0
add = 0
complement = 0
Memory[0002] = 0007,
Machine Cycle 2: PC = 102,
FETCH SUBCYCLE
MAR = 0102, IR = 2003,
Clock cycle = 5
DECODE SUBCYCLE
The decoded instruction is: LDA
Clock cycle = 5
EXECUTE SUBCYCLE
Clock cycle = 6
A = 0000, B = 0000, Z = 0, S = 0, C = 0, F = 0
MAR = 0102, PC = 0104, IR = 2003, reset = 0
add = 0
complement = 0
Memory[0003] = 000F,
Machine Cycle 3: PC = 104,
FETCH SUBCYCLE
MAR = 0104, IR = 2004,
Clock cycle = 8
DECODE SUBCYCLE
The decoded instruction is: LDA
Clock cycle = 8
EXECUTE SUBCYCLE
Clock cycle = 9
A = 0000, B = 0000, Z = 0, S = 0, C = 0, F = 0
MAR = 0104, PC = 0106, IR = 2004, reset = 0
add = 0
complement = 0
Memory[0004] = 0002,
Machine Cycle 4: PC = 106,
FETCH SUBCYCLE
MAR = 0106, IR = 2005,
Clock cycle = 11
DECODE SUBCYCLE
The decoded instruction is: LDA
Clock cycle = 11
EXECUTE SUBCYCLE
Clock cycle = 12
A = 0000, B = 0000, Z = 0, S = 0, C = 0, F = 0
MAR = 0106, PC = 0108, IR = 2005, reset = 0
add = 0
complement = 0
Memory[0005] = FFE1,
Machine Cycle 5: PC = 108,
FETCH SUBCYCLE
MAR = 0108, IR = 3000,
Clock cycle = 14
DECODE SUBCYCLE
The decoded instruction is: MOV
Clock cycle = 14
EXECUTE SUBCYCLE
Clock cycle = 16
A = 0007, B = 0000, Z = 0, S = 0, C = 0, F = 0
MAR = 0108, PC = 010A, IR = 3000, reset = 0
add = 0
complement = 0
Memory[0000] = 0007,
Machine Cycle 6: PC = 10A,
FETCH SUBCYCLE
MAR = 010A, IR = 3001,
Clock cycle = 18
DECODE SUBCYCLE
The decoded instruction is: MOV
Clock cycle = 18
EXECUTE SUBCYCLE
Clock cycle = 20
A = 0007, B = 000F, Z = 0, S = 0, C = 0, F = 0
MAR = 010A, PC = 010C, IR = 3001, reset = 0
add = 0
complement = 0
Memory[0001] = 000F,
Machine Cycle 7: PC = 10C,
FETCH SUBCYCLE
MAR = 010C, IR = 0000,
Clock cycle = 22
DECODE SUBCYCLE
The decoded instruction is: ADD
Clock cycle = 22
EXECUTE SUBCYCLE
Clock cycle = 23
A = 0016, B = 000F, Z = 0, S = 0, C = 0, F = 0
MAR = 010C, PC = 010D, IR = 0000, reset = 0
add = 1
complement = 0
Machine Cycle 8: PC = 10D,
FETCH SUBCYCLE
MAR = 010D, IR = 3001,
Clock cycle = 25
DECODE SUBCYCLE
The decoded instruction is: MOV
Clock cycle = 25
EXECUTE SUBCYCLE
Clock cycle = 27
A = 0016, B = 0002, Z = 0, S = 0, C = 0, F = 0
MAR = 010D, PC = 010F, IR = 3001, reset = 0
add = 0
complement = 0
Memory[0001] = 0002,
Machine Cycle 9: PC = 10F,
FETCH SUBCYCLE
MAR = 010F, IR = 0000,
Clock cycle = 29
DECODE SUBCYCLE
The decoded instruction is: ADD
Clock cycle = 29
EXECUTE SUBCYCLE
Clock cycle = 30
A = 0018, B = 0002, Z = 0, S = 0, C = 0, F = 0
MAR = 010F, PC = 0110, IR = 0000, reset = 0
add = 1
complement = 0
Machine Cycle A: PC = 110,
FETCH SUBCYCLE
MAR = 0110, IR = 3001,
Clock cycle = 32
DECODE SUBCYCLE
The decoded instruction is: MOV
Clock cycle = 32
EXECUTE SUBCYCLE
Clock cycle = 34
A = 0018, B = FFE1, Z = 0, S = 0, C = 0, F = 0
MAR = 0110, PC = 0112, IR = 3001, reset = 0
add = 0
complement = 0
Memory[0001] = FFE1,
Machine Cycle B: PC = 112,
FETCH SUBCYCLE
MAR = 0112, IR = 0000,
Clock cycle = 36
DECODE SUBCYCLE
The decoded instruction is: ADD
Clock cycle = 36
EXECUTE SUBCYCLE
Clock cycle = 37
A = FFF9, B = FFE1, Z = 0, S = 1, C = 0, F = 0
MAR = 0112, PC = 0113, IR = 0000, reset = 0
add = 1
complement = 0
Machine Cycle C: PC = 113,
FETCH SUBCYCLE
MAR = 0113, IR = 3080,
Clock cycle = 39
DECODE SUBCYCLE
The decoded instruction is: MOV
Clock cycle = 39
EXECUTE SUBCYCLE
Clock cycle = 41
A = FFF9, B = FFE1, Z = 0, S = 1, C = 0, F = 0
MAR = 0113, PC = 0115, IR = 3080, reset = 0
add = 0
complement = 0
Memory[0080] = FFF9,
Machine Cycle D: PC = 115,
FETCH SUBCYCLE
MAR = 0115, IR = 7000,
Clock cycle = 43
DECODE SUBCYCLE
The decoded instruction is: HLT
Clock cycle = 43
EXECUTE SUBCYCLE
Clock cycle = 44
A = FFF9, B = FFE1, Z = 0, S = 1, C = 0, F = 0
MAR = 0115, PC = 0116, IR = 7000, reset = 1
add = 0
complement = 0
The number of instructions executed = 13
The number of clock cycles used = 44
Type
0 to enter a program
1 to display registers
2 to display memory: 2
Enter the first address (3 hex digits): 080
Enter the last address: (3 hex digits): 080
Location 0080 : FFF9
Type
0 to enter a program
1 to display registers
2 to display memory: a
Example-6: Looping (Using direct addressing- self-modifying code)
High Level Representation
int loopcount = 6;
int sum,y[7],i;
y[0] = 15; y[1] = 23; y[2] = -14;
y[3] = 7; y[4] = 126;y[5] = 89;
sum = 0;
for(i = 1; i <= loopcount;i++)
{ sum = sum + y[i];}
Translating from C into Vesp.
Location 000: A
Location 001: B
Location 002: sum (cleared to 0)
Location 003: loop count (initialized to 6)
Location 004: index-i(initialized to the address
of the 1st element of the list(location 5).
Location 005: y[0]
Location 006: y[1]
Location 007: y[2]
location 008: y[3]
location 009: y[4]
location 00A: y[5]
location 00B: Not used
location 00C: Not used
.
.
.
location 1FF: Not used
location :
Program begins here
// (Load operands)
200 2005 Load
201 000F 15
202 2006 Load
203 0017 23
204 2007 Load
205 FFF2 -14
206 2008 Load
207 0007 7
208 2009 Load
209 007E 126
20A 200A Load
20B 0059 89
// (Clear sum)
20C 2002
20D 0000
// (Set loopcount to 6)
20E 2003
20F 0006
// (Set list index to 5)
210 2004
211 0005
// (check if the loopcount is equal to 0 )
212 3000 move loopcount into A
213 0003 loopcount's address
214 5hhh jump to halt if A = 0 (22B)
215 2001 load -1 into B
216 FFFF -1
217 0000 add
218 3003 save loopcount
219 0000 A's address
// (perform sum = sum + y[i])
21A 321D move index i into 21D
21B 0004
21C 3001 move y[i] into B
21D zzzz this is the index i
21E 3000 move sum into A
21F 0002 sum's address
220 0000 add
221 3002 save sum
222 0000 A
223 3000 move index i into A
224 021D index i's address
225 2001 load 1 into B
226 0001 1
227 0000 add
228 3004 save i+1 into index
229 0000
22A 4212 jump back to location 212.
22B 7000 halt
Another version-loaded at location 30.
2020 //Address: 30 Load numbers
000F //Address: 31
2021 //Address: 32
0017 //Address: 33
2022 //Address: 34
00F9 //Address: 35
2023 //Address: 36
0007 //Address: 37
2024 //Address: 38
007D //Address: 39
2025 //Address: 3A
0059 //Address: 3B End load numbers
2002 //Address: 3C Initialize loop-count to 6
0006 //Address: 3D
2008 //Address: 3E Initialize index to 20
0020 //Address: 3F
3000 //Address: 40 Move operand to Register-A
0020 //Address: 41
030A //Address: 42 Save sum
0000 //Address: 43
3000 //Address: 44 Load loop count
0002 //Address: 45
2001 //Address: 46 Load -1 into Register-B
FFFF //Address: 47
0000 //Address: 48 Add
3002 //Address: 49 Save loop counter
0000 //Address: 4A
505B //Address: 4B Jump to Halt if loop-count = 0
3000 //Address: 4C Move index to Register-A
0008 //Address: 4D
2001 //Address: 4E Load 1 into Register-B
0001 //Address: 4F
0000 //Address: 50 Increment index by 1
3008 //Address: 51 Save index
0000 //Address: 52
3058 //Address: 53 Copy index into code
0000 //Address: 54
3000 //Address: 55 Move sum into Register-A
000A //Address: 56
3001 //Address: 57 Move operand into Register-B
xxxx //Address: 58
0000 //Address: 59 Add
4042 //Address: 5A Jump back to save sum
7000 //Address: 5B Halt
|