Exercises 12.4 Programming Exercise
1.
The programs in this Section that read one character from the user showed some odd behavior. When the program ended, there was an extra prompt line in the terminal window. Choose one of the programs and fix it so that no longer occurs.
Hint
Solution
How many characters did you really enter from the keyboard when the program prompted you to enter one? Remember that the ‘enter’ key counts as a character.
@ range3.s
@ Checks if user entered a numeral
@ 2017-09-29: Bob Plantz
@ Define my Raspberry Pi
.cpu cortex-a53
.fpu neon-fp-armv8
.syntax unified @ modern syntax
@ Useful source code constants
.equ STDOUT,1
.equ STDIN,0
.equ NUL,0
.equ response,-20
.equ local,8
@ Constant program data
.section .rodata
.align 2
prompt:
.asciz "Enter a single character: "
.align 2
numeral:
.asciz "You entered a numeral.\n"
.align 2
other:
.asciz "You entered a non-numeric character.\n"
@ The program
.text
.align 2
.global main
.type main, %function
main:
sub sp, sp, 16 @ space for saving regs
@ (keeping 8-byte sp align)
str r4, [sp, 4] @ save r4
str fp, [sp, 8] @ fp
str lr, [sp, 12] @ lr
add fp, sp, 12 @ set our frame pointer
sub sp, sp, local @ local variable
ldr r4, promptAddr @ prompt user
promptLoop:
ldrb r3, [r4] @ get a char
cmp r3, NUL @ end of string?
beq getResponse @ yes, get response
mov r0, STDOUT @ no, write to screen
mov r1, r4 @ address of current char
mov r2, 1 @ write 1 byte
bl write
add r4, r4, 1 @ increment pointer var
b promptLoop @ back to top
getResponse:
mov r0, STDIN @ from keyboard
add r1, fp, response @ address of response
mov r2, 2 @ one char plus enter key
bl read
ldrb r3, [fp, response] @ load response
cmp r3, '9 @ check high end
bhi notNumeral @ >'9', other char
cmp r3, '0 @ check low end
blo notNumeral @ <'0', other char
ldr r4, numeralAddr @ "You entered a numeral."
numLoop:
ldrb r3, [r4] @ get a char
cmp r3, NUL @ end of string?
beq endThen @ yes, end of then block
mov r0, STDOUT @ no, write to screen
mov r1, r4 @ address of current char
mov r2, 1 @ write 1 byte
bl write
add r4, r4, 1 @ increment pointer var
b numLoop @ back to top
endThen:
b endElse @ branch over else block
notNumeral:
ldr r4, otherAddr @ "You entered some other character."
notNumLoop:
ldrb r3, [r4] @ get a char
cmp r3, NUL @ end of string?
beq endElse @ yes, end of if-else
mov r0, STDOUT @ no, write to screen
mov r1, r4 @ address of current char
mov r2, 1 @ write 1 byte
bl write
add r4, r4, 1 @ increment pointer var
b notNumLoop @ back to top
endElse:
mov r0, 0 @ return 0;
add sp, sp, local @ deallocate local var
ldr r4, [sp, 4] @ restore r4
ldr fp, [sp, 8] @ fp
ldr lr, [sp, 12] @ lr
add sp, sp, 16 @ sp
bx lr @ return
.align 2
promptAddr:
.word prompt
numeralAddr:
.word numeral
otherAddr:
.word other
