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

标签 assembly 68000

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

    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/

相关文章:

c - 防止 GCC 优化掉对内存映射地址的循环写入

c - 用于 getchar 的汇编内联 C,不带 echo

algorithm - 编辑我的 Easy68k(汇编)程序以减去而不是添加

assembly - 因此,在x86-64上它的字节序大吗?

c - 在 COM 程序中保存寄存器状态

assembly - Motorola 68000 的 vasm 无法将两个标签之间的距离分配给符号

palm-os - 如何分段我的 Palm OS 68K 应用程序?

assembly - 帮助 68k 汇编 - 跳转表?

c - 如何在 C 中封装非标准调用约定?

macos - 'call foo@plt' 的 OSX GNU 汇编程序问题