программа по сборке

может кто-нибудь объяснить, что делает эта программа?

.= 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

person lego69    schedule 20.05.2010    source источник


Ответы (2)


Похоже, что он выполняет резервное копирование регистров 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;
}

Я не думаю, что это самый простой или лучший способ реализовать это, но и не самый худший.

person Potatoswatter    schedule 20.05.2010
comment
поясните, пожалуйста, в этой строке mov #list1, -(sp) я должен отправить указатель на список1 или все значения из списка1? - person lego69; 20.05.2010
comment
@lego: просто указатель, то есть значение метки list1. Для процессора это просто число, как и любое другое. - person Potatoswatter; 20.05.2010
comment
и еще вопрос: зачем нам эти строки mov r1, -(sp) mov r4, -(sp) mov r5, -(sp) мы не использовали эти регистры - person lego69; 20.05.2010
comment
@lego: см. статью в Википедии, на которую я дал ссылку, и статьи, на которые она ссылается. По соглашению (формализованному ABI любой платформы) для большинства регистров необходимо создавать резервные копии и восстанавливать их при использовании функцией, чтобы любые вызывающие функции могли использовать их независимо. - person Potatoswatter; 20.05.2010

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

Это помещает три регистра в стек.

        clr r0

Очевидный.

        mov 10(sp), r4
        mov r4, r5

Это извлекает параметр из стека в r4 (и затем копирует его в r5).

person Jerry Coffin    schedule 20.05.2010
comment
Можете ли вы объяснить, пожалуйста, что делает эта программа? - person lego69; 20.05.2010
comment
@ lego69: он загружает слово со смещением 10 из (sp) в r4. Это будет 5 слов вверх по стеку, а так как мы только что поместили в стек три слова, это второй параметр, который был передан. - person Jerry Coffin; 20.05.2010
comment
передается только один параметр. jsr наверное подталкивает ПК. - person Potatoswatter; 20.05.2010