[英]program on Assembly
有人可以解釋一下該程序在做什么嗎?
.= 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
它似乎是在備份寄存器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;
}
我認為這不是實現此目的的最簡單或最佳方法,但也不是最糟糕的方法。
mov r1, -(sp)
mov r4, -(sp)
mov r5, -(sp)
這會將三個寄存器壓入堆棧。
clr r0
明顯。
mov 10(sp), r4
mov r4, r5
這將從堆棧中檢索一個參數到r4(然后將其復制到r5)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.