Программирование на ассемблере и Си

900000 MOV DPTR,#ASD(0x0000) ; mov DPTR,#asd ;Под катом много про программирование...

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

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

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

Что дает первый вариант?
Старожилы должны помнить... в 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: кто шарит в Си (просто) для микроконтроллеров - отзовитесь. Возникают вопросы ;)




А так же :

«Ночевала тучка золотая...» (о метафоре)
Л. В. Чернец Метафора (греч. metaphor – «перенос») – троп, перенос названия с одного предмета на другой на основании их сходства. Так, в стихотворении М. Ю. Лермонтова «Утес» действия, свойства, переживания человека переносятся на двух «персонажей» произведения – «старый утес» и «тучку золотую»: Ночевала тучка золотая На груди утеса-великана.


Библиография санскрита


10 белых гаджетов


2008 Выставка "Красная Шапочка и ... http://bit.ly/95S4eR



Хостинг от uCoz