Под катом много про прогрраммирование...
Лирическое отступление для "блондинок": в каждом устройстве с кнопочками и экранчиком есть ПРОЦЕССОР, который выполняет КОМАНДЫ. Язык ассемблера однозначно связывает команды процессора и слова программы = ДЕЙСТВИЕ над данными. Поэтому он называется языком низкого уровня. Языками высокого уровня называются языки, которые одной строчкой получают какой-то РЕЗУЛЬТАТ.
Зачем нужно знать ассемблер - чтоб чтоб на получение РЕЗУЛЬТАТА потратить МИНИМУМ ВРЕМЕНИ ПРОЦЕССОРА за счет знаний/умений/времени ПРОГРАММИСТА.
Зачем нужно знать язык высокого уровня - чтоб на получение РЕЗУЛЬТАТА потратить МИНИМУМ ВРЕМЕНИ ПРОГРАММИСТА.
Что дает первый вариант?
Старожилы должны помнить... в 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: кто шарит в Си (просто) для микроконтроллеров - отзовитесь. Возникают вопросы