Address Modes The MARIE supports only three addressing modes: immediate, direct, and indirect. We are now going to discuss addressing modes in general. Most computers support quite a few of these modes. We shall discuss both direct and indirect addressing. We begin with the idea of an effective address, or EA. This is the address in memory of the actual operand (variable) used in the operation. We use the term EA loosely when it is not strictly appropriate, as in the following three addressing modes, none of which reference memory at all. Immediate mode addressing Register addressing Stack addressing. We begin by jumping ahead and discussing direct addressing. We then use this to define and illustrate the three addressing modes mentioned above.
Direct and Immediate Addressing The MARIE supports a Add instruction, with opcode 0011 = 0x3 It also supports Add Indirect, with opcode 1011 = 0xB. The expanded version supports Add Immediate, with opcode 1110 = 0xE. Consider the following memory map (Figure 5.3 in the textbook). Let the AC = 50. Let X have the value 0x800 and assume the table uses hexadecimal addresses. Add X 0x3800 // Go to address 800 and add its contents to the AC. // The value of the AC is now 950. AC (AC) + M[X] AddM X 0xE800 // Add the value 800 to the AC. AC (AC) + X 98% of Load Immediate and Add Immediate use the values 1, 0, and + 1.
Stack and Register Addressing In stack addressing, the operands are on the stack. We illustrate. Push A // Direct addressing. A is the address of the value to be pushed. Push B // Direct addressing. B is the address of the value to be pushed. Add // Stack addressing. Values to be added are on the stack. Pop C // Again, this is direct addressing. Place result in address C. In register addressing, the operands are in registers. We illustrate this mode using notation for a Load Store RISC machine with two registers: R1 and R2. Load R1, A // Direct addressing. A is the address of the value to be // loaded into register R1. Use of a register does not change this. Load R2, B // Again direct addressing, even if the value goes into a register. Add R1, R2 // Register addressing. Values to be added are in the registers. Store R1, C // Again, this is direct addressing.
Calculation of Effective Address We now step back and think about how to calculate an effective address. Having done this, we return to direct addressing and see how it fits in. Again, we are speaking about computers in general. This is not an issue for the MARIE. We begin with the format of a generic instruction referencing memory Opcode Register Address Mode Address Fields Flags Field In general, the only parts of the instruction that are used in computing the EA are the Address Field this contains an address, which may be modified. the Mode Flags these indicate how to modify the given address in order to compute the EA (Effective Address). the Register Fields used in indexed addressing and in register indirect. The order of the fields shown here is generic and probably does not apply to all computers.
No Addressing We first handle the very simple case in which the operator does not use an address. The MARIE has several such instructions: Input, Output, Halt, and Clear. The opcode for Halt is binary 0000 or hexadecimal 0. The machine code for a halt would be written as 0000, as it needs 4 hexadecimal digits. Question: What is the address associated with the machine code 0000? Answer: There is none. The instruction does not use an address. Question: What is the address associated with the machine code 0777? Answer: Note: There is none. The instruction does not use an address. One wonders how the last three hexadecimal digits were set, but they are ignored. One might view this as a variant of immediate mode addressing, but such an approach is probably not helpful.
Direct and Indirect Addressing Opcode Registers Mode Flags Address Field In each of direct and indirect addressing, the computation is simple: Just copy the address field itself. In direct addressing, the address field contains the address of the argument. In indirect addressing, the address field contains the address of a pointer to the argument. Put another way, the contents of the memory indicated by the address field contain the address of the argument.
Direct and Indirect Addressing (Example) Consider again the memory map taken from the textbook. Let X refer to the value 0x800. Load X this loads the AC from address 0x800. The value 900 goes into the AC. EA = X AC M[X] Load Indirect X Go to address 0x800. Its contents are 0x900. Load the AC from address 0x900. The value 1000 goes into the AC. EA = M[X] AC M[ M[X] ] NOTE: The complexity of notation such as AC M[ M[X] ] is one reason we use the Effective Address idea. Break the address computation into small steps.
Register and Register Indirect Addressing Opcode Registers Mode Flags Address Field In each of register and register indirect addressing, the address field is ignored. Conventionally, it is set at all zeroes. In register addressing, a general purpose register contains the argument. In register indirect addressing, a general purpose register contains the address of the argument. The MARIE does not support either addressing mode.
Register and Register Indirect Addressing (Example) Consider again the memory map taken from the textbook. We assume the MARIE has an AC and a register R1. Assume (R1) = 0x800. Register addressing: Load AC, R1 The accumulator is loaded from the register. AC = 0x800 AC (R1) Register Indirect addressing The accumulator is loaded from the address pointed to by the register. Here AC = 0x900. AC M[ (R1) ], the memory addresses by the contents of R1.
Indexed Addressing This is used to support array addressing in all computers. Languages such as C and C++ implement this directly using zero based arrays. The contents of the register are added to the address field to form the effective address. EA = (Address Field) + (Register)
Indexed Addressing (Example) Consider again the memory map taken from the textbook. We assume the MARIE has an AC and one registers: R1. Use R1 in the address calculations. Suppose X = 0x200. Load X[R1] // Syntax is made up to look reasonable. AC is loaded. EA = X + (R1) = 0x200 + 0x800 = 0xA00. AC M[0xA00], whatever that is.
Another Indexed Addressing Example Suppose now that X refers to address 0x800 and that register R1 contains a small number, say (R1) = 0x02. Consider the instruction Load X[R1] The effective address is EA = X + (R1) = 0x800 + 0x02 = 0x802. This can be viewed as X[2] where X is a zero based array. Its memory layout appears similar to the figure below. Memory Map 0x800 0x801 0x802 0x803 X[0] X[1] X[2] X[3]
Indexed Indirect Addressing This is a combination of both modes. Question: Which is done first. Preindexed indirect. The indexing is done first. We have an array of pointers. Postindexed indirect. The indirect is done first. We have a pointer to an array.
Sample Problem (from CPSC 5155) This question references the following memory map. Address 10 11 12 13 14 15 Contents 13 7 4 86 46 77 If the symbol X stands for address 12 and (%R6) == 1, what is the effective address for a) STR %R2, X direct addressing b) STR %R2, *X indirect addressing c) STR %R2, X, 6 indexed by register %R6. d) STR %R2, *X, 6 pre-indexed indirect, indexed by %R6. Analysis: First a few comments on the problem and then we start. 1. Question: Are the addresses decimal or hexadecimal? Answer: This is ambiguous, but not important. We need to compute (12 1), which is 11 in each of decimal and hexadecimal. 2. Question: What does STR do? Answer: We don t care. We just want the address.
Sample Problem (Page 2) Address 10 11 12 13 14 15 Contents 13 7 4 86 46 77 The symbol X stands for address 12 and (%R6) == 1, a) STR %R2, X direct addressing The label X refers to address 12. In direct addressing that is the address. EA = 12. PLEASE NOTE: The contents of address 12 are 4; M[12] == 4. In a higher level language, we would say X is 4, because the memory location contains that value. In this context, we say X references the address 12. b) STR %R2, *X indirect addressing The label X refers to address 12. For indirect addressing, the address is M[X], here M[12] or 4. Note that contents of address 4 are not specified. However, EA = 4.
Sample Problem (Page 3) Address 10 11 12 13 14 15 Contents 13 7 4 86 46 77 The symbol X stands for address 12 and (%R6) == 1, c) STR %R2, X, 6 indexed by register %R6. The effective address is X + (%R6), which is 12 + ( 1) or 12 1 = 11. EA = 11. NOTE: Do not add the contents of the address associated with X. This would be another addressing mode. d) STR %R2, *X, 6 pre-indexed indirect, indexed by %R6. The effective address is M[X + (%R6)]. Do the indexing first. X + (%R6) is 12 + ( 1) = 12 1 = 11. The effective address is M[11] = 7. EA = 7.