【问题标题】:how to compare array element in assesmbly?如何比较汇编中的数组元素?
【发布时间】:2022-01-14 14:37:50
【问题描述】:

我是汇编语言的新手,我正在尝试使用以下代码进行二叉搜索树,但是粗体部分的逻辑似乎不正确...有什么解决办法吗?

  • 如何比较数组元素?
  • 如何在使用循环时比较数组中的元素?
  • 我的逻辑正确吗?
        AREA bsttest, CODE, READONLY
        ENTRY
        
Reset_Handler

    ADR r0,Arr ;r0 pointer to arr (array)
    ADR r1,smallest ;r1 pointer to smallest (array)
    ADR r2,greatest ;r2 pointer to greatest (array)
    
    MOV r3,#5 ;5 is the size of array
loop    
    LDRB r5,[r0],#1; load the first element into r5 and set this as root
    **LDRB r6,[r0,#1]** ; load the second element into r6 using pre-increment 
    
    
    CMP r6,r5 ; compare r6 and r5
    BGE storeatright ; if r6 is greater than r5 jump to the label
    
    ;if r6<r5
    **CMP r1,#0**; check if there's a value on the left hand side, if LHS=NULL,
    BGT jump; if it's not NULL, jump
    STRB r6,[r1],#1 ;save and store value at the LHS
jump
    STRB r5,[r1],#1 ;save and store value at the LHS
    
    ;if r6>r5
storeatright 
    
    **CMP r2,#0**; check if there's a value on the right hand side, if RHS=NULL,
    BGT jumps; if it's not NULL, jump
    STRB r6,[r2],#1 ;save and store value at the RHS
jumps
    STRB r5,[r2],#1 ;save and store value at the RHS
    SUBS r3,r3,#1 ; i-- for array
    BNE loop ; loop until array size=0

        
Arr DCB 2,1,4,3,5;array
smallest DCB 0,0,0,0,0 
greatest DCB 0,0,0,0,0

stop    B stop
        END```

【问题讨论】:

    标签: assembly arm


    【解决方案1】:

    第一次加载,ldrb r5,[r0],#1,加载第一个字节(从初始的r0),然后递增指针,所以r0 现在指向数组的第二个字节(即索引 1)。

    第二次加载,ldrb r6,[r0,#1],加载第三个字节,因为(1)指针已经递增,(2)使用偏移寻址方式,偏移量=1,所以从指针指向索引1,添加 1 使其引用索引 2,即第三个元素。


    就 null 的比较而言,这些都很好检查,但要么你的逻辑不好,要么术语不正确..

    CMP r1,#0**; check if there's a value on the left hand side, if LHS=NULL,
    BGT jump; if it's not NULL, jump
    STRB r6,[r1],#1 ;save and store value at the LHS
    

    我们不会使用 BGT 来检查 NULL,而是使用 BNE。因此,要么代码正在检查 >0 整数并且 cmets 错误,要么代码正在错误地检查 NULL 指针。

    如果 cmets 的意图是检查 NULL 是正确的,那么代码会继续使用该 NULL 指针写入内存,这会很糟糕。


    我没有看到这里涉及到树——只有几个数组。正因为如此,我会说 NULL 检查是错误的,应该删除 - 只需存储到数组中。由于您在存储后推进指针,因此无需进一步检查即可为下一个存储做好准备。


    我建议您从 C 版本开始。在 C 版本中进行所有指针优化,确保它确实有效。然后将您的指针优化、工作 C 版本转换为相当文字的程序集。

    不要从 C 中的数组版本开始,然后在翻译成汇编时尝试优化指针,除非你想沮丧。

    【讨论】:

    • 嗨,Erik,你认为你能给我看一个关于如何做到这一点的简单例子吗?我确实知道二叉搜索树的概念,但我真的不知道如何用汇编语言实现它,我只学习了它的基础知识而且我的 C 语言并不强,我对这个领域真的很陌生?
    • 将算法的概念与汇编语言分开。算法与语言无关,通常用伪代码编写,C 也很常见。因此,在 C 或伪代码中搜索树代码,并在您理解算法时留下汇编翻译。
    • 我们应该想了解汇编的内容是我们如何在汇编中进行高级语言构造,而不是如何在汇编中从头开始开发算法。因此,诸如函数、数组和数组引用、指针算术、if-then/else、for/while 循环等构造。
    • 如果您甚至在开始编写程序或选择编程语言之前就在纸上进行设计,那么您现在就开始像程序员一样思考了。知道你想让一个程序完成什么是一个比汇编语言更难的问题,所以不要让自己用汇编语言思考设计和算法。
    • 我明白了,我的方法是我先研究算法并将伪代码翻译成汇编(如上面的代码)但我被困在这里和那里
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多