1

私は非常に単純な問題を抱えていますが、それが私を壁に押し上げています。助けていただけますか?

質問は次のとおりです。ARM アセンブリで 2 つの符号付きバイト値を比較するにはどうすればよいですか? これは私が試したものです:

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

r0 には、10、-1、123 などのバイト値のリストのアドレスがロードされます。迷っています

編集:

さて、符号付きバイト値のリストを (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 ハードウェアではなく、ARM7TDMI プロセッサのシミュレータである ARMSim# で実行していることを付け加えておく必要があるかもしれません: http://armsim.cs.uvic.ca/index.html

4

1 に答える 1

3

わかりました、それを分解してみます。

  1. r4「何か交換しましたか?」が含まれています
  2. r0r3入力データの開始と終了を含む

    loop:
      mov r4, #0
      ldr r0, =myNumbers
      ldr r3, =myNumbersEnd
    
  3. r1が指すバイトをロードして符号拡張しr0、 に更新r0します。r0+1

  4. r2また、更新されたものからロードして符号拡張しますr0
  5. 両方の値を比較します。これは基本的r1-r2に結果フラグが更新されるかどうかに依存します。

    inner_loop:
        ldrsb r1, [r0], #1  
        ldrsb r2, [r0]  
        cmp r1, r2
    
  6. r1 が r2 より大きい場合は、値を入れ替えた順序で格納します

  7. スワップフラグも設定 (r4)

        strgtb r1, [r0]
        strgtb r2, [r0, #-1]
        movgt r4, #1 @ r4 = swapped = true
    
  8. r0の現在のポインターをエンド ポインターと比較します。r3

  9. それらが等しい場合を除き、次のバイトを実行します

        cmp r0, r3
        bne inner_loop
    
  10. 何かを交換したかどうかを確認し、交換した場合は最初からやり直してください。

        cmp r4, #1
        beq loop @ keep going
    

ここで重要なのは比較です。すでに述べたように、cmp は op1-op2 を実行して結果を破棄しますが、結果に応じてフラグを設定します。これらのフラグは次のとおりです。 . 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

条件が真の場合、次の 2 つの命令についても同様に、命令が実行されます。

参考までに、データセットには無効なデータが含まれています

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

183 と 374 は混乱を招く可能性があります。有効な SIGNED 8 ビット値は -128 ~ 127 です。コードは 183 を符号付き値として評価します。

于 2012-04-17T19:46:40.963 に答える