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是 a 的目的地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)

这是将三个寄存器压入堆栈。

        clr r0

明显的。

        mov 10(sp), r4
        mov r4, r5

这会将堆栈中的参数检索到 r4(然后将其复制到 r5)。

于 2010-05-20T14:41:30.597 回答