2013-11-27 2 views
3

Как передать адрес памяти из регистра в другой? Моя следующая процедура получает адрес строковой памяти из стека (да, это необходимо), а затем пытайтесь помещать в регистры D1, но он не работает, и EASy68k сбой эмулятора (или идет в бесконечном цикле?), Когда я пытаюсь запустить это.Передача адреса памяти по регистру

Код:

START ORG $1000 


    MOVE.L T,D0 
    MOVE.L D0,-(SP) 
    BSR PRINTS 



PRINTS:  
     MOVE.L D0,(SP)+ 
     MOVE.W D0,A1 
     MOVE #14,D0 
     TRAP #15 
     RTS 

T DC.B 'HELLO',0 
    END START 

UPDATE: Я обновил путь в качестве аргументов выталкиваются и poped из стека. Изменено для использования инструкции PEA, которая выглядит как то, что я хочу, но она по-прежнему не работает.

START ORG $1000 
     PEA T(PC) 
     *MOVE.L D0,-(SP) 
     BSR PRINTS 
     ADDQ.L #4,SP 

    MOVE #9,D0  
     TRAP #15 

PRINTS:   
     MOVE 4(SP),A1 
     MOVE #14,D0 
     TRAP #15 
     RTS 

ответ

2

Чтобы получить аргумент в стек правильно, вам необходимо либо сделать:

LEA T, A0 
    MOVE.L A0, D0 
    MOVE.L D0, -(SP) 

или

PEA.L T 

Чтобы получить аргумент от стек правильно, дон Фактически, вы хотите поместить его в вызываемую функцию. Это потому, что BSR выталкивает адрес возврата. Вместо этого, вы должны использовать индексную адресацию следующим образом:

MOVE.L (4,SP), A1 ; read argument from stack, overlooking return address 

А потом в довершении, вы должны «поп» аргумент из стека в вызывающие (а не вызываемом абоненте), путем добавления этого после BSR инструкции:

ADDA.L #4, SP  ; remove argument from stack. 

в результате программы (который я сделал тест в EASy68K), выглядит следующим образом:

 ORG $1000 
START: 
     PEA.L T   ; push argument to stack 
     BSR PRINTS  ; call PRINTS; also pushes return address on stack 
     ADDA.L #4, SP  ; remove argument from stack. 
     SIMHALT 

PRINTS: 
     MOVE.L (4,SP), A1 ; read argument from stack, overlooking return address 
     MOVE.L #14, D0 
     TRAP #15 
     RTS 

T  DC.B 'HELLO', 0 

     END START  ; last line of source 

И не забывайте, что SIMHALT впереди PRINTS. Вы не хотите отказываться от основного кода в своих подпрограммах.

О, и, как вы, вероятно, обнаружили:

 PEA.L T(PC) 

делает работу вместо

 PEA.L T 

Основным отличием является размер кода. Первый использует PC-относительную адресацию для генерации адреса, а второй сохраняет полный 32-разрядный адрес в объектном коде.

+0

Да. Благодарю. Я исправил это, но похоже, что это половина проблемы. Он все еще не работает. –

+0

Не должно 'MOVE.L T, D0' быть' LEA T, D0'? Вам нужен адрес 'T', а не содержимое' T'. –

+0

Перемещение будет работать так же, как и текущий код. 'LEA T, D0' возвращает ошибку:« ОШИБКА: Недействительный режим адресации » –

Смежные вопросы