assembly 如何使用用户输入来创建范围为0-100的8个数组?

bfrts1fy  于 2023-06-06  发布在  其他
关注(0)|答案(1)|浏览(197)

我需要在LC 3中做一个冒泡排序程序,它接受用户输入(8个数字,范围为0-100)并按升序排序。这是我目前为止所做的(要求用户输入),但我一直得到一个错误,说:;
“立即字段超出范围:期望值适合5位(即,在-16和15之间,包括-16和15),但发现-100”。
谁能帮我修一下?

.ORIG x3000
LEA R0, PROMPT ; Display prompt
PUTS
ADD R0, R0, #0 ; Array base address
ADD R1, R1, #8 ; Counter

GET_INPUT

GETC

OUT ;Echo the character
 ;Convert the character to a number
 LD R2, ASCII_ZERO ;ASCII '0' = 48
 NOT R2, R2
 ADD R2, R2, #1
ADD R3, R2, R0 ; Calculate array element 14 address
 LDR R4, R3, #0 ; Load existing value
 ADD R4, R4, R2; Add new digit

 ; Check if the number is within the range
 ADD R5, R4, #-100 ; Check if < -100
 BRN INVALID_INPUT
 ADD R5, R4, #100 ; Check if > 100
 BRZ INVALID_INPUT

STR R4, R3, #0 ; Store the new value

BR NZP, GET_INPUT ; Repeat until 28 numbers 26 are entered

 END_LOOP
 HALT

 INVALID_INPUT
 LEA R0, ERROR_MSG ; Display error message
 PUTS
 BR GET INPUT

 PROMPT .STRINGZ  "Enter a number (0-100):"
ERROR_MSG .STRINGZ "Invalid input! Please  enter a number between 0 and 100."
 ASCII_ZERO .FILL x0030

.END
vfhzx4xs

vfhzx4xs1#

“立即字段超出范围:期望值适合5位(即,在-16和15之间,包括-16和15),但发现-100”。
当立即数不适合指令时,您可以将立即数构建到另一个寄存器中,并使用违规指令的非立即数形式。

  • 您可以使用几个指令来构建立即数-使用这种方法,您可以构建任何大小的立即数,但它可能需要许多指令,具体取决于您想要的立即数的值。

例如,要加载值64,您可以加载31,然后将其添加到自身以完成62,然后再添加2:

ANDI R0, R0, #0    # clear R0
    ADDI R0, R0, #31
    ADD  R0, R0, R0    # R0=R0*2, so 62
    ADDI R0, R0, #2    # R0 = 62+2 = 64
  • 您可以从内存中加载具有立即值的字-使用这种方法,您可以加载全字长(16位)的立即值。
LD R0, P64
    ...
    ...
P64 .FILL #64

这两种形式中的任何一种都将立即数放入寄存器中,以与另一条指令一起用作寄存器操作数。
所以,你可以使用LD R5, M100; ADD R4, R4, R5来代替ADDI R4, R4, #-100,其中M100是一个用数据字-100声明的数据标签:M100 .FILL #-100。显然,这种方法需要一个短时间的备用寄存器(这里是R5,但请选择一个暂时空闲的寄存器)。

相关问题