LINUX.ORG.RU

MSP430. Вопрос к тем кто работал с PDP-11. Программирование машинными кодами. Поделитесь опытом.

 , ,


0

2

В руки попал микроконтроллер MSP430 с платой LaunchPad. Искал какие есть инструменты для программирования и прошивки. В составе MSPFlasher попался файл Firmware.txt следующего содержания:

@e000
21 83 B2 40 80 5A 20 01 F2 D3 22 00 F2 E3 21 00 
B1 40 10 27 00 00 91 83 00 00 81 93 00 00 FB 23 
F5 3F 31 40 00 04 B2 40 48 E0 00 02 B2 40 48 E0 
02 02 B0 12 40 E0 0C 43 B0 12 00 E0 B0 12 44 E0 
1C 43 30 41 03 43 FF 3F 30 41 
@fffe
22 E0 
q

С помощью другой программы mspdebug у меня получилось зашить этот Firmware.txt:

$ ./mspdebug rf2500
(mspdebug) erase
Erasing...
(mspdebug) load ../MSPFlasher_1.3.20/Firmware.txt 
Done, 76 bytes total
(mspdebug) exit

После этого светодиодики бодро заморгали на плате.

Мне захотелось тоже попробовать хоть что-нибудь написать таким образом, просто чтобы был такой опыт. Если верить википедии, у MSP430 схожая система команд с PDP-11. Я относительно молодой, PDP-11 совсем не застал.

Здесь на форуме от разных людей видел комментарии в духе «дайте мне в руки PDP-11 и я вспомню как это делается». В руки, увы, ни PDP-11, ни MSP430 не дам. Но если поделитесь опытом, буду очень рад!

Вот, что, к примеру, делает программа описанная в файле Firmware.txt? Я, например, пока не могу расшифровать. :^)

Ответ на: комментарий от Jullyfish

для этого надо сначала в машкодах разобраться

Пока делаете симулятор, разберётесь и в кодировании инструкции, и в том, как они должны работать, и во многом другом…

vM ★★★
()

Сам, конечно, не разбирался, но ИИшница выдала вот это:

E000:  SUB.W  #2, SP                ; Allocate a 2-byte local counter

E002:  MOV.W  #0x5A80, &0x0120      ; WDTCTL: disable watchdog
E008:  BIS.B  #0xFF, &0x0022        ; P1DIR: set all direction bits

; Outer loop:
E00C:  XOR.B  #0xFF, &0x0021        ; P1OUT: invert all output bits
E010:  MOV.W  #10000, 0(SP)         ; counter = 10000

; Delay loop:
E016:  DEC.W  0(SP)                 ; --counter
E01A:  TST.W  0(SP)                 ; Compare counter with zero
E01E:  JNE    0xE016                ; Repeat until zero

E020:  JMP    0xE00C                ; Toggle again, forever

Примерный код на C, которому эта программа соответствует:

#include <msp430.h>
#include <stdint.h>

int main(void)
{
    volatile uint16_t counter;

    // Disable the watchdog.
    WDTCTL = WDTPW | WDTHOLD;

    // Configure all eight Port 1 pins as outputs.
    P1DIR |= 0xFF;

    for (;;) {
        // Invert every Port 1 output bit.
        P1OUT ^= 0xFF;

        // Busy-wait delay.
        counter = 10000;
        do {
            --counter;
        } while (counter != 0);
    }
}

Судя по твоему описанию это программа, которая моргает светодиодом, работая с GPIO-пином.

vbr ★★★★★
()

Мне захотелось тоже попробовать хоть что-нибудь написать

Накодить или написать?

Систему программирования этого устройства с тумблерно-светодиодной консоли в стиле начала 1970-х?

vM ★★★
()
Ответ на: комментарий от algo

Ассемблер, т.е. программка которая переводит человекочитаемые команды в машинные коды. Там даже ast дерево не надо строить. Достаточно замены слов на циферки. И скорость там тоже нафиг не нужна.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 4)
Ответ на: комментарий от peregrine

даже ast дерево не надо строить. Достаточно замены слов на циферки.

Автокод 1:1, который сам даже простейшее адресное выражение не может вычислить? Зачем на такое тратить машинное время и перфокарты переводить?!

algo
()
Последнее исправление: algo (всего исправлений: 1)
Ответ на: комментарий от algo

AST дерево ассемблеру не нужно для этого. Он слишком прост, а инструкции процессора/мк слишком ограничены, чтоб были какие-то сложные выражения писать.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 2)
Ответ на: комментарий от Jullyfish

:1000_ это sub (как-то не вписывается в восмеричное, ну ладно), _0011 это R3.

MSP гораздо более шестнадцатеричная машина, чем PDP-11 и традиционные 16- и 32-разрядные x86, потому что у него 16 естественно закодированных РОН, а не 8, как на x86 и PDP-11

algo
()
Ответ на: комментарий от algo

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

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

Но можешь написать адресные и константные выражения, которые умеет вычислять приличный ассемблер ещё на этапе ассемблерования, а часть вычислений оставить загрузчикам и компоновщикам

algo
()
Последнее исправление: algo (всего исправлений: 1)
Ответ на: комментарий от peregrine

1. абсолютный дизассемблер проще слепить чем переводчик даже тоже с абсолютными адрессами без автораскладывателя переменых в бинарные(маш)кОды

ващет ассемблеры ассемблеру рознь

т.е. саммый простейший переводит трёхбуквия в опкоды и меняет системы счисления(что ващет тоже опция) у аргументов - ну и если у проца кривая система аргов асм забирает на себя учёт этих не однородностей

далее макры

далее всякие структурные ассемблеры

вплоть до того что настоящий расшыряемый ассемблер профессионального уровня позволяет в качестве входного языка нечтно уровня Си/Паскаля с полным ооп

просто обычно от асма ожидается взаимоднозначное соответсвие машкода и стоки мнемокода если это не директива ассемблера

в какой то момент оказалось практчней перестать считать «библиотеку расширяющую HLL» а сделать отдельный траслятор ( не случайно Сяшки транслировали не машкод а мнемоники и директивы as)

qulinxao3 ★☆
()
Ответ на: комментарий от qulinxao3

не случайно Сяшки транслировали не машкод а мнемоники и директивы as

Потому что as уже был в UNIX с самого начала, и даже раньше.

А первоначальный формат объектного модуля в UNIX это и был выхлоп as ( a.out )

algo
()
Ответ на: комментарий от algo

там ещё bcpl пробегал

суть именно в том что когда ассемблер был на коне не было такой чёткой как ща границы между hll и дизасемблерным выхлопом без даже таблицы имён адрессов

ибо хорошо развитый промышленный ассемблер от hll отличался только прибитостью к опкодам целевой машины всё остальное - т.е. хитрые структуры управления и определения типов данных присутствовали - т.е. настоящему ассемблеру было что компилировать и оптимизировать :)

qulinxao3 ★☆
()

ОСТОРОЖНО!!! Творчество Алисы !!!

(mspdebug) mw 0x0200 0x41 0x00 0x22 0x00 0x01 0x00 0x21 0x00 0xff 0x3f
(mspdebug) set pc 0x0200
(mspdebug) run

Почувствуй себя настоящим опкодером!

algo
()
Ответ на: комментарий от Jullyfish

Судя по коду, инструкция 8321₁₆ должна вычитать 2 из SP(R1).

Мнемоника SUB.W #2, SP или DECD SP подходит по смыслу.

А как эта инструкция работает на Вашем устройстве?

algo
()
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария