Важная информация

User Tag List

Страница 1 из 8 12345 ... ПоследняяПоследняя
Показано с 1 по 10 из 78

Тема: Разбираюсь с ассемблером К1801ВМ1

  1. #1
    Member
    Регистрация
    01.11.2013
    Адрес
    г. Красноярск
    Сообщений
    45
    Благодарностей: 7
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Разбираюсь с ассемблером К1801ВМ1

    Народ, ковыряюсь в системе управления одного радиоприёмника, а именно вот:
    http://www.radioscanner.ru/forum/topic46843.html

    Считал ПЗУ-шку, дизассемблировал, но вот практики программирования, особенно в ассемблере не хватает.
    Помогите осмыслить подпрограмму.
    Правильно ли я дал комментарии и что же происходит в цикле?

    Код:
    016 304: MOV	R1,-(SP) ; занести значение регистра R1 в стек; SP=SP-2
    016 306: MOV	R2,-(SP) ; занести значение регистра R2 в стек; SP=SP-2
    016 310: MOV	R3,-(SP) ; занести значение регистра R3 в стек; SP=SP-2
    
    016 312: MOV	000 006(SP),R3 ; занести в R3 содержимое ячейки по адресу SP+6, т.е. адрес возврата из подпрограммы
    016 316: MOV	(R3)+,R1 ; R1 = R3, R3 = R3+2; занести в R1 адрес второй команды после возвращения из подпрограммы
    016 320: MOV	(R3)+,R2 ; R2 = R3, R3 = R3+2; занести в R2 адрес третьей команды после возвращения из подпрограммы
    Цикл:
    016 322: MOV	(R3)+,R3 ; R3 = R3, R3 = R3+2; занести в R3 адрес четвёртой команды после возвращения из подпрограммы
    
    016 324: ADD	#000 006,000 006(SP) ; сдвинуть адрес возврата из подпрограммы на +6
    016 332: MOV	(R1)+,(R2)+ ; R2 = R1, R1 = R1+2, R2 = R2+2;
    016 334: SOB	R3,016 332 ; R3 = R3-1; если R3 не равно 0, то перейти к 016 332
    
    016 336: MOV	(SP)+,R3 ; восстановить значение регистра R3 из стека; SP=SP+2
    016 340: MOV	(SP)+,R2 ; восстановить значение регистра R2 из стека; SP=SP+2
    016 342: MOV	(SP)+,R1 ; восстановить значение регистра R1 из стека; SP=SP+2
    016 344: RTS	PC ; вернуться из подпрограммы
    ПЗУ-шка во вложении
    Вложения Вложения
    • Тип файла: zip d2930.zip (11.7 Кб, Просмотров: 79)
    Последний раз редактировалось darkstar; 14.11.2013 в 09:21.
    Нет ничего более вечного чем то, что обмотано синей изолентой

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    Veteran
    Регистрация
    16.09.2009
    Адрес
    г. Харьков
    Сообщений
    1,466
    Благодарностей: 575
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    по идее так
    вызов этой подрограммы должен выглядеть как-то так
    Код:
       jsr  pc,_COPY
       dw _FROM
       dw _TO 
       dw _SIZE (в словах?)
    next_cmd:
    кратнокое описание
    сохранили регистры,
    вытянули параметры,
    переместили адрес возврата в правильное место
    скопировали
    восстановили регистры
    выход

    весь смысл в строчках
    [code]
    016 332: MOV (R1)+,(R2)+
    016 334: SOB R3,016 332 ; R3 = R3-1; если R3 не равно 0, то перейти к 016 332
    [code]

    а коментарий не верный,
    не " ; R2 = R1, R1 = R1+2, R2 = R2+2;"
    это взять слово по адресу на который указывает R1, поместить его по адресу на который указывает R2
    после чтения/записи увеличиваем значение регистров на 2 (по словам).

    собственно т.к. C писался как "супер макро для DEC"
    то в сишной нотации это
    *(R2++)=*(R1++)


    в вашем роме это так
    Код:
    RAM:001016 ; ---------------------------------------------------------------------------
    RAM:001020 word_1020:      .word 12                ; DATA XREF: sub_1030+4o
    RAM:001022                 .word 15
    RAM:001024                 .word 0
    RAM:001026                 .word 40
    RAM:001030
    RAM:001030 ; =============== S U B R O U T I N E =======================================
    RAM:001030
    RAM:001030
    RAM:001030 sub_1030:                               ; CODE XREF: RAM:loc_444P
    RAM:001030                                         ; RAM:000466P
    RAM:001030                 call    @#_COPY         ; DW _From,_TO,_Size
    RAM:001030 ; ---------------------------------------------------------------------------
    RAM:001034                 .word word_1020
    RAM:001036                 .word word_114740
    RAM:001040                 .word 4
    RAM:001042 ; ---------------------------------------------------------------------------
    RAM:001042                 mov     #-63012, R3
    RAM:001046                 clr     -(R3)

    p.s. давненько с PDP11 асм не возился, все больше с Intel
    но вроде порядок операндов не напутал
    Последний раз редактировалось esl; 12.11.2013 в 11:23.

  4. Этот пользователь поблагодарил esl за это полезное сообщение:
    darkstar (12.11.2013)

  5. #3
    Member
    Регистрация
    01.11.2013
    Адрес
    г. Красноярск
    Сообщений
    45
    Благодарностей: 7
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Блин, точно!
    Проглядел скобочки... а также проглядел адрес цикла... ё-маё, блин!
    А у меня уж мозг переклинило - думал на адрес 016 322 возвращаемся...
    Спасибо!

    Ага, значит это константы....

    Вызов такой:
    001 030: JSR PC,@#016 304
    001 034: 001 020
    001 036: 114 740
    001 040: 000 004
    001 042: MOV #114 766,R3
    001 046: CLR -(R3)

    ну и так далее
    Последний раз редактировалось darkstar; 12.11.2013 в 11:38.
    Нет ничего более вечного чем то, что обмотано синей изолентой

  6. #4
    Veteran
    Регистрация
    16.09.2009
    Адрес
    г. Харьков
    Сообщений
    1,466
    Благодарностей: 575
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    я там выше добавил пример как вызов выглядит у вас в ROM

    и там это достаточно любимый способ, как показалось
    имхо IDA тут рулит и бибикает,
    с ее поиском, xref, b прочими плюшками

    само просится TRAP XX - сделать с разумными именами а не цифрами

    ---------- Post added at 10:41 ---------- Previous post was at 10:38 ----------

    не такой
    Код:
    RAM:001030 004737 016304                        call    @#_COPY         ; DW _From,_TO,_Size
    RAM:001034 001020                               bne     loc_1076
    RAM:001036 114740                               movb    -(PC), -(R0)
    RAM:001040 000004                               iot
    RAM:001042 012703 114766                        mov     #-63012, R3
    RAM:001046 005043                               clr     -(R3)
    RAM:001050 012704 000005                        mov     #5, R4
    RAM:001054 012705 000060                        mov     #60, R5 ; '0'
    а такой
    Код:
    RAM:001016                      ; ---------------------------------------------------------------------------
    RAM:001020 000012               word_1020:      .word 12                ; DATA XREF: sub_1030+4o
    RAM:001022 000015                               .word 15
    RAM:001024 000000                               .word 0
    RAM:001026 000040                               .word 40
    RAM:001030
    RAM:001030                      ; =============== S U B R O U T I N E =======================================
    RAM:001030
    RAM:001030
    RAM:001030                      sub_1030:                               ; CODE XREF: RAM:loc_444P
    RAM:001030                                                              ; RAM:000466P
    RAM:001030 004737 016304                        call    @#_COPY         ; DW _From,_TO,_Size
    RAM:001030                      ; ---------------------------------------------------------------------------
    RAM:001034 001020                               .word word_1020
    RAM:001036 114740                               .word word_114740
    RAM:001040 000004                               .word 4
    RAM:001042                      ; ---------------------------------------------------------------------------
    RAM:001042 012703 114766                        mov     #-63012, R3
    RAM:001046 005043                               clr     -(R3)

  7. Этот пользователь поблагодарил esl за это полезное сообщение:
    darkstar (12.11.2013)

  8. #5
    Member
    Регистрация
    01.11.2013
    Адрес
    г. Красноярск
    Сообщений
    45
    Благодарностей: 7
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Ага, кажется начинаю понимать.
    Идёт вызов подпрограммы,
    а за ним следом три слова с параметрами.

    То есть тут подпрограмма перемещает кусок данных длинной 4 слова с адреса 1020 на адрес 114740.

    И ещё вопрос - а как Вы в IDA просматриваете одновременно адрес, восьмеричный код команды и мнемонику команд?
    У меня там в окне только мнемоника и стрелочки переходов...
    Последний раз редактировалось darkstar; 12.11.2013 в 11:57.
    Нет ничего более вечного чем то, что обмотано синей изолентой

  9. #6
    Veteran
    Регистрация
    16.09.2009
    Адрес
    г. Харьков
    Сообщений
    1,466
    Благодарностей: 575
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от darkstar Посмотреть сообщение
    И ещё вопрос - а как Вы в IDA просматриваете одновременно адрес, восьмеричный код команды и мнемонику команд?
    У меня там в окне только мнемоника и стрелочки переходов...
    в меню

    Options -> Disassembly -- Display disassembly line parts -- Number of opcode bytes (0 -> 3)

  10. Этот пользователь поблагодарил esl за это полезное сообщение:
    darkstar (13.11.2013)

  11. #7
    Activist
    Регистрация
    11.08.2009
    Адрес
    Минск
    Сообщений
    227
    Благодарностей: 27
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от darkstar Посмотреть сообщение
    Вызов такой:
    001 030: JSR PC,@#016 304
    001 034: 001 020
    001 036: 114 740
    001 040: 000 004
    001 042: MOV #114 766,R3
    001 046: CLR -(R3)
    ну и так далее
    =
    Процессор 16-разрядный и в PDP-шном Ассемблере адреса и числа пишутся без дырки-пробела в середине.

  12. Этот пользователь поблагодарил Ал-р за это полезное сообщение:
    darkstar (13.11.2013)

  13. #8
    Member
    Регистрация
    01.11.2013
    Адрес
    г. Красноярск
    Сообщений
    45
    Благодарностей: 7
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Да это я для себя пишу, а то разряды в глазах сливаются...
    Там скобку не заметил, тут в адресе ошибся - вот тебе и пожалуйста
    Нет ничего более вечного чем то, что обмотано синей изолентой

  14. #9
    Activist
    Регистрация
    11.08.2009
    Адрес
    Минск
    Сообщений
    227
    Благодарностей: 27
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от esl Посмотреть сообщение
    ...
    имхо IDA тут рулит и бибикает,
    с ее поиском, xref, b прочими плюшками
    само просится TRAP XX - сделать с разумными именами а не цифрами
    ---------- Post added at 10:41 ---------- Previous post was at 10:38 ----------


    ...
    а такой
    Код:
    RAM:001016                      ; ---------------------------------------------------------------------------
    RAM:001020 000012               word_1020:      .word 12                ; DATA XREF: sub_1030+4o
    RAM:001022 000015                               .word 15
    RAM:001024 000000                               .word 0
    RAM:001026 000040                               .word 40
    RAM:001030
    RAM:001030                      ; =============== S U B R O U T I N E =======================================
    RAM:001030
    RAM:001030
    RAM:001030                      sub_1030:                               ; CODE XREF: RAM:loc_444P
    RAM:001030                                                              ; RAM:000466P
    RAM:001030 004737 016304                        call    @#_COPY         ; DW _From,_TO,_Size
    RAM:001030                      ; ---------------------------------------------------------------------------
    RAM:001034 001020                               .word word_1020
    RAM:001036 114740                               .word word_114740
    RAM:001040 000004                               .word 4
    RAM:001042                      ; ---------------------------------------------------------------------------
    RAM:001042 012703 114766                        mov     #-63012, R3
    RAM:001046 005043                               clr     -(R3)
    =
    ... Много лишних буковок для програмки из нескольких строк ... И прикалывает число #-63012 при том что слева оно в нормальном виде 114766
    Последний раз редактировалось Ал-р; 13.11.2013 в 16:20.

  15. #10
    Member
    Регистрация
    01.11.2013
    Адрес
    г. Красноярск
    Сообщений
    45
    Благодарностей: 7
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Добрался до TRAP-диспетчера.
    Написал несколько комментариев и запутался.
    Не пойму, какое число получается после очистки битов и сдвига
    И куда в конечном счёте происходит переход?

    Аргументы у TRAP-а видел такие:
    11, 12, 13
    20, 22, 23, 25, 27
    32, 33, 36,
    44
    50, 53, 55

    Код:
    TRAP-диспетчер: 
    --------------------- 
    Сохраняем регистры: 
    004 504:	MOV	R3,-(SP)	; SP=SP-2; занести значение регистра R3 в стек 
    004 506:	MOV	R4,-(SP)	; SP=SP-2; занести значение регистра R4 в стек 
    004 510:	MOV	000 004(SP),R3	;записать в R3 содержимое ячейки по адресу SP+4, т.е. адрес возврата из прерывания 
    004 514:	MOV	R3,R4		; R4 = R3 = адрес возврата из прерывания 
    004 516:	MOV	-(R3),R3	; R3 = (R3-2) ; достали команду TRAP, вызвавшую прерывание, и положили в регистр R3 
    004 520:	BIC	#177 600,R3	; обнулить все разряды команды TRAP, кроме младших 7 бит - достали аргумент TRAP-а 
    004 524:	MOV	R3,-(SP)	; полученный аргумент кладём в стек 
    004 526:	CMP	#000 010,R3	; сравниваем 000 010 - R3 
    004 532:	BMI	004 540		; если R3 меньше 10, то перейти на 004 540 
    004 534:	CLR	R3		; очистить R3 
    004 536:	BR	004 544		; перейти на 004 544 
    004 540:	SUB	#000 010,R3	; вычесть 10 из R3 
    004 544:	MOVB	004 600(R3),-(SP); положить в стек значение 004 600+(R3) 
    004 550:	BIC	#177 400,(SP)	; очистить старший байт ячейки стека 
    004 554:	ASL	R3		; сдвинуть R3 влево 
    004 556:	JSR	PC,@004 646(R3)	; перейти к подпрограмме по адресу 004 646+(R3)
    004 562:	MOV	(SP)+,R3
    004 564:	ADD	R3,000 006(SP)
    004 570:	TST	(SP)+
    004 572:	MOV	(SP)+,R4
    004 574:	MOV	(SP)+,R3
    004 576:	RTI	
    004 600:	RTI	
    004 602:	HALT
    Последний раз редактировалось darkstar; 14.11.2013 в 09:26.
    Нет ничего более вечного чем то, что обмотано синей изолентой

Страница 1 из 8 12345 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. К1801ВМ1 vs К1801ВМ1Г, для БК0010/11
    от Alex_Vac в разделе БК-0010/0011
    Ответов: 24
    Последнее: 24.12.2014, 22:08
  2. Помогите новичку с ассемблером!
    от Ares в разделе Программирование
    Ответов: 139
    Последнее: 08.05.2014, 14:28
  3. {Украина} Куплю микросхемы к1801ВП1-037,К1801ВП1-014,К1801ВМ1
    от palsw в разделе Барахолка (архив)
    Ответов: 29
    Последнее: 05.06.2012, 12:23
  4. Ответов: 15
    Последнее: 22.12.2011, 11:01
  5. Помогите разобраться с ассемблером
    от casperzx в разделе Программирование
    Ответов: 7
    Последнее: 07.09.2010, 20:27

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •