Программа на языке ассемблера LC3

Как вы преобразуете любой введенный пользователем символ в соответствующее десятичное значение? У меня просто были проблемы с запуском.

Программа должна была достичь следующих целей:

  1. Программа принимает символы с клавиатуры.

  2. Если символ представляет собой цифру (от «0» до «9»): a) Преобразуйте символ в соответствующее десятичное значение. Другими словами, «0» становится нулем, «1» становится 1, ... «9» становится 9. Назовем это значение R (от «длина серии»). б) Дождитесь другого символа (используя GETC). c) Вывести на консоль R копий этого символа. ) г) Вернитесь к шагу 1.

  3. В противном случае, если используется символ Enter/Return (ASCII #10): напечатайте перевод строки (ASCII #10) на консоль и вернитесь к шагу 1.

  4. В противном случае, если символ другой, остановите программу.

person user3469170    schedule 27.03.2014    source источник


Ответы (2)


В поставленном вопросе немного неясно: ввод уже представляет собой десятичное значение.

Если вы действительно имеете в виду, как преобразовать ввод в двоичное представление, с которым вы можете, скажем, выполнять математические операции, то в основном вы вычитаете 48 (30 часов) из каждого символьного значения, чтобы преобразовать каждую цифру в числовое значение.

См. asciitable.com.

Если есть несколько входных цифр, вы перебираете их и умножаете накопитель на 10 для каждой итерации, кроме последней.

person 500 - Internal Server Error    schedule 27.03.2014
comment
Я отредактировал исходный вопрос. Дайте мне знать, если теперь это более ясно - person user3469170; 27.03.2014

Вы, видимо, спросили то же самое здесь: программа для языка ассемблера LC3

Это поможет в будущем, если вы опубликуете свой код.

Я не рассматривал этот тип проблемы как необходимый для преобразования, вместо этого я сделал некоторую проверку, чтобы увидеть, что это за число, и напечатал эквивалентную строку. Надеюсь, моя программа натолкнет вас на некоторые идеи:

.ORIG x3000 ; start at x3000 above system memory
LEA R0, CLASS   ; load address of string CLASS in R0
PUTS        ; use PUTS to output string to console
LEA R0, MYNAME  ; repeat steps for class template
PUTS
LEA R0, PRNUM
PUTS
LEA R0, NWLINE
PUTS

; now get a character from the user and echo it back
; using the prompts INPROM and OUTPROM
ASKINP  LEA R0, INPPROM
    PUTS
    GETC        ; get a character from the keyboard
    ADD R2,R0,#0    ; move the value in R0 to R2 for later comparisons

; PROCESS THE INPUT
; first figure out if they entered a non-printing character with ASCII code
; <32. If so, suppress the printing of the character and give the user the
; standard error that they have not entered a number. We do this by subtracting
; 33 from the input and if the CC is negative, it's a non-printing character. 
; For purposes of this program a space is considered a non-printing character.
    ADD R2, R2, #-15
    ADD R2, R2, #-15
    ADD R2, R2, #-3 ; subtracted 33, see if it's negative
    BRn XERR    ; if so branch to error message

; if we're still here, then it's a printable character and we continue here...
    OUT     ; echo the character back on the input line
    LEA R0, SPACE   ; need a space after the input
    PUTS
    AND R0, R0, #0  ; set the condition to zero again

; figure out what character the user entered, and we have already subtracted 33 from
; the entry. See if it's a ! and the user wants to end. If so, the CC
; will be Zero and we break to XDONE.
; if that's not it, subtract another 15 (for a total subtracted of 48) and 
; successively test to see if it's a number match. If there is no match, 
; then print out that the user has not made a correct entry

; now we subtracted 33 so if they entered ! we now have 0 in R2, subtract 0
; and test the CC to see if it's Zero.
    ADD R1, R2, #0
    BRz XDONE
; if we have not just branched, subtract another 15 and keep testing
    ADD R2, R2, #-15
    ADD R1, R2, #-9
    BRz XNINE
    ADD R1, R2, #-8
    BRz XEIGHT
    ADD R1, R2, #-7
    BRz XSEVEN
    ADD R1, R2, #-6
    BRz XSIX
    ADD R1, R2, #-5
    BRz XFIVE
    ADD R1, R2, #-4
    BRz XFOUR
    ADD R1, R2, #-3
    BRz XTHREE
    ADD R1, R2, #-2
    BRz XTWO
    ADD R1, R2, #-1
    BRz XONE
    ADD R1, R2, #0
    BRz XZERO
; not a quit signal or number, need to print out an error and start again
    BRnzp XERR

; here is the section that prints out the string related to the 
; number that was entered, by loading the string into R0 and
; using PUTS to print it out, then BReak back to the beginning
; of the input sequence and ask again. Pre-condition is that the
; user typed in a number for 0-9, if not they will get an error
; elsewhere in the program
XZERO   LEA R0, ZERO
    PUTS
    LEA R0, NWLINE
    PUTS
    BRnzp   ASKINP  
XONE    LEA R0, ONE
    PUTS
    LEA R0, NWLINE
    PUTS
    BRnzp   ASKINP
XTWO    LEA R0, TWO
    PUTS
    LEA R0, NWLINE
    PUTS
    BRnzp   ASKINP
XTHREE  LEA R0, THREE
    PUTS
    LEA R0, NWLINE
    PUTS
    BRnzp   ASKINP
XFOUR   LEA R0, FOUR
    PUTS
    LEA R0, NWLINE
    PUTS
    BRnzp   ASKINP
XFIVE   LEA R0, FIVE
    PUTS
    LEA R0, NWLINE
    PUTS
    BRnzp   ASKINP
XSIX    LEA R0, SIX
    PUTS
    LEA R0, NWLINE
    PUTS
    BRnzp   ASKINP
XSEVEN  LEA R0, SEVEN
    PUTS
    LEA R0, NWLINE
    PUTS    
    BRnzp   ASKINP
XEIGHT  LEA R0, EIGHT
    PUTS
    LEA R0, NWLINE
    PUTS
    BRnzp   ASKINP
XNINE   LEA R0, NINE
    PUTS
    LEA R0, NWLINE
    PUTS
    BRnzp   ASKINP
XERR    LEA R0, INPERR
    PUTS
    LEA R0, NWLINE
    PUTS
    BRnzp   ASKINP
XDONE   LEA R0, DONE
    PUTS
    LEA R0, NWLINE
    PUTS
    HALT

; store the following strings with these labels
NWLINE  .STRINGZ    "\n"
SPACE   .STRINGZ    " "
CLASS   .STRINGZ    "CS2810\n"  
MYNAME  .STRINGZ    "James Lohse\n"
PRNUM   .STRINGZ    "Project 3\n"
BYEBYE  .STRINGZ    "Program execution terminated!\n"
INPPROM .STRINGZ    "Input a number 0-9: "
INPERR  .STRINGZ    "Error! You did not input a number."
DONE    .STRINGZ    "Done!"
ZERO    .STRINGZ    "zero"
ONE .STRINGZ    "one"
TWO .STRINGZ    "two"
THREE   .STRINGZ    "three"
FOUR    .STRINGZ    "four"
FIVE    .STRINGZ    "five"
SIX .STRINGZ    "six"
SEVEN   .STRINGZ    "seven"
EIGHT   .STRINGZ    "eight"
NINE    .STRINGZ    "nine "
    .END
person JimLohse    schedule 05.12.2014
comment
И я уверен, что мог бы сделать это намного элегантнее с циклом, который проверяет значение, а не с необработанными операторами. - person JimLohse; 05.12.2014
comment
Вы можете взглянуть на это? superuser.com/questions/904324/ - person committedandroider; 21.04.2015
comment
Да, последовательность сравнения и ветвления для каждого однозначного числа безумна ›.‹ Если вам нужны текстовые имена на английском языке, создайте таблицу указателей на строки, которые вы индексируете. (Или дополните свои строки до фиксированной длины и вычислите смещение для этого, чтобы получить адрес строки, заканчивающейся 0.) - person Peter Cordes; 03.05.2019