Exercises 14.4 Programming Exercises
1.
Show that the main function in Listing 14.3.1 works with the assembly language hexToInt function in Listing 14.3.5
You will need to copy the assembly language code for hexToInt into a file and then assemble it with:
as --gstabs -o hexToInt2.o hexToInt2.s
Then use gcc to link the object files with the file containing the main function:
gcc -g -o hexConvert1 hexToInt2.o writeStr.o readLn.o hexConvert1.c
2.
Does the program in in Exercise 14.4.1 work correctly for both lowercase and uppercase alphabetic hex characters? Why or why not?
3.
Write an assembly language version of the main function in Listing 14.3.1. Use the assembly language versions of hexToInt, writeStr, and readLn in your program. You may use printf from the C Standard Library to display your result.
You do not need to include the stdio.h header file. This is used to tell the compiler what to do with the call to printf, but you will be writing the assembly language code to do this yourself.
@ hexConvert2.s
@ Prompts user for hex number and converts
@ it to an int.
@ 2017-09-29: Bob Plantz
@ Define my Raspberry Pi
.cpu cortex-a53
.fpu neon-fp-armv8
.syntax unified @ modern syntax
@ Constant for assembler
.equ maxChars,9 @ max input chars
.equ theString,-16 @ for input string
.equ locals,16 @ space for local vars
@ Constant program data
.section .rodata
.align 2
prompt:
.asciz "Enter up to 32-bit hex number: "
display:
.asciz "The integer is: %i\n"
@ The program
.text
.align 2
.global main
.type main, %function
main:
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 local vars
ldr r0, promptAddr @ prompt user
bl writeStr
add r0, fp, theString @ place for user input
mov r1, maxChars @ limit input size
bl readLn
add r0, fp, theString @ user input
bl hexToInt @ convert it
mov r1, r0 @ result returned in r0
ldr r0, displayAddr @ show user the result
bl printf @ from C Standard Lib.
mov r0, 0 @ return 0;
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
promptAddr:
.word prompt
displayAddr:
.word display
4.
Write a program in assembly language that asks the user to enter two hexadecimal numbers, each up to 32 bits, and displays their sum.
You will need to allocate a second place in memory for holding the second input text string.
@ addHex.s
@ Prompts user for two hex numbers and adds them
@ 2017-09-29: Bob Plantz
@ Define my Raspberry Pi
.cpu cortex-a53
.fpu neon-fp-armv8
.syntax unified @ modern syntax
@ Constant for assembler
.equ maxChars,9 @ max input chars
.equ inString1,-24 @ for 1st input string
.equ inString2,-36 @ for 2nd input string
.equ outString,-52 @ for output string
.equ locals,40 @ space for local vars
@ Constant program data
.section .rodata
.align 2
prompt:
.asciz "Enter up to 32-bit hex number: "
display:
.asciz "Their sum is: "
@ The program
.text
.align 2
.global main
.type main, %function
main:
sub sp, sp, 16 @ space for saving regs
str r4, [sp, 0] @ save r4
str r5, [sp, 4] @ r5
str fp, [sp, 8] @ fp
str lr, [sp, 12] @ lr
add fp, sp, 12 @ set our frame pointer
sub sp, sp, locals @ for local vars
ldr r0, promptAddr @ prompt user
bl writeStr
add r0, fp, inString1 @ 1st input
mov r1, maxChars @ limit input size
bl readLn
add r0, fp, inString1 @ user input
bl hexToInt @ convert it
mov r4, r0 @ 1st int
ldr r0, promptAddr @ prompt for 2nd
bl writeStr
add r0, fp, inString2 @ 2nd input
mov r1, maxChars @ limit input size
bl readLn
add r0, fp, inString2 @ user input
bl hexToInt @ convert it
mov r5, r0 @ 2nd int
add r1, r4, r5 @ add the two ints
add r0, fp, outString @ place for result
bl intToHex @ convert to hex string
ldr r0, displayAddr @ show user result
bl writeStr
add r0, fp, outString
bl writeStr
bl newLine @ looks nicer
mov r0, 0 @ return 0;
add sp, sp, locals @ deallocate local var
ldr r4, [sp, 0] @ restore r4
ldr r5, [sp, 4] @ r5
ldr fp, [sp, 8] @ fp
ldr lr, [sp, 12] @ lr
add sp, sp, 16 @ restore sp
bx lr @ return
promptAddr:
.word prompt
displayAddr:
.word display
