1

誰かがこのプログラムが何をしているのか説明してもらえますか?

.= torg + 1000

main:
        mov pc, sp
        tst –(sp)

        mov #list1, -(sp)
        jsr pc, mystery
        mov r0, res1
        tst (sp)+

        mov #list2, -(sp)
        jsr pc, mystery
        mov r0, res2
        tst (sp)+

        halt


mystery:
        mov r1, -(sp)
        mov r4, -(sp)
        mov r5, -(sp)

        clr r0

        mov 10(sp), r4
        mov r4, r5

loop:
        mov r4, r1
        jsr pc, next
        mov r1, r4
        beq return

        mov r5, r1
        jsr pc, next
        jsr pc, next
        mov r1, r5
        beq return

        cmp r4, r5
        beq setret
        br loop

setret:
        inc r0

return:
        mov (sp)+, r5
        mov (sp)+, r4
        mov (sp)+, r1
        rts pc


next:
        tst r1
        beq abort
        mov (r1), r1
abort:
        rts pc


.= torg + 3000
list1: .word 3006, 3000, 3002, 3004, 0
res1: .word -1

.= torg + 3020
list2: .word 3030, 3026, 0, 3024, 3022
res2: .word -1

このスニペットを理解できません。よろしくお願いします。

mystery:
            mov r1, -(sp)
            mov r4, -(sp)
            mov r5, -(sp)

            clr r0

            mov 10(sp), r4
            mov r4, r5
4

2 に答える 2

0

レジスター1、4、および5をバックアップし、レジスター0を初期化しているようです(バックアップする必要はありません)。はの@mystery宛先であるためjsr、これはプロローグコードと呼ばれます。次に、ループ用に初期化されます。

古い値はで復元され@returnます。

プログラム全体が何をしているのかというと、リンクリストから巡回リンクを見つけているようです。

bool is_invalid_list( link_node *l ) {
    while ( l && l->next && l->next->next ) {
        if ( l->next == l->next->next ) return true;
    }
    return false;
}

これがこれを実装するための最も簡単で最良の方法ではないと思いますが、最悪でもありません。

于 2010-05-20T14:40:44.777 に答える
0
        mov r1, -(sp)
        mov r4, -(sp)
        mov r5, -(sp)

これにより、3つのレジスタがスタックにプッシュされます。

        clr r0

明らか。

        mov 10(sp), r4
        mov r4, r5

これにより、スタックからr4にパラメーターが取得されます(次に、それがr5にコピーされます)。

于 2010-05-20T14:41:30.597 に答える