簡體   English   中英

大會程序

[英]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(不需要備份)。 由於@mysteryjsr的目標,因此稱為序言代碼 然后,將它們初始化為循環。

舊值在@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM