
- •2) Работа с файлами в с
- •3) Регистры процессора Intel x86
- •1) Основные команды процессора Intel x86 Расширение операндов
- •Работа с битами
- •Работа с флагами процессора
- •3) Простые типы данных в Паскеле
- •1) Составные типы данных в паскале
- •2) Циклические конструкции в с
- •3) Арифметические операции ассемблера
- •1)Условные переходы
- •2) Условные операторы в с
- •1) Массивы и строки в с
- •3) Работа с памятью в с
- •2) Составные типы данных с. Структуры
- •3) Условные Операторы в паскале
- •1) Математический сопроцессор
- •2) Циклические конструкции Паскаля
- •1) Процедуры и Функции в паскале
- •2) Простые типы данных в с
- •3) Массивы и строки в ассемблере
- •2) Общая структура программы с
- •3) Видеобуфер
- •1) Циклические конструкции в с
- •2) Работа с видеопамятью
- •3) Процедуры и функции в паскале
- •1) Простые типы данных в с
- •2) Строки в ассемблере
- •3) Условные Операторы в паскале
- •1) Работа с файлами в с
- •2) Условные переходы
- •3) Массивы и строки в паскале
- •2) Флаги
- •3) Организация сложных структур данных в паскале. Списки.
- •1) Работа с памятью в с
- •3) Составные типы данных в паскале
- •1) Массивы и строки в с
- •2) Регистры процессора Intel x86
- •1) Простые типы данных в с
- •2) Математический сопроцессор
- •3) Файлы в паскале
- •1) Условные операторы в с
- •2) Регистры процессора Intel x86
- •1) Типы данных в с
- •3) Условные Операторы в паскале
- •1) Общая структура программы с
- •2) Основные команды процессора Intel x86 Расширение операндов
- •Работа с битами
- •Работа с флагами процессора
- •3) Файлы в паскале
1) Массивы и строки в с
Массив– это тип данных, описывающий упорядоченный набор однотипных элементов.
Массив задается так: int a[10]; // массив из 10 целых чисел. Нумеруется от 0 до 9 Статическиемассивы можно объявлять синициализацией, перечисляя значения их элементов в {} через запятую. Если задано меньше элементов, чем длина массива остальные элементы считаются нулями:
int a10[10] = { 1, 2, 3, 4 }; /* и 6 нулей */
Строка в Си - это последовательность байт (букв, символов), завершающаяся в конце специальным признаком - байтом '\0'.
char s[размер строки]
2)Стек– область памяти, работа с которойможетосуществляться по особым правилам. Чтобы записать нечто в стек используются командыpushиpushd(pushдля 16-битных иpushdдля 32-битных. 8-битные операнды класть в стек нельзя):
pushd eax
pushd 1
pushd [x]
Чтобы извлечь переменную из стека используются команды popиpopd.
Последнее значение, положенное в стек, извлекается первым. В этом смысл существования стека, именно это свойство делает стек стеком
3)Связанный списокпредставляет собой упорядоченный набор переменных, в котором предыдущий элемент хранит указатель на следующий. Обычно для реализации списка вводят новый тип данных:
type
plist_entry = ^list_entry;
list_entry = record
next: plist_entry;
value: integer;
End;
В линейномсписке признаком последнего элемента служитнулевой указатель. Вкольцевомсписке последний элемент указывает на первый.
Для перечисления элементов списка используется следующий шаблон:
var current, head: ^list_entry;
...
current := head;
while current <> nil do begin
{ работа с элементом current }
current := current^.next;
end;
Головойсписка называется первый его элемент.Хвостомсписка называется последний его элемент. Очевидно, что все элементы списка доступны через его голову, поэтому список характеризуется указателем на его голову
Двусвязным спискомназывается список, каждый элемент которого содержит указатель не только на следующий, но и на предыдущий элемент. В кольцевом двусвязном списке обратный указатель головы содержит адрес хвоста.
Билет 6
1) Связанный списокпредставляет собой упорядоченный набор переменных, в котором предыдущий элемент хранит указатель на следующий. Обычно для реализации списка вводят новый тип данных:
type
plist_entry = ^list_entry;
list_entry = record
next: plist_entry;
value:integer;
End;
В линейномсписке признаком последнего элемента служитнулевой указатель. Вкольцевомсписке последний элемент указывает на первый.
Для перечисления элементов списка используется следующий шаблон:
var current, head: ^list_entry;
...
current := head;
while current <> nil do begin
{ работа с элементом current }
current := current^.next;
end;
Головойсписка называется первый его элемент.Хвостомсписка называется последний его элемент. Очевидно, что все элементы списка доступны через его голову, поэтому список характеризуется указателем на его голову
Двусвязным спискомназывается список, каждый элемент которого содержит указатель не только на следующий, но и на предыдущий элемент. В кольцевом двусвязном списке обратный указатель головы содержит адрес хвоста.
2) Процедурыпредставляют собой просто кусок кода. Чтобы вызвать процедуру используется командаcall, чтобы выйти из процедуры –ret. Командаcallделает две вещи:
Кладет на стек адрес команды, следующей за ней
Передаёт управление на метку
Команда retберет со стека адрес возврата и передает на него управление
Параметры процедурам могут передаваться через регистры и через стек.
Пример:
format binary
org 100h
mov eax, 1
mov ebx, 2
call add eax,ebx ; вызов процедуры
mov eax, 3
mov ebx, 4
call add eax,ebx
int 20h
add eax,ebx:
add eax, ebx
ret
Соглашение о вызове– это способ, которым функциям передаются параметры.
Cdecl- Аргументы передаются через стек, справа налево. Очистку стека производитвызывающаяподпрограмма. Это основной способ вызова функций с переменным числом аргументов
Stdcall- Аргументы передаются через стек, справа налево. Очистку стека производитвызываемаяподпрограмма.
; пролог
pushd ebp
mov ebp, esp
; первый параметр теперь всегда [ebp + 8], второй – [ebp + 12], и т.д.
; сохранение регистров
pushd esi
pushd edi
; тело функции
…
; восстановление регистров
popd edi
popd esi
; эпилог
popd ebp
ret ; для cdecl, или retn (4 * число параметров) для stdcall