2016-03-24 20 views
-1

私はARMアセンブリ(Raspberry pi)のプログラムで作業していますが、問題があります。ARMアセンブリ - CMP間違った出力

私はこのコードを持っていますが、下の部分は常に実行しています(スキップ$)。

mov r1, #3 
mov r3, #4 
add r2, r1, r3 
bl Debug 
cmp r2, #0x0A 
ble skip$ 
    mov r0, #10 
    sub r0, r0, r1 
    mov r3, r0 

    bl Debug 
skip$: 

何が欠けていますか?

デバッグ機能は、r0-r4を使ってUARTをPCに送信するだけです。私はこれを実行すると

は、最後に、r3は

ローレンスWuyts

編集事前にまだ4

おかげでなければなりません7.次のとおりです。ここで 使用される他の機能があります。

Debug: 
push {r0 - r4, lr} 
    mov r4, r0 

    mov r0, #10 
    bl UART_write 
    mov r0, r4 
    bl UART_write 

    mov r0, #11 
    bl UART_write 
    mov r0, r1 
    bl UART_write 

    mov r0, #12 
    bl UART_write 
    mov r0, r2 
    bl UART_write 

    mov r0, #13 
    bl UART_write 
    mov r0, r3 
    bl UART_write 
pop {r0 - r4, pc} 

UART_write: 
    push {r0 - r2, lr} 
    ldr r1, =UART0_FR 

    wait_write$: 
     ldr r2, [r1] 
     tst r2, #0x20 
    bne wait_write$ 

    ldr r1, =UART0_DR 
    and r0, #0x000000ff 
    str r0, [r1] 

    pop {r0 - r2, pc} 

第二編集: 私は、スタックポインタのセットアップにこのコードを使用しました。

setup_stack: 
    mov  r0, #0xD1  @ FIQ 
    msr  cpsr, r0 
    ldr  sp, =stack_fiq 
    mov  r0, #0xD2  @ IRQ 
    msr  cpsr, r0 
    ldr  sp, =stack_irq 
    mov  r0, #0xD7  @ ABT 
    msr  cpsr, r0 
    ldr  sp, =stack_abt 
    mov  r0, #0xDB  @ UND 
    msr  cpsr, r0 
    ldr  sp, =stack_und 
    mov  r0, #0xDF  @ SYS 
    msr  cpsr, r0 
    ldr  sp, =stack_sys 
    mov  r0, #0xD3  @ SVC 
    msr  cpsr, r0 
    ldr  sp, =stack_svc 
    mov  pc, lr 

そして、これが私のリンカーである:

.= ALIGN(0x1000); 

/* Stack space */ 
. = . + 0x800; 
stack_svc = .; 
. = . + 0x800; 
stack_und = .; 
. = . + 0x800; 
stack_abt = .; 
. = . + 0x800; 
stack_irq = .; 
. = . + 0x800; 
stack_fiq = .; 
. = . + 0x400000; 
stack_sys = .; 
+1

それで 'Debug'はそれが使用するすべてのレジスタを保存して復元しますか? – Notlikethat

+0

@Notlikethatはい、私は使用されたすべてのレジスタにプッシュとポップを使用しました。 –

+0

blデバッグ行をコメントアウトすると失敗しますか? –

答えて

1

この質問の問題(および回答)が見つかりました。

問題は、ldrを使用して1バイトを読み込んでいたため、出力ワードの先頭24ビットにガベージがあることでした。

ldrの代わりに、ldrb(ロードバイト)を使用してください。

UART0_write関数はレジスタの最下位バイトのみを送信するので、正しく見えます。

ローレン

1

だから私はこれをテストするには、この機能を作成しました。

.globl TEST 
TEST: 
    mov r1, #3 
    mov r3, #4 
    add r2, r1, r3 
    cmp r2, #0x0A 
    ble skip 
     mov r0,#0x30 
     bx lr 
skip: 
    mov r0,#0x31 
    bx lr 

そして結果(r0)をuartに送信します。 0x31を外に出すと(数字1)、7が10未満になります。

これはラズベリーpi A +にあります。

同じコードを使用すると何が得られますか?

+0

私は期待どおり0x31を取得します。私はラズベリーパイゼロを使用しています。 –

+1

ここで明らかな違いの1つは、このコードがスタックアクセスを行っていないことです。 @LaurensあなたのSPは_is_どこかに正気で書き込み可能であると指摘していますか? – Notlikethat

+0

良い点、私はそれを見ていない!詳細については私のトップポストを参照してください。 –