12/07/2006
A student writes:
Dr Patt,
In using a TRAP instruction, we (the coders) specify the
TRAP vector to execute the functions we wish to perform.
So when we write TRAP x20 we're telling the LC-3 exactly
what we want it to do (namely, look in the entry x20 of
the Trap Vector Table, that is your starting address).
All true, but just to be sure you are not being misled: The user does
not write the trap service routine, it is part of the o/s. So, while
it is true we (the coders) are specifying the TRAP vector, we are not
devising the routine, but rather we are selecting a routine from a collection
of routines that are available to us. If you are programming in Java or
C++, etc. that is all hidden from you. The compiler knows what each of these
trap service routines do and inserts TRAP instructions with the necessary
trap vectors where appropriate.
In your lecture the other day, you mentioned that the difference
is that when using an interrupt, the device that is interrupting
our code PROVIDES this location in the Interrupt Vector Table,
we, as the code writer, do not.
Also true. In this case, the I/O device wants to interrupt your program,
so the device supplies the interrupt vector corresponding to the routine that
the device wants carried out in its behalf.
The Interrupt Device (in PA5) is providing the address x0180 to
look for the starting address of our specific interrupt service
routine.
Am I correct so far?
Yes.
Assuming I'm correct, now when writing my program, in the
initialization of the program, I need to actually store the
memory location of the starting instruction of my interrupt
service routine (x2000) into memory location x0180. Which is something that if we
were running an O/S on the LC-3 would be done for me.
Is this correct?
Right again.
So, again, assuming I'm correct, the interrupt device (Keyboard)
would say "HEY! INTERRUPT! Look at memory location x0180 for where
to go next."
I could not say it better myself! You want to teach 306 next semester?
OR
Does the interrupt device (Keyboard) say "HEY! INTERRUPT! Look at
memory location x0100 (start of the Interrupt Vector Table) and
then increment to x0180."
Actually, the real truth is the interrupt device supplies x80 and the LC-3
hardware sticks a 1 in front of it since the hardware knows the interrupt
vector table starts at x100.
Since you are doing so great, I will even add an embellishment (shame on me)
that you do NOT need to know for 306: In most modern machines the interrupt
vector table can be anywhere in memory, so rather than it starting at x0100,
there is another register (called the Interrupt Vector Table Base Register)
which contains the starting address of the interrupt vector table. In such
cases (almost all, today), the hardware will add the interrupt vector (for
example x80) to the contents of the IVTB Register to get the address of the
location in the interrupt vector table containing the starting address of the
interrupt service routine.
I think I am a little confused as to whether I need to do anything
with the given information in the statement of the programming
assignment about the start of the Interrupt Vector Table being
at x0100 or if I can just simply store x2000 into x0180.
You can simply store x2000 at x0180.
Thanks for your help!
My pleasure.
Yale Patt
<<name withheld to protect the student who thinks incorrectly that he
is confused>>