I'm stuck on converting hex or decimal to 16-bit binary,and I don't know how to start. Here is the tasks I need to do:

Decimal Conversion Task: Add code that displays the value in R3 to the console as a binary string. It should convert R3 one bit at a time, to ASCII. The displayed format should be exactly of the form: Answer: 0000000000000000

• Your code should be placed in the file where it says “Put your code for part 3 here.”

• On entry to your code, R3 will contain the value to output to the console.

• At the end of your code, it must unconditionally branch to a label called “ReadString”.

Hint: You can check if the leftmost bit of a number is one, by checking if it is negative. To shift all of the bits one position to the left, multiply the number by two.

Hex Conversion: Add code that parses a hexadecimal string and converts it to a 16 bit two’s compliment number. Assume that all of the numbers will fit in 16 bits.

• Your code should be placed in the file where it says “Put your code for part 4 here.”

• On entry to your code, R1 will be -1 if the final result should be negated, otherwise it will be 0 R2 will contain the address of a null terminated string containing the digits to parse

• On exit from your code, R3 must contain the converted number, unless there was an invalid string.

• The code should branch to “PrintResult” after it is done, unless it encounters an invalid string, in which case it should branch to “ParseError”.

Hint: xABCD = (((xA · 16 + xB) · 16 + xC) · 16 + xD, also 16x = 2 · (2 · (2 · (2 · x)))

Here is my program:

``````.ORIG x3000

LEA     R0, Prompt
PUTS                    ; Display a prompt requesting input
LD      R1, BuffLen     ; Set R1 to length of input buffer
LEA     R2, BuffPtr     ; Set R2 to address of input buffer in memory
BRnzp   ReadCore        ; Goto the core input code
BuffPtr .BLKW 10                 ; The memory reserved for the input buffer
Prompt  .STRINGZ "Enter a number: " ; The prompt string
BuffLen .FILL 10                 ; The length of the input buffer

;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BRz Full
GETC
OUT
BRz Full
LD R3,lowerCase
BRn Store
LD R3, UpperCase

Store
STR R0,R2,#0
Full
AND R0,R0,#0
STR  R0,R2,#0
BRnzp ProcessInput
lowerCase .FILL x-61
UpperCase .FILL x-20

;;; Your code from part 1 here ends here.
;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

ProcessInput
LEA     R2, BuffPtr     ; Set R2 to address of buffer in memory
BRnzp   ProcessInputCore

;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Insert your code for ProcessInputCore from part 2 here.
ProcessInputCore
AND R1,R1,#0
LD R4,Sign
LDR R5,R2,#0
BRnp NotN
NotN
LD R6,pound
LDR R5,R2,#0
BRnp ParseH
BRnzp ParseDecimal

ParseH
LDR R5,R2,#0
LD R6,ex
BRnp Skip
Skip    BRnzp ParseHex

pound .FILL #-35
ex    .FILL #-120
Sign .FILL #-45

;;; Your code from part 2 here ends here.
;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

ParseDecimal
LD      R5, NegZERO
LD      R6, NegNINE
AND     R3, R3, #0      ; Set R3 to 0
DecimalLoop
LDR     R4, R2, #0      ; Put next digit into R4
BRz     DoneParsingDecimal  ; If it is the null terminator, done parsing

;; Confirm that it is a valid digit
ADD     R0, R4, R5      ; Compare to "0"
BRn     ParseError      ; If less than "0", not a digit
ADD     R0, R4, R6      ; Compare to "9"
BRp     ParseError      ; If greater than "9", not a digit

;; Multiply R3 by 10
ADD     R7, R3, R3      ; R7 = 2*R3
ADD     R3, R7, R7      ; R3 = 4*R3
ADD     R3, R3, R3      ; R3 = 8*R3
ADD     R3, R3, R7      ; R3 = 8*R3 + 2*R3 = 10*R3

;; Add new digit to R3
ADD     R4, R4, R5      ; Make binary
ADD     R2, R2, #1      ; Increment memory pointer
BRnzp   DecimalLoop

DoneParsingDecimal
;; Check if we need to negate the result for the minus sign
ADD     R1, R1, #0       ; If R1 is not -1, skip negation of R3
BRzp    NotNegativeDecimal
NOT     R3, R3
ADD     R3, R3, #1      ; Negate R3
NotNegativeDecimal
BRnzp   PrintResult

NegZero .FILL   -48             ; Negative ASCII "0"
NegNine .FILL   -57             ; Negative ASCII "9"

;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Write your code for hex conversion here.

ParseHex
BRnzp   PrintResult

;;; Your code for hex conversion ends here.
;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

ParseError
LEA     R0, ErrorStr
PUTS                    ; Output the error string
ErrorStr
.STRINGZ "Invalid number format.\n"

;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Write your code for decimal conversion here.

;;; Your code for decimal conversion ends here.
;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

.END``````

This may be your assignment for those that want to see it well formatted:
http://www.ele.uri.edu/faculty/sendag/ele208/labs/lab06/lab6b.pdf

While I've written a lot of assembler over the years, it appears this is something other than a real microprocessor as I read https://en.wikipedia.org/wiki/LC-3

As such you might not find a lot of folk that code in this variant. Maybe that's a good thing as the more you code in Assembler the more you learn how different it can be from micro to micro.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.