Computer Science 210Computer Organization Strings, I/O, and Trap Service Routines
Strings • Sequences of characters, represented internally as ASCII values • Basic ASCII is 8 bits, stored in lower order byte, with higher order byte clear • Can also store two characters per 16-bit word
;; Author: Ken Lambert ;; This program declares the string "Assembler is fun!" .ORIG x3000 ; Program code HALT ; Data variables MESSAGE .STRINGZ "Assembler is fun!" .END The STRINGZ directive puts a string’s ASCII values in consecutive memory cells, followed by a null character (ASCII 0)
;; Author: Ken Lambert ;; This program outputs the string "Assembler is fun!" ;; Pseudocode design: ; for ch in "Assembler is fun!" ; loop while display status >= 0 ; print ch .ORIG x3000 ;; Register usage: ; R1 = contents of display status register ; R0 = contents of display data register ; R2 = address of the next character in the string ; Main program code LEA R2, MESSAGE ; Get the base address of the string CHLOOP LDR R0, R2, #0 ; Get the next character from the string BRz ENDMAIN ; Quit when it's null (end of string) POLL LDI R1, DSR ; Poll for negative display status register BRzp POLL ; (ready bit = 1) STI R0, DDR ; Display is ready, so output the character ADD R2, R2, #1 ; Increment the character's address BR CHLOOP ENDMAIN HALT ; Main program data DSR .FILL xFE04 ; Address of the display status register DDR .FILL xFE06 ; Address of the display data register MESSAGE .STRINGZ "Assembler is fun!" .END String output with array-based loop and polling
;; Author: Ken Lambert ;; This program outputs the string "Assembler is fun!" ;; Pseudocode design: ; print "Assembler is fun!" ;; Register usage: ; R0 = base address of the string .ORIG x3000 ; Main program code LEA R0, MESSAGE ; Load the address of the string PUTS ; Call the trap service routine to output it HALT ; Main program data MESSAGE .STRINGZ "Assembler is fun!" .END String output with trap service routine PUTS Using the trap service routine reduces 8 lines of code to 2
LC-3 Trap Service Routines The first four routines work with data in R0
System Call • User program invokes system call. 2. Operating system code performs operation. 3. Returns control to user program. In LC-3, this is done through theTRAP mechanism.
LC-3 TRAP Mechanism 1. A set of service routines. • part of operating system -- routines start at arbitrary addresses(convention is that system code is below x3000) • up to 256 routines 2. Table of starting addresses. • stored at x0000 through x00FF in memory • called System Control Block in some architectures 3. TRAP instruction. • used by program to transfer control to operating system • 8-bit trap vector names one of the 256 service routines 4. A linkage back to the user program. • want execution to resume immediately after the TRAP instruction
TRAP Instruction • Trap vector • identifies which system call to invoke • 8-bit index into table of service routine addresses • in LC-3, this table is stored in memory at 0x0000 – 0x00FF • 8-bit trap vector is zero-extended into 16-bit memory address • Where to go • lookup starting address from table; place in PC • How to get back • save address of next instruction (current PC) in R7
Data Path for the TRAP NOTE: PC has already been incrementedduring instruction fetch stage.
RET (JMP R7) • How do we transfer control back toinstruction following the TRAP? • We saved old PC in R7. • JMP R7 gets us back to the user program at the right spot. • LC-3 assembly language lets us use RET (return)in place of “JMP R7”. • Must make sure that service routine does not change R7, or we won’t know where to return.
TRAP Mechanism Operation • Lookup starting address. • Transfer to service routine. • Return (JMP R7). Will form the basis for defining our own procedures
String Input • Usually terminated by a return character (ASCII 13) • Use GETC to input and OUT to echo • If not ASCII 13, store character in an array • Otherwise, quit the loop • Store a null character at the end of the characters in the array
;; Register usage: ; R0 = the input character ; R1 = the newline character ; R2 = base address of the array ; R3 = temporary working storage ; Main program code LEA R0, PROMPT ; Display the prompt PUTS LD R1, RT ; Initialize the return character LEA R2, ARRAY ; Get the base address of the array WHILE GETC ; Read and echo a character (stored in R0) OUT ADD R3, R0, R1 ; Quit if character = return BRz ENDWHILE STR R0, R2, #0 ; Store that character in the array ADD R2, R2, #1 ; Increment the address of the array cell BR WHILE ; Return to read another character ENDWHILE STR R3, R2, #0 ; Store the null character after the last input LEA R0, ARRAY ; Output the string PUTS HALT ; Main program data RT .FILL x-000D ; The return character (negated) PROMPT .STRINGZ "Enter your name: " ARRAY .BLKW 30 ; Array of 30 characters (including null) .END String input with sentinel-based loop Problem: input could overflow the array, but no data are declared below it.