有人能解释一下这个程序在做什么吗?
.= 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发布于 2010-05-20 22:40:45
它似乎正在备份寄存器1、4和5,并初始化寄存器0(不需要备份)。由于@mystery是jsr的目的地,因此称为prologue code。然后,为循环初始化它们。
旧值将在@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-20 22:41:31
mov r1, -(sp)
mov r4, -(sp)
mov r5, -(sp)这是将三个寄存器推送到堆栈上。
clr r0很明显。
mov 10(sp), r4
mov r4, r5这会将堆栈中的参数检索到r4中(然后将其复制到r5中)。
https://stackoverflow.com/questions/2874731
复制相似问题