I’m “playing” with ARM assembly on a Raspberry Pi, reading various tutorials and posts to help – no, it’s not a college assignment, I’m too old for college! I’m pleased with getting the following code to take a decimal value (between 0 and 255) and output the binary string equivalent to the screen using scanf and printf but curious to know though whether those more experienced would consider this a “naive” solution? Are there any “gotchas”? Any better ways of tackling the problem?
I reckon there should be a better way of declaring the string to hold the output and how the string is built from the LSB (using R9)
/* dectobin2.s */ /* ------------------------------------------------------------ */ /* Converts a decimal number to binary and outputs to screen */ /* ============================================================ */ .data .balign 4 value: .word 0 binStr: .asciz "00000000" output: .asciz "%d in binary is %sn" title: .asciz "DECIMAL TO BINARY CONVERTERnn" lr_temp: .word 0 lr_local: .word 0 prompt: .asciz "Enter a positive value (0-255) > " pattern: .asciz "%d" .text @ function to convert given value into a binary string decToBin: @ save the link register ldr r2, =lr_local str lr, (r2) @ set data values mov r4, r0 @ value in r4 for processing mov r9, #7 @ LSB position in output string _loop: @ repeated division by 2 2 movs r4, r4, lsr #1 @ divide by 2, set carry bcs _odd @ if carry set, remainder is 1 _even: mov r5, #0 @ remainder of 0 b _toString _odd: mov r5, #1 @ remainder of 1 _toString: add r5, #48 @ convert remainder to ASCII ldr r1, =binStr @ address of binary string strb r5, (r1, r9) @ store remainder in string at pos in r9 sub r9, r9, #1 @ move to next position in output string cmp r4, #0 @ reached zero? ble _endloop b _loop _endloop: @ restore the link register ldr lr, =lr_local ldr lr, (lr) bx lr .global main main: @ store the link register ldr r1, =lr_temp str lr, (r1) @ print a title ldr r0, =title bl printf _getValue: @ get the value to convert ldr r0, =prompt @ prep the arguments for scanf bl printf ldr r0, =pattern ldr r1, =value bl scanf @ check for valid input (0-255) ldr r0, =value ldr r0, (r0) cmp r0, #255 @ must be <= 255 bgt _getValue cmp r0, #0 @ must be >= 0 blt _getValue _isValid: @ call the function, value is in R0 bl decToBin @ display output ldr r0, =output @ get address of output string ldr r1, =value @ get the original value ldr r1, (r1) @ for first parameter ldr r2, =binStr @ get the binary string bl printf @ print the result @ restore the link register and exit ldr lr, =lr_temp ldr lr, (lr) bx lr .global printf .global scanf ```