Страница 2 из 3

Re: Возможно без знакомства с ассемблером освоить Си?

Добавлено: Чт янв 12, 2012 13:00:05
hybroid
Блин, ну юморист :)))

Re: Возможно без знакомства с ассемблером освоить Си?

Добавлено: Чт янв 12, 2012 15:04:07
ATtiny13
Всем спасибо за коментарии
Понял что надо хотя бы поверхностно познакомиться с асамблером чтобы хоть немного понимать принцип действия и архитектуру мк
мне на си нужно хотябы знать как написать бегущий огонь таймер или что-то не очень сложное :)

Re: Возможно без знакомства с ассемблером освоить Си?

Добавлено: Чт янв 12, 2012 15:41:04
Мастер Ломастер
ATtiny13 писал(а):Понял что надо хотя бы поверхностно познакомиться с асамблером чтобы хоть немного понимать принцип действия и архитектуру мк
либо объясняли вам плохо, либо вы поняли не так. архитектура МК - это голая аппаратура, логика - на уровне регистров, триггеров и т.п. чтобы понять, как она работает, нужно немного шарить в цифровой схемотехнике, хотя бы на уровне "что такое 2И-НЕ" или "что такое параллельный регистр с третьим состоянием выходов". взаимодействие отдельных аппаратных частей МК можно на первых порах понять на уровне "когда сюда поступает такой-то сигнал, то здесь происходит вот это" - буквально "на пальцах". для всего этого ассемблер совершенно не нужен.
далее нужно понять, что такое двоичная система счисления и как происходят математические и логические операции над числами внутри МК. это, в общем-то, чистая математика и логика, опять же - ассемблер не при делах. на этом этапе главное понять, что ЧИСЛО внутри МК хранится и обрабатывается, и при этом совершенно безразлично, в какой именно системе это делается. то есть важно понять, что ЧИСЛО - оно одно и то же не зависимо от системы счисления - с этим у многих начинающих проблемы, нередко можно встретить просьбы типа "как вывести двоичное число в десятичном виде - ведь в МК все в двоичном коде". в частности, этот вопрос ПРАВИЛЬНО формулируется так: "как вывести ЧИСЛО из мк в десятичном формате" - то есть задумываться о том, что внутри МК число в какой-то иной системе НЕ НУЖНО.

таким образом, для начала программирования МК не нужно знать ассемблер даже поверхностно. по крайней мере до тех пор, пока основная задача - помигать светодиодами и попищать динамиком, понажимать кнопки и т.п. умение разделить сложную задачу на более простые части, умение описать алгоритмически действия над данными (числами) для получения нужного результата - это наиболее важное в программировании. и в этом разрезе ассемблер не более важен и полезен, чем паскаль, Си или фортран (на котором для Мк вообще никто не пишет).

Re: Возможно без знакомства с ассемблером освоить Си?

Добавлено: Чт янв 12, 2012 16:14:08
ploop
Как бы тут не холиварили, я бы советовал первые программы начинать писать на асме.

Re: Возможно без знакомства с ассемблером освоить Си?

Добавлено: Чт янв 12, 2012 16:21:46
BOB51
опять бесконечная тема "кто первый - курица или яйцо?"
да все хороши, только вот пока досконально все изучить успееш - того и гляди
мелкосхемку уж с производства сняли :tea:

Re: Возможно без знакомства с ассемблером освоить Си?

Добавлено: Чт янв 12, 2012 16:31:45
МитяРа
BOB51 писал(а):пока досконально все изучить успееш - того и гляди
мелкосхемку уж с производства сняли
Пушистый, те-то чё волноваться, ты-же у нас "многостаночник"..
Да и 51-е знаешь, а у них за все 34 года выпуска система команд не менялась.. :))

Re: Возможно без знакомства с ассемблером освоить Си?

Добавлено: Чт янв 12, 2012 20:08:17
Sergi
Я так думаю: одно другому не мешает. На С все красиво и понятно как в школе на BASICе, но когда сражаешься со временем (или размером) приходится переходить на вставки из ASMа. Вот я так и борюсь. С уважением.

Re: Возможно без знакомства с ассемблером освоить Си?

Добавлено: Чт янв 12, 2012 21:13:43
YS
Могу сказать, что на моем любимом M3 это делается еще легче и без необходимости прибегать к машинным кодам.
Пример последовательного вывода байта на С под C-M3 в студию!

Re: Возможно без знакомства с ассемблером освоить Си?

Добавлено: Чт янв 12, 2012 21:32:11
hybroid
немного понимать принцип действия и архитектуру мк
А вы даташит на МК прочтите. Для этого не нужны знания ни Assembler, ни C :)
В остальном соглашусь с Мастером Ломатером, весьма хорошо человек расписал..

Re: Возможно без знакомства с ассемблером освоить Си?

Добавлено: Чт янв 12, 2012 21:37:31
vAv
ploop писал(а):Как бы тут не холиварили, я бы советовал первые программы начинать писать на асме.
У с/с++ есть одно неоспоримое преимущество - навыки программирования на нем могут пригодится абсолютно на любой платформе, т.к. язык напрямую не привязан к железу.
А для начинающих тем более предпочтительно изучить си - проще сначала разобраться с языком высокого уровня и потом, если приспичит, изучить и нижний уровень. Иначе неудачи при работе с асмом могут вообще отбить охоту программировать.
И я, к примеру, могу кодить на z80, на x86 и на STL STEP7 (ну и вообще на LD и тд), но изучать еще асм авр или pic уже тупо вломы. :)

Re: Возможно без знакомства с ассемблером освоить Си?

Добавлено: Чт янв 12, 2012 21:45:59
ploop
Я же не говорил, что Си не нужен :)

Re: Возможно без знакомства с ассемблером освоить Си?

Добавлено: Чт янв 12, 2012 22:10:44
hybroid
Вот я и хотел сказать, кстати, похожую мысль, как у vAv.
Вот станет человек богом ассемблера, потом приспичит ему сесть на си или другой высокоуровневый язык - и будет ужоснах :) Как начнёт применять стиль программирования на ассемблере к сям - получится сплошной говно-, быдлокод и прочий индусский код :) Будем потом сами же сидеть и рыдать (ржать, умирать от инфарктов, сбегать в ужасе) :)))
Конечно можно сказать, что всё зависит от человека.. Но чаще всего получается, что откладывается один раз на подкорке - и всё, крандец, ресурс обучаемости исчерпан :tea:

Re: Возможно без знакомства с ассемблером освоить Си?

Добавлено: Чт янв 12, 2012 22:30:54
Satyr
YS писал(а): Пример последовательного вывода байта на С под C-M3 в студию!
http://infocenter.arm.com/help/index.js ... cjiic.html

Re: Возможно без знакомства с ассемблером освоить Си?

Добавлено: Чт янв 12, 2012 22:36:17
YS
Я просил пример кода. :) А про bit-banding я и так знаю. И сомневаюсь, что с ним будет удобнее и быстрее, чем с использованием переноса.

Re: Возможно без знакомства с ассемблером освоить Си?

Добавлено: Чт янв 12, 2012 22:39:38
YS
ОК, вот для затравки:

Код: Выделить всё

uint8_t byte,i;

...

for (i=0; i<8; i++)
{
  if (byte & 1)
  {
    //"1" bit code
  }
  else
  {
    //"0" bit code
  }

  byte=byte >> 1;
}
А теперь покажите мне то же самое, только с bit-banding'ом. :)

Re: Возможно без знакомства с ассемблером освоить Си?

Добавлено: Чт янв 12, 2012 22:41:40
Satyr
Если ты знаком, чего тебе не понятно ? :))
Вобще делать ничего не надо, только инкрементить указатель, по которому уже и так читается 0 или 1 в зависимости от бита, в который транслируется адрес

Re: Возможно без знакомства с ассемблером освоить Си?

Добавлено: Чт янв 12, 2012 22:47:18
YS
Если ты знаком, чего тебе не понятно ?
Ну, знаете ли, интересно поглядеть на свежее решение. :) Покажите код, это ведь несложно. :) А я поучусь.

Re: Возможно без знакомства с ассемблером освоить Си?

Добавлено: Чт янв 12, 2012 22:56:28
ploop
YS писал(а):ОК, вот для затравки:
Я как бы кроме AVR мало с чем знаком, кто-нибудь может показать, во что превратит этот код компилятор?

Re: Возможно без знакомства с ассемблером освоить Си?

Добавлено: Чт янв 12, 2012 23:22:50
Goodefine
Я примерно такой функцией делаю обычно:

Код: Выделить всё

void transmit_byte(unsigned char const *byte)
{
unsigned char  mask;
for (mask=0x80;mask;mask>>1) (*byte&mask)? (PORTW|=(1<<BIT)):(PORTW&=~(1<<BIT));
}
Если нужно иметь возможность изменять направление (первый байт младший или старший), то примерно так:

Код: Выделить всё

void transmit_byte(unsigned char const *byte, unsigned char direct)
{
unsigned char  mask;
for (mask=(direct)? 1:0x80;mask;mask=(direct)? mask<<1:mask>>1)
(*byte&mask)? (PORTW|=(1<<BIT)):(PORTW&=~(1<<BIT));
}

Re: Возможно без знакомства с ассемблером освоить Си?

Добавлено: Пт янв 13, 2012 00:47:13
Goodefine
ploop писал(а): Я как бы кроме AVR мало с чем знаком, кто-нибудь может показать, во что превратит этот код компилятор?
Этот код (Atmega8):

Код: Выделить всё

#include <avr/io.h>

#define PORTW   PORTD
#define BIT     1

void transmit_byte(unsigned char const byte)
{
unsigned char  mask;
for (mask=0x80;mask;mask>>1) (byte&mask)? (PORTW|=(1<<BIT)):(PORTW&=~(1<<BIT));
}

int main(void)
{

unsigned char data=0;

    for(;;)
    {
     transmit_byte(data);
     data++;
    }

return 0;
}
Компилятор (WinAVR-20100110) превращает в такой (пролог/эпилог опущен):

Код: Выделить всё

void transmit_byte(unsigned char const byte)
{
unsigned char  mask;
for (mask=0x80;mask;mask>>1) (byte&mask)? (PORTW|=(1<<BIT)):(PORTW&=~(1<<BIT));
  38:	80 78       	andi	r24, 0x80	; 128
  3a:	88 23       	and	r24, r24
  3c:	11 f0       	breq	.+4      	; 0x42 <__SREG__+0x3>
  3e:	91 9a       	sbi	0x12, 1	; 18
  40:	01 c0       	rjmp	.+2      	; 0x44 <__SREG__+0x5>
  42:	91 98       	cbi	0x12, 1	; 18
  44:	92 b3       	in	r25, 0x12	; 18
  46:	f9 cf       	rjmp	.-14     	; 0x3a <transmit_byte+0x2>

00000048 <main>:
}

int main(void)
{
  48:	1f 93       	push	r17
  4a:	10 e0       	ldi	r17, 0x00	; 0

unsigned char data=0;

    for(;;)
    {
     transmit_byte(data);
  4c:	81 2f       	mov	r24, r17
  4e:	f4 df       	rcall	.-24     	; 0x38 <transmit_byte>
     data++;
  50:	1f 5f       	subi	r17, 0xFF	; 255
  52:	fc cf       	rjmp	.-8      	; 0x4c <main+0x4>

...
Здесь указатель не использовался, он больше подходит для массива, чем для байта.
Код выше

Код: Выделить всё

#include <avr/io.h>

#define PORTW   PORTD
#define BIT     1

void transmit_byte(unsigned char  byte)
{
unsigned char i;

for (i=0; i<8; i++)
{
  if (byte & 1)
  {
    PORTW|=1<<BIT; //"1" bit code
  }
  else
  {
    PORTW&=~(1<<BIT);//"0" bit code
  }

  byte=byte >> 1;
}
}

int main(void)
{

unsigned char data=0;

    for(;;)
    {
     transmit_byte(data);
     data++;
    }

return 0;
}
получается в:

Код: Выделить всё

void transmit_byte(unsigned char  byte)
{
  38:	90 e0       	ldi	r25, 0x00	; 0
unsigned char i;

for (i=0; i<8; i++)
{
  if (byte & 1)
  3a:	80 ff       	sbrs	r24, 0
  3c:	02 c0       	rjmp	.+4      	; 0x42 <__SREG__+0x3>
  {
    PORTW|=1<<BIT; //"1" bit code
  3e:	91 9a       	sbi	0x12, 1	; 18
  40:	01 c0       	rjmp	.+2      	; 0x44 <__SREG__+0x5>
  }
  else
  {
    PORTW&=~(1<<BIT);//"0" bit code
  42:	91 98       	cbi	0x12, 1	; 18

void transmit_byte(unsigned char  byte)
{
unsigned char i;

for (i=0; i<8; i++)
  44:	9f 5f       	subi	r25, 0xFF	; 255
  46:	98 30       	cpi	r25, 0x08	; 8
  48:	11 f0       	breq	.+4      	; 0x4e <__SREG__+0xf>
  else
  {
    PORTW&=~(1<<BIT);//"0" bit code
  }

  byte=byte >> 1;
  4a:	86 95       	lsr	r24
  4c:	f6 cf       	rjmp	.-20     	; 0x3a <transmit_byte+0x2>
  4e:	08 95       	ret

00000050 <main>:
}
}

int main(void)
{
  50:	1f 93       	push	r17
  52:	10 e0       	ldi	r17, 0x00	; 0

unsigned char data=0;

    for(;;)
    {
     transmit_byte(data);
  54:	81 2f       	mov	r24, r17
  56:	f0 df       	rcall	.-32     	; 0x38 <transmit_byte>
     data++;
  58:	1f 5f       	subi	r17, 0xFF	; 255
  5a:	fc cf       	rjmp	.-8      	; 0x54 <main+0x4>
Что несколько хуже первого варианта (примерно на 8 байт). Мож кто сделает еще лучше руками на асме?