Tararoev_DL
19:39 12-07-2007 Программирование на ассемблере и Си
Под катом много про прогрраммирование...

Лирическое отступление для "блондинок": в каждом устройстве с кнопочками и экранчиком есть ПРОЦЕССОР, который выполняет КОМАНДЫ. Язык ассемблера однозначно связывает команды процессора и слова программы = ДЕЙСТВИЕ над данными. Поэтому он называется языком низкого уровня. Языками высокого уровня называются языки, которые одной строчкой получают какой-то РЕЗУЛЬТАТ.

Зачем нужно знать ассемблер - чтоб чтоб на получение РЕЗУЛЬТАТА потратить МИНИМУМ ВРЕМЕНИ ПРОЦЕССОРА за счет знаний/умений/времени ПРОГРАММИСТА.

Зачем нужно знать язык высокого уровня - чтоб на получение РЕЗУЛЬТАТА потратить МИНИМУМ ВРЕМЕНИ ПРОГРАММИСТА.

Что дает первый вариант?
Старожилы должны помнить... в 1-2кб помещалась программа, которая выводила потрясающие цветные картинки на экран и при этом играла простенькую мелодию на синтезаторе!!! Это несколько тысяч команд на процессоре в десяток МГц!!!
А Wolf-3D? на процессоре в 40 МГц без сопроцессора играли в 3D игру аж клавиатура дымилась...


Что дает второй вариант?
Уже есть Windows Vista, который занимает несколько Гб, и тормозит на процессоре в несколько ГГц!!! А это мы еще программы не запускали!




А я... в последнюю неделю-две пытаюсь делать совершенную глупость: понять как писать на языке высокого уровня, что бы получать оптимальный код. Почему глупость? Да потому что... см. зачем нужен язык высокого уровня! Я же пытаюсь делать так, что бы процессору было легче
Пытаюсь разобраться... понять... докопаться до сути...

Зачем? /вопрос риторический/

А, заметьте, работодателю все равно насколько оптимален код...




Пример: Нужно уменьшать переменную до нуля...

= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =

Ассемблер

= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =

; ----------------------
; Пример процедуры на ассеблере

mov DPTR,#asd ; Указываю с какой переменной работать
Call docl_asm ; Вызываю обработку переменной


; ----------------------
; Собственно тут моя ассемблерная процедура
; В указателе DPTR находится адрес переменной, с которой работаем

docl_asm:

movX A,@DPTR ; Извлекаю переменную
jz docl_asm1 ; Проверю на ноль
dec A ; Уменьшаю
movX @DPTR,A ; Сохраняю

docl_asm1:
ret ; Выхожу




= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =

Си

= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
; ----------------------
// Демонстрация процедуры на языке Си

void Count() // Уменьшить переменную по указателю
{
DecrCount(&asd); // Уменьшение переменной asd по указателю
}


; ----------------------
// Декремент

void DecrCount(unsigned char xdata *ptr) // Уменьшить переменную по указателю
{
if (*ptr) (*ptr)--; // если переменная не ноль уменьшить переменную
}



= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =

Код ассемблера

= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
; ============================================================
;
; Код ассемблера:
; На 1 переменную 11 байт
;
; ============================================================

900000 MOV DPTR,#ASD(0x0000) ; mov DPTR,#asd ;
1102 ACALL DOCL_ASM(C:0002) ; Call docl_asm


E0 MOVX A,@DPTR ; movX A,@DPTR
6002 JZ DOCL_ASM1(C:0007) ; jz docl_asm1
14 DEC A ; dec A
F0 MOVX @DPTR,A ; movX @DPTR,A

docl_asm1:
22 RET ;ret



= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =

Код Си

= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
// ============================================================
//
// Код Си:
// На 1 переменную 18 байт
//
// ============================================================


// Уменьшить переменную по указателю
//void Count()

7E00 MOV R6,#ASD(0x00)
7F00 MOV R7,#ASD(0x00)
02001A LJMP DecrCount(C:001A)


//void DecrCount(unsigned char xdata *ptr)
C:001A:

8F82 MOV DPL(0x82),R7
8E83 MOV DPH(0x83),R6

E0 MOVX A,@DPTR if (*ptr)
6003 JZ C:0024

E0 MOVX A,@DPTR (*ptr)--;
14 DEC A
F0 MOVX @DPTR,A

C:0024:
22 RET


PS: кто шарит в Си (просто) для микроконтроллеров - отзовитесь. Возникают вопросы
Комментарии:
неПушкин
19:43 12-07-2007
Tararoev_DL хочу поправить... в Вульфе нет 3D графики как таковой... она 2-ух мерная....
3D его назвали потому что игра от 1-ого лица))))



писал в своё время)))
Tararoev_DL
19:51 12-07-2007
неПушкин Честно говоря не помню какая именно там графика... Но как бы ты не рисовал, монитор все равно остается плоским. А уж в изометрии ли или еще как...

Так что, можно стучатся в аську, если что?
неПушкин
19:54 12-07-2007
Tararoev_DL стучи)))) чем смогу.. но это было давно и не долго))) но писал)) это я помню)) помоему атмегу мучал)
Tararoev_DL
20:01 12-07-2007
неПушкин Атмега это на ядре 51ого или там другая архитектура? (я на 51ом работал Atmel, ADuC, Silicon)
неПушкин
20:07 12-07-2007
Tararoev_DL да вроде)))