//---------------------------------------------------------------- // textline.s (A solution to Question V on Midterm II) // // This program prompts the user to type in a line of text, // and when the user has finished doing that, it will print // each character that was typed on a separate screen line. // // assemble using: $ as textline.s -o textline.o // and link using: $ ld textline.o -o textline // // programmer: ALLAN CRUSE // written on: 04 APR 2006 //---------------------------------------------------------------- # manifest constants .equ STDIN, 0 # device-ID for keyboard .equ STDOUT, 1 # device-ID for display .equ sys_exit, 1 # service-ID for 'exit' .equ sys_read, 3 # service-ID for 'read' .equ sys_write, 4 # service-ID for 'write' .section .data prompt: .ascii "\nPlease type in a short sentence:\n" eoln: .ascii "\n" # final newline ascii code len: .int . - prompt # length of prompt message .section .bss buffer: .space 128 # buffer for input sentence .section .text _start: # show prompt mov $sys_write, %eax # service ID-number mov $STDOUT, %ebx # device ID-number lea prompt, %ecx # address of message mov len, %edx # length of message int $0x80 # enter Linux kernel # accept input mov $sys_read, %eax # service ID-number mov $STDIN, %ebx # device ID-number lea buffer, %ecx # address of buffer mov $128, %edx # length of buffer int $0x80 # enter Linux kernel mov %eax, len # store input length # print results xor %esi, %esi # initial array-index again: # output a 'newline' command mov $sys_write, %eax # service ID-number mov $STDOUT, %ebx # device ID-number lea eoln, %ecx # address of message mov $1, %edx # lengt\h of message int $0x80 # enter Linux kernel # check condition for loop-exit cmp %esi, len # final character? je finis # yes, skip to finish # output a single sentence-character mov $sys_write, %eax # service ID-number mov $STDOUT, %ebx # device ID-n umber lea buffer(%esi), %ecx # address of message mov $1, %edx # length of message int $0x80 # enter Linux kernel # update array-index for next character inc %esi # advance array-index jmp again # and go back for more finis: # quit program mov $sys_exit, %eax # service ID-number mov $0, %ebx # value for exit-code int $0x80 # enter Linux kernel .global _start # make entry-point visible .end # nothing more to assemble