Exercises 15.5 Programming Exercise
1.
Modify the program in Listing 15.4.6 so that it allows the user to input values for the two structs.
Hint
Solution
Copy the main function from Listing 15.4.6 and get it to work. Then write the function getStruct that will get the values from the user and store them in a struct. I found it useful to create a getChar funtion here. When that is working, replace the display part with a putStruct function.
@ structPass3.s
@ Allocates two structs and gets values for user for
@ each struct, then displays the values.
@ 2017-09-29: Bob Plantz
@ Define my Raspberry Pi
.cpu cortex-a53
.fpu neon-fp-armv8
.syntax unified @ modern syntax
@ Constants for assembler
.include "theTagStruct.s" @ theTag struct defs.
.equ y,-36 @ y struct
.equ x,-24 @ x struct
.equ locals,24 @ space for the structs
@ Constant program data
.section .rodata
.align 2
displayX:
.asciz "x fields:\n"
displayY:
.asciz "y fields:\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, locals @ for the structs
@ fill the x struct
add r0, fp, x @ address of x struct
bl getStruct
@ fill the y struct
add r0, fp, y @ address of y struct
bl getStruct
@ display x struct
ldr r0, displayXaddr
bl writeStr
add r0, fp, x @ address of x struct
bl putStruct
bl newLine
@ display y struct
ldr r0, displayYaddr
bl writeStr
add r0, fp, y @ address of y struct
bl putStruct
bl newLine
mov r0, 0 @ return 0;
add sp, sp, locals @ 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
@ addresses of messages
displayXaddr:
.word displayX
displayYaddr:
.word displayY
@ getStruct.s
@ Gets values for a theTag struct from keyboard
@ Calling sequence:
@ r0 <- address of the struct
@ bl getStruct
@ Returns 0
@ 2017-09-29: Bob Plantz
@ Define my Raspberry Pi
.cpu cortex-a53
.fpu neon-fp-armv8
.syntax unified @ modern syntax
@ Constants for assembler
.include "theTagStruct.s" @ theTag struct defs.
@ Constant program data
.section .rodata
.align 2
charPrompt:
.asciz "Enter a character: "
intPrompt:
.asciz "Enter an integer: "
@ The program
.text
.align 2
.global getStruct
.type getStruct, %function
getStruct:
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
mov r4, r0 @ pointer to the struct
ldr r0, charPromptAddr
bl writeStr @ ask for a char
bl getChar @ get it
strb r0, [r4, aChar] @ aStruct->aChar = firstChar;
ldr r0, intPromptAddr
bl writeStr @ ask for a char
bl getDecInt @ get it
str r0, [r4, anInt] @ aStruct->anInt = aNumber;
ldr r0, charPromptAddr
bl writeStr @ ask for a char
bl getChar @ get it
strb r0, [r4, anotherChar] @ aStruct->anotherChar = secondChar;
mov r0, 0 @ return 0;
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
@ addresses of messages
charPromptAddr:
.word charPrompt
intPromptAddr:
.word intPrompt
@ putStruct.s
@ Displays values for a theTag struct on screen
@ Calling sequence:
@ r0 <- address of the struct
@ bl putStruct
@ Returns 0
@ 2017-09-29: Bob Plantz
@ Define my Raspberry Pi
.cpu cortex-a53
.fpu neon-fp-armv8
.syntax unified @ modern syntax
@ Constants for assembler
.include "theTagStruct.s" @ theTag struct defs.
@ Constant program data
.section .rodata
.align 2
dispAChar:
.asciz " aChar = "
dispAnInt:
.asciz " anInt = "
dispOtherChar:
.asciz " anotherChar = "
@ The program
.text
.align 2
.global putStruct
.type putStruct, %function
putStruct:
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
mov r4, r0 @ pointer to the struct
ldr r0, dispACharAddr @ display aChar
bl writeStr
ldrb r0, [r4, aChar]
bl putChar
bl newLine
ldr r0, dispAnIntAddr @ display anInt
bl writeStr
ldr r0, [r4, anInt]
bl putDecInt
bl newLine
ldr r0, dispOtherCharAddr @ display anotherChar
bl writeStr
ldrb r0, [r4, anotherChar]
bl putChar
bl newLine
mov r0, 0 @ return 0;
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
@ addresses of messages
dispACharAddr:
.word dispAChar
dispAnIntAddr:
.word dispAnInt
dispOtherCharAddr:
.word dispOtherChar
@ getChar.s
@ Gets one char from keyboard.
@ Calling sequence:
@ bl getChar
@ returns char in low byte of r0
@ 2017-09-29: Bob Plantz
@ Define my Raspberry Pi
.cpu cortex-a53
.fpu neon-fp-armv8
.syntax unified @ modern syntax
@ Constants for assembler
.equ maxChars,2 @ max input chars
.equ inputChar,-12 @ for input chars
.equ locals,8 @ space for local vars
@ The program
.text
.align 2
.global getChar
.type getChar, %function
getChar:
sub sp, sp, 8 @ space for fp, lr
str fp, [sp, 0] @ save fp
str lr, [sp, 4] @ and lr
add fp, sp, 4 @ set our frame pointer
sub sp, sp, locals @ for the string
add r0, fp, inputChar @ place to store input
mov r1, maxChars @ limit input length
bl readLn
ldrb r0, [fp, inputChar] @ return inputChar
add sp, sp, locals @ deallocate local var
ldr fp, [sp, 0] @ restore caller fp
ldr lr, [sp, 4] @ lr
add sp, sp, 8 @ and sp
bx lr @ return
