0

マルチスレッド機能を実装するために、pthread を呼び出すこのアーム アセンブラ コードを作成しました。似たようなファイルを 2 つ書きましたが、これは非常に扱いにくいものです。

主な機能は次のとおりです。

main:
stmfd           sp!, {fp,lr}

add             fp, sp, #4
sub             sp, sp, #8

sub             r3, sp, #8
mov             r0, r3
mov             r1, #0
ldr             r2, .l_thrd1
mov             r3, #0
bl              pthread_create

ldr r3, [fp, #-8]
mov r0, r3
mov r1, #0
bl pthread_join
...

objdump を使用して、関連する逆アセンブル コードを表示します。

00405468 <pthread_join>:
  405468:       e5903068        ldr     r3, [r0, #104]  ; 0x68
  40546c:       e92d45f0        push    {r4, r5, r6, r7, r8, sl, lr}
  405470:       e3530000        cmp     r3, #0
  405474:       e24dd014        sub     sp, sp, #20
  405478:       e1a05000        mov     r5, r0
  40547c:       e1a06001        mov     r6, r1
  405480:       ba00004a        blt     4055b0 <pthread_join+0x148>
  405484:       e590321c        ldr     r3, [r0, #540]  ; 0x21c
  ....

セグメント エラーが発生していない限り、正常に見えます。qemu.log は、次のように乱雑に見えます。

----------------
IN: pthread_join
INST: isa=[0] opk=[JMP_OP] src={-,-,-,-} dst={-,-} shift={-,-,-} c=[1] s=[-] imm=[24,74] rotate_reg=[-] vfp={-,-,-,-} vfp_val={-,-,-,-} ### 
0x00405468:  e5903068      ### ldr  r3, [r0, #104]
0x0040546c:  e92d45f0      ### push     {r4, r5, r6, r7, r8, sl, lr}
0x00405470:  e3530000      ### cmp      r3, #0  ; 0x0
0x00405474:  e24dd014      ### sub      sp, sp, #20     ; 0x14
0x00405478:  e1a05000      ### mov      r5, r0
0x0040547c:  e1a06001      ### mov      r6, r1
0x00405480:  ba00004a      ### b.lt     0x4055b0

----------------
IN: pthread_join
INST: isa=[0] opk=[JMP_OP] src={-,-,-,-} dst={-,-} shift={-,-,-} c=[1] s=[-] imm=[24,74] rotate_reg=[-] vfp={-,-,-,-} vfp_val={-,-,-,-} ### 
0x00405468:  e5903068      ### ldr  r3, [r0, #104]
0x0040546c:  e92d45f0      ### push----------------
IN: start_thread
INST: isa=[0] opk=[JMP_OP] src={-,-,-,-} dst={-,-} shift={-,-,-} c=[0] s=[-] imm=[24,4148] rotate_reg=[-] vfp={-,-,-,-} vfp_val={-,-,-,-} ### 
0x00404274:  e7802003      ###    str{r4, r5      , r6, r7r2, ,r8,  sl[r0, , lrr3}]
0x00405470:  e3530000      ###
....

明らかに、pthread_join が 2 回入力されています。そして 2 回目には、'push' 命令が完全に実行されていないようです。レジスターも正常のようです。私はそれを理解していません。

別のコードが正しい順序で実行されます。それらはほぼ同じコードです。

4

1 に答える 1

0

誰もその質問に対する答えを持っていません。私は自分でそれに答えなければなりません。

この問題は、スタック ポインター (r13) が意図せずにメモリに保存され、別のスレッドによって変更されたため発生しました。そのため、r13 は別のメモリ アドレスを指しており、セグメント エラーが発生しました。

于 2013-09-18T16:06:37.553 に答える