我需要在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
1条答案
按热度按时间vfhzx4xs1#
“立即字段超出范围:期望值适合5位(即,在-16和15之间,包括-16和15),但发现-100”。
当立即数不适合指令时,您可以将立即数构建到另一个寄存器中,并使用违规指令的非立即数形式。
例如,要加载值64,您可以加载31,然后将其添加到自身以完成62,然后再添加2:
这两种形式中的任何一种都将立即数放入寄存器中,以与另一条指令一起用作寄存器操作数。
所以,你可以使用
LD R5, M100; ADD R4, R4, R5
来代替ADDI R4, R4, #-100
,其中M100
是一个用数据字-100声明的数据标签:M100 .FILL #-100
。显然,这种方法需要一个短时间的备用寄存器(这里是R5
,但请选择一个暂时空闲的寄存器)。