Привет!
Fri Apr 01 2005 10:57, Alexey Boyko wrote to Alexander Golov:
...
AB>>> Hе, правда. Если бы 'movwf mem' называлась 'ld mem', а 'movfw AB>>> mem' называлась 'st mem' мне было бы гораздо понятней. AG>> Вообще-то странно, что сохранение wreg в памяти у тебя ассоциируется с AG>> неким ld, а загрузка с st.
AB> Вообще-то - наоборот. ld - загрузка wreg из памяти, st - сохранение. А AB> почему это странно?
Я, конечно, понял, что ты хотел сказать, просто в реальности ты сказал наоборот.
AG>> практически нет никакой нужды в "wreg-центричности" (интересно, а AG>> чтобы тебе показалось правильным применительно к dsPIC?).
AB> Я лишь бегло смотрел систему команд dsPIC. Hо у него ведь много регистров AB> и все равноправные? Тогда всякие (mov r1, r2) (st mem, r1) (ld r2, mem)
Т.е. выделить, скажем, из 49 вариантов адресации команды MOV пару частных случаев, когда с одной стороны адресуется регистр, а с другой память и назвать это ld/st? Как я понимаю, для тебя это в явном виде символизирует направление трафика ядро-память ещё на уровне мнемоники, но это же очень частный случай. Возьмём, например, 3-адресную арифметическую команду, где как один из источников, так и результат могут быть как внутри ядра (т.е. в регистре), так и в памяти и тебе неизбежно придётся интерпретировать способ адресации даже для простого установления направления движения данных. Так есть ли какой-то смысл что-то изменять в двух частных случаях и плодить сущности, когда в десятках других придётся пользоваться общим приёмом и всё равно вырабатывать соответствующий навык?
AB>>> Вот что делает эта команда? AB>>> movf fsr2l,w,c AG>> Это "movfw fsr2l",
AB> Так это куда, W:=fsr2l или fsr2l:=W ?
Естественно -- Move F To W, т.е. FSR2L->W, или алгебраически W=FSR2L.
AG>> Тут операнд один, остальное -- флажки.
AB> И что означают флажки f и c? И какие еще бывают флажки, применительно к AB> mov?
Флажок "f", означает, что результат положить в память (т.е. туда же откуда взял операнд), "w" -- в wreg. По умолчанию подразумевается "f", в явном виде нужно указывать только "w". Флажок "c" это HI-TECH'евская кличка для "a", флажка доступа к Access RAM, при программировании на ассме указывать не требуется, т.к. автоматически подставляется в зависимости от объявленного адреса переменной или типа доступа (при создании перемещаемых модулей).
AB>>> И что означает "f" в "movf"? AG>> Ты серьёзно собрался обсуждать листинг выданный компилятором как AG>> демонстрацию вида исходника на асме данного МК?
AB> Hет, но f меня смущает.
Просто они сделали такую команду, которая лишь загружает в АЛУ значение из ячейки, а потом, в зависимости от флажка f либо кладёт его обратно (тест Z), либо в wreg. Не было никакого смысла делать уникальную команду movfw, проще на общий вариант навесить синоним.
AG>> содержащую кучу бестолковых подробностей, константных ссылок и AG>> скрупулёзно указывающую все флажки, хотя в реальности этого не AG>> требуется. Hормальные программы, написанные на асме руками, выглядят AG>> скорее так:
AB> .... AB> Это лучше, конечно. Hо и листинги нужно смотреть (возможно, даже чаще)
Конечно, но при этом не требуется такая концентрация на подробностях как при написании, поэтому я обычно не испытываю каких-либо неудобств. Хотя всё равно согласен, что могло быть существенно лучше, но есть ли смысл винить в этом PIC или даже Microchip? Если, кто и заслужил побития камнями за такой листинг, так это HI-TECH, хотя я бы их в первую очередь побил, за жутко корявую реализацию оптимизатора.
AG>> ReadData2 xorlw 0x5D ;
AB> xorlw и xor - это разные команды?
AG>> movwf postinc2 ; Сохранить байт в буфере AG>> movlw 0 ; Старший байт
AB> Чем отличаются movlw от movfw?
AG>> addwfc TxCheck+1 ; AG>> decfsz Work0 ; Перевести счётчик принятых байтов
AB> decfsz отличается от просто dec?
В чём суть вопросов? Что система команд не очевидна, для того, кто её впервые видит? Так это про любую можно сказать, AVR в том числе.
Александр Голов, Москва, snipped-for-privacy@mail.ru