assembly 尝试比较和计数大于、小于或等于某个值的数组元素

laik7k3q  于 2023-03-08  发布在  其他
关注(0)|答案(1)|浏览(108)

我正在尝试迭代一个数组,并查找要存储的小于、等于和大于的数字。我希望将计数存储在三个结果中,并在可能的情况下显示结果

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
oymdgrw7

oymdgrw71#

好吧,让我们来看看这里的一些错误:

  • 一次只能使用一个ORG语句。从ORG $1000或ORG $2000开始,但不能同时从两者开始。只需确保使用不会重叠的数据地址,以避免覆盖内容。
  • 使用DBRA D0,LOOP循环(在本例中为10次)到LOOP标签。
  • 使用BRA LOOP代替BNE LOOP,因为BNE是条件跳转。
  • 移动#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

相关问题