This tutorial is intended to follow the tutorial on assembly language variables.
The IJVM instruction set provides three instructions that perform integer arithmetic. Two of these instructions (IADD and ISUB) pop the top two elements from the stack, perform the indicated arithmetic (addition and subtraction, respectively), and push the result onto the stack. The third instruction (IINC) increments a variable.
Integer multiplication can be implemented using repeated addition and integer division (and modulus or remainder) can be implemented using repeated subtraction. A crude multiplication algorithm is provided in the tutorial on branching.
1. Clear
the memory of the computer (Memory menu; Clear Memory).
2. If
necessary, clear the source code editor (Source menu, Clear
Source Code).
3. Enter
the following assembly language program using the source code editor. This
program declares two variables, initializes them, and finds their sum and
difference.
.main .var a b a_plus_b a_minus_b .end-var // a = 25 // b = 32 bipush 25 istore a bipush 32 istore b // a_plus_b = a + b iload a iload b iadd istore a_plus_b // a_minus_b = a - b iload a iload b isub istore a_minus_b halt .end-main
4.
Assemble the program (tap the F2 function key). If you do not want to
save this program, just click the Cancel button in the file save dialog;
the machine language code will still be loaded into memory.
5. Check
the Single-Step through IJVM Code checkbox below the input/output window.
6. Click
the Reset button.
7.
Click the Display Words button below the memory display.
8.
Click the IJVM Step button two (2) times. This "primes the pump",
so to speak, allowing the machine language interpreter to perform its start-up
routine.
9. Execute
the first four instructions by clicking the IJVM Step button four
(4) times.
10. Click
the Goto LV button. Variable "a", at offset zero, has a value of
25 and variable "b", at offset 1, has a value of 32:
11. Click
the IJVM Step button. Look at the memory window and confirm that
25 (the value of "a") is at the top of the stack (SP = 4097).
12. Click
the IJVM Step button. Look at the memory window and confirm that
32 (the value of "b") is at the top of the stack (SP = 4098).
13. Click
the IJVM Step button. Look at the memory window and confirm that
the top two elements have been popped from the stack and their sum is now at the
top of the stack (SP = 4097 and points at the value 57).
14. Click
the IJVM Step button. The sum (57) has been popped from the stack
(SP = 4096).
15. Click
the Goto LV button. The sum has been stored in a_plus_b at offset
2:
16. Click
the IJVM Step button. Look at the memory window and confirm that
25 (the value of "a") is at the top of the stack (SP = 4097).
17. Click
the IJVM Step button. Look at the memory window and confirm that
32 (the value of "b") is at the top of the stack (SP = 4098).
18. Click
the IJVM Step button. Look at the memory window and confirm that
the top two elements have been popped from the stack and their difference is now
at the top of the stack (SP = 4097 and points at the value -7).
19. Click
the IJVM Step button. The difference (-7) has been popped from the
stack (SP = 4096).
20. Click
the Goto LV button. The difference has been stored in a_minus_b at
offset 3:
21. Click
the IJVM Step button. The HALT instruction has been executed and
the program has terminated.
The IINC instruction increments a local variable. This instruction has two operands: a 1-byte unsigned offset and a 1-byte signed integer value. The offset is added to the value in the LV register to determine the location of the variable that is to be incremented. The signed integer is added to the value of that variable: Mem[LV + offset] = Mem[LV + offset] + value.
If the IINC instruction is preceded by the WIDE instruction, the first operand is a 2-byte offset. This larger offset makes it possible to address more than 256 variables.
When writing assembly code, the first operand must be a variable or parameter identifier defined within the method containing the IINC instruction. The second operand is a decimal integer in the range -128 to 127.
1. Clear
the memory of the computer (Memory menu; Clear Memory).
2. If
necessary, clear the source code editor (Source menu, Clear
Source Code).
3. Enter
the following assembly language program using the source code editor. This
program declares two variables, initializes them, increments the first by a
positive amount, and increments the second by a negative amount.
.constant initialValue 20 .end-constant .main .var a b .end-var // a = initialValue // b = initialValue ldc_w initialValue dup istore a istore b // a = a + 10 iinc a 10 // b = b - 10 = b + (-10) iinc b -10 halt .end-main
4.
Assemble the program (tap the F2 function key). If you do not want to
save this program, click the Cancel button in the file save dialog;
the machine language code will still be loaded into memory.
5. Check
the Single-Step through IJVM Code checkbox below the input/output window.
6. Click
the Reset button.
7.
Click the Display Words button below the memory display.
8.
Click the IJVM Step button two (2) times allowing the machine language interpreter to perform its start-up
routine.
9. Click
the IJVM Step button. The initialValue constant (20) is at
the top of the stack.
10. Click
the IJVM Step button. The value at the top of the stack has been
duplicated; the top two elements on the stack are both 20.
11. Click
the IJVM Step button two (2) times. The top two values have been
popped from the stack.
12. Click
the Goto LV button. Variable "a" (at offset 0) and variable
"b" (at offset 1) both have a value of 20.
13. Click
the IJVM Step button. The value of "a" at offset zero has been
incremented by 10:
14. Click
the IJVM Step button. The value of "b" at offset one has been
incremented by
15. Click
the IJVM Step button. The HALT instruction has been executed and
the program has terminated.
The next tutorial covers assembly language branching.