ARM程序集,比较签名值

时间:2012-04-17 16:07:58

标签: assembly arm arm7

我有一个非常简单的问题,但它让我爬上墙,你能帮我吗?

这是一个问题:如何在ARM汇编中比较两个带符号的字节值?这就是我试过的:

ldrsb r1, [r0], #1
ldrsb r2, [r0]
cmp r1, r2

r0加载了一个字节值列表的地址,如10,-1,123。加载负数时,ldrsb不应该延伸sig吗?我迷路了

修改

我们应该编写一个程序,对一组有符号字节值进行排序(使用bubblesort)。我可以弄清楚如何做到这一点,只是我不理解实际比较(或其结果)。到目前为止,这是我的代码:

.global main

.section .data
  myNumbers: .byte 183, 374, -113, -1, 10, 101, -3, -54, 9, 7
  myNumbersEnd:

.section .text
  main:

  loop:
    mov r4, #0
    ldr r0, =myNumbers
    ldr r3, =myNumbersEnd

inner_loop:
    ldrsb r1, [r0], #1  
    ldrsb r2, [r0]  
    cmp r1, r2

    strgtb r1, [r0]
    strgtb r2, [r0, #-1]
    movgt r4, #1 @ r4 = swapped = true

    cmp r0, r3
    bne inner_loop

    cmp r4, #1
    beq loop @ keep going
exit:
    b exit
.end

也许我应该补充一点,我不是在实际的ARM硬件上运行此代码,而是在ARMSim#上运行,这是ARM7TDMI处理器的模拟器:http://armsim.cs.uvic.ca/index.html

2 个答案:

答案 0 :(得分:3)

好的,我会尝试打破它。

  1. r4包含“我们交换了什么吗?”
  2. r0r3包含输入数据的开头和结尾

    loop:
      mov r4, #0
      ldr r0, =myNumbers
      ldr r3, =myNumbersEnd
    
  3. 使用r1指向的字节加载和转发r0,将r0更新为r0+1

  4. 同时从更新的r2
  5. 加载和转发r0
  6. 比较两个值,这基本上是r1-r2,具体取决于结果标志的更新。

    inner_loop:
        ldrsb r1, [r0], #1  
        ldrsb r2, [r0]  
        cmp r1, r2
    
  7. 如果r1大于r2,则以交换顺序存储值

  8. 同时设置交换标志(r4)

        strgtb r1, [r0]
        strgtb r2, [r0, #-1]
        movgt r4, #1 @ r4 = swapped = true
    
  9. r0中的当前指针与r3

    中的结束指针进行比较
  10. 除非它们相等,否则执行下一个字节

        cmp r0, r3
        bne inner_loop
    
  11. 检查我们是否换了任何东西,如果我们做了就重新开始。

        cmp r4, #1
        beq loop @ keep going
    
  12. 这里的关键点是比较。如前所述,cmp执行op1-op2抛出结果,但根据结果设置标志,这些标志是: N = tempresult [31](表示MSB已设置,对于有符号值,表示结果已签名。 Z = tempresult == 0(当两个值相等时将为1) C = tempresult [31]!= op1 [31](用于无符号比较,表示op1< op2) V = op1 [31]!= op2 [31]&& op1 [31]!= tempresult [31](像携带有符号值的东西)

    接下来你的strgtb首先使用标志来查看它是否真的需要执行,条件为gt,转换为:

    Z == 0 && N == V
    

    如果条件为真,则执行该指令,对于接下来的两条指令也是如此。

    仅供参考,您的数据集包含无效数据

      myNumbers: .byte 183, 374, -113, -1, 10, 101, -3, -54, 9, 7
    

    183和374可能会引起混淆。有效的SIGNED 8位值介于-128和127之间。您的代码将183评估为有符号值。

答案 1 :(得分:1)

是的,ldrsb符号扩展正在加载的字节。你遇到的实际问题是什么?什么对你所尝试的不起作用?