HALT
is just a "pseudo-instruction" for a TRAP instruction used to halt the machine.
You could write:
TRAP x25 ;HALT the machine
But in this way you need to remember the position in the TRAP vector, in this case x25
. So is better to just use HALT
instead.
Others common TRAPs also have pseduo-instructions: IN
, OUT
, etc.
I asume you want to store your results somewhere. You could do something like:
;Sets pc to this address at start of program
.ORIG x3000
;R1 will store the result lets clear it(ANd with 0)
AND R1,R1,x0
;R2 will be multiplied by R3, let's clear both of them
AND R2,R2,x0
AND R3,R3,x0
;Test case 4 * 3 = 12;
ADD R2,R2,4
ADD R3,R3,3
;Add to increment zone
LOOP Add R1,R1,R2;
;Decrement the counter, in this case the 3 or R3
ADD R3,R3,x-1
BrP LOOP
ST R1, Result ;STORE R1 at Result
HALT
Result .FILL x0000 ;this will be x000C=12h after execution
.END
---------------------EDIT--------------------------
About you last question (in comments):
If HALT stops my program, how will Reslt .FILL x0000 directive run
then?
This is more a question about how assemblers works.
The answer is because: Assembly Time != Execution Time
Directives are considered at Assembly Time.
In fact, Assembly Time is composed in two passes:
- Resolve symbols creating a symbol table
- Convert instructions to "truly executable/machine code" using the symbol table.
This is a very common way to implement assemblers, and the LC3 assembler is not the exception.