4

これは、ASMでの私の単純な「Helloworld」プログラムです。

.global _start
    _start:         
        adr r1, hello
        b test
    loop:   ldr r12, =0x16000000
        str r0, [r12]

    test:   ldrb r0, [r1], #1
        cmp r0,#0
        bne loop
        @b loop
hello: .asciz "Hello world.\n\r"

コメントアウトした後はb loop、「ハローワールド」を1つだけ印刷することを期待しています。b loopしかし実際には、コマンドがまだそこにあったように、それは停止しません。なんで?

4

1 に答える 1

4

bneは条件付き分岐であり、等しくない場合は分岐し、基本的にゼロフラグがクリアされている場合は分岐します。分岐しない場合は実行を継続します。ヌル終了を見つけたら、ループに分岐せず、代わりに「地獄」を構成するバイトを命令として実行します。これを試して:

.global _start
    _start:         
        adr r1, hello
        b test
    loop:   ldr r12, =0x16000000
        str r0, [r12]

    test:   ldrb r0, [r1], #1
        cmp r0,#0
        bne loop
    forever: b forever
hello: .asciz "Hello world.\n\r"

bneの後に実行する何か、データ以外の何かを腕に与えます。データ文字列を1回ウォークスルーしてから、無限ループに陥る必要があります。

于 2012-05-26T06:09:43.137 に答える