我正在尝试迭代一个数组并查找小于、等于和大于要存储的数字。我想将计数存储在三个结果中,如果可能的话显示结果
ORG $1000
START: ORG $2000 ; first instruction of program
LEA DATA,A0
MOVE.B #9,D0
CLR.B D1
CLR.B D2
CLR.B D3
LOOP: MOVE.B (A0)+,D4
CMP.B #50,D4
BGT GRT_50
BLT LESS_50
BEQ EQ2
LOOP
GRT_50: ADD.B #1,D3
BNE LOOP
LESS_50: ADD.B #1,D01
BNE LOOP
GRT_50: ADD.B #1,D2
BNE LOOP
STOP #2000
* Put variables and constants here
ORG $2000
DATA DC.B $55,$10,$20,$30,$40,$50,$60,$65,$70,$80
RESULT1 DC.B $0
RESULT2 DC.B $0
RESULT3 DC.B $0
END START ; last line of source
最佳答案
好吧,让我们看一下这里的一些错误:
- 一次只能有一个 ORG 语句。从 ORG $1000 或 ORG $2000 开始,但不能两者兼而有之。只需确保使用不会重叠的数据地址,以避免覆盖内容。
- 使用 DBRA D0,LOOP 循环(在本例中为 10 次)到 LOOP 标签。
- 使用 BRA LOOP 而不是 BNE LOOP,因为 BNE 是条件跳转。
- MOVE #9,D0 不带 .b 以便与 DBRA 正确使用,因为 DBRA 使用字大小的计数器。当您只写 .b 时,您无法确定该字的高 8 位是什么。
- 在 BEQ EQ2 处,您尝试跳转到标签 EQ2,但没有这样的标签。
- 没有D01寄存器,使用ADD #1,D1。正如已经提到的。
还有一些注释:
- 我会跳过“CLR.B”和“ADD.B”处的.b,因为它不必要地将计数变量从字大小缩小到字节大小。请注意,68k 可以使用字节、字和长尺寸,并且大多数时候默认为字尺寸。
- 当您在数据字段中使用十六进制数字时,我认为您希望将其与十六进制 50 (CMP #$50,D4) 而不是十进制 50 进行比较。
- 示例代码中的地址 $1100 和 $1110 是任意的。在 Easy68k 中,可以在内存窗口中很好地观察到它们。
其中许多内容已经在评论中阐述,但我试图在这里总结所有内容。
仍有改进的空间,但我可能会这样写:
ORG $1000
START:
LEA DATA,A0 ;set A0 to data address
MOVE #10-1,D0 ;setup for 10 iterations
LOOP:
MOVE.B (A0)+,D1 ;fetch byte
CMP.B #$50,D1 ;compare
BGT GRT_50 ;and branch conditionally
BLT LESS_50
BEQ EQUAL_50
CONT:
DBRA D0, LOOP ;come back here to loop
SIMHALT ;stop
GRT_50:
ADD #1, RESULT_G
BRA CONT
LESS_50:
ADD #1, RESULT_L
BRA CONT
EQUAL_50:
ADD #1, RESULT_E
BRA CONT
* data and vars
ORG $1100
DATA DC.B $55,$10,$20,$30,$40,$50,$60,$65,$70,$80
ORG $1110
RESULT_G DC.W $0
RESULT_L DC.W $0
RESULT_E DC.W $0
END Start
关于assembly - 尝试比较和计算大于、小于或等于某个值的数组元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71282952/