- •Системы счисления, используемые на компьютере. Десятичная система, двоичная и 16-ричная системы счисления. Правила перевода.
- •Арифметические операции в двоичной системе счисления. Понятие прямого, обратного и дополнительного кода. Сложение и вычитание целых чисел в двоичной системе счисления.
- •Арифметические операции в двоичной системе счисления. Представление вещественных чисел в компьютере. Сложение и вычитание вещественных чисел в двоичной системе счисления.
- •Основные логические операции: and, or, not, xor. Таблицы истинности для этих операций. Основные тождества булевой алгебры.
- •Понятие об информации и науке информатике. Исторические этапы способов обработки, хранения и передачи информации.
- •Функции компьютера. Их краткая характеристика.
- •Структура компьютера. Основные компоненты компьютера и их характеристика. Состав центрального процессора.
- •Язык блок-схем. Основные типы блоков. Понятие структуры. Виды структур.
- •17. Основные типы алгоритмов и способы их записи на языке блок-схем.
- •18. Архитектура эвм. Особенности фон Неймановской архитектуры.
- •Оперативная память компьютера. Понятие бита, байта, слова, двойного слова. Понятие адреса байта и слова.
- •Регистры центрального процессора. Краткая характеристика регистров общего назначения.
- •Регистры центрального процессора. Сегментные регистры и указатель команд. Регистр флагов.
- •Представление данных на компьютере. Представление целых чисел без знака и со знаком.
- •23 Представление данных на компьютере. Представление символьных данных и представление команд.
- •Понятие о языке Ассемблера. Этапы разработки программы на ассемблере.
- •Windows api функция для вывода символов на экран. Ее основные параметры и их назначение.
- •Windows api функция для ввода символов с консоли. Ее основные параметры и их назначение.
- •Особенности сложения и вычитания целых (в том числе и знаковых) чисел на Ассемблере.
- •29. Команды умножения и деления на Ассемблере.
- •30. Директивы определения данных.
- •33. Модификация адресов на ассемблере. Индексирование в одномерном массиве.
- •34. Модификация по нескольким регистрам на ассемблере. Обработка двумерных массивов.
- •Процедуры на Ассемблере. Правила оформления процедуры и обращения к ней.
- •36. Процедуры на Ассемблере. Передача параметров в процедуру. Рекурсивные процедуры.
- •Работа с файлами на Ассемблере. Открытие и закрытие файлов. Windows api процедуры открытия и закрытия файлов, их параметры.
- •38. Чтение из файла и запись в файл. Windows api процедуры записи и чтения файлов, их параметры.
- •39. Работа с вещественными числами на Ассемблере. Математический сопроцессор и его регистры. Форматы записи вещественных чисел.
- •40. Работа с вещественными числами на Ассемблере. Команды передачи данных и арифметические команды математического сопроцессора.
Windows api функция для ввода символов с консоли. Ее основные параметры и их назначение.
Попробуем организовать ввод символов с консоли.
При этом будут использоваться несколько процедур, прототипы которых находятся в файлах с расширением .INC. Сами процедуры — Функции Windows API(Application Programming Interface – интерфейс прикладных программ) находятся в библиотеках с расширением .LIB.
Потребуется процедура GetStdHandle, которая получает дескриптор (описание) стандартного устройства, в нашем случае устройства вывода.
Для организации ввода данных с консоли(с клавиатуры) служит процедура ReadConsole, одновременно похожая на WriteConcoleA и противоположная ей. Обратите внимание на то, что здесь имеем дело с дескрипторами двух устройств — экрана (stdout) и клавиатуры (stdin).
Также внимание следует уделить блоку преобразования введенной строки из цифр в число. Здесь символы- цифры по одной «отдираются» из строки и превращаются в цифру с вычитанием числа 48 (это связано с тем, что код 0 есть 48, символа 1 — 49, и т.д.) Получив очередную цифру, добавляем ее к текущему числу, предварительно сдвинув десятичные разряды влво умножением на 10.
Особенности сложения и вычитания целых (в том числе и знаковых) чисел на Ассемблере.
Особенности сложения на компьютере(беззнаковые числа)
Беззнаковые числа складываются как обычно, только в двоичной системе счисления. Однако здесь есть одна проблема: что делать, если сумма получится очень большой – такой, что она не умещается в ячейке? Например, если при ячейке размеров в 8 битов мы складываем 250 и 10, то получим число 260 (100000100b), которое не «влезает» в ячейку.
В этом случае в ПК левая единица (единица переноса) отбрасывается и в качестве ответа выдается искаженное число (в нашем случае ответом будет байт 00000100b, т.е. число 4). Но зато в флаг переноса CF записывают 1. Это сигнал о том, что получилась неправильная сумма (если переноса не было, то в CF записывают 0). Затем можно проанализировать этот флаг (подходящие средства для этого есть) и «поймать» такую ошибку.
Особенности вычитания на компьютере(беззнаковые числа)
При вычитании беззнаковых чисел также возникает проблема: что делать, если при вычитании x – y число x меньше числа y? Ведь в этом случае получается отрицательный результат, а это уже вне области беззнаковых чисел.
В ПК поступают следующим образом: при x>=y выполняется обычное вычитание, но если x<y, тогда числу х дается «заем» единицы (к числу x прибавляется величина 2k) и только после этого производится вычитание. Полученное таким образом число и объявляется разностью. Например, при k=8 вычитание 1–2 происходит таким образом:
1 – 2 → (28 + 1) –2 = (256 +1) – 2 = 257 – 2 = 255
(в двоичной системе замена 1 на 256+1 – это замена 00000001 на 100000001, т.е. приписывание 1 слева) и именно число 255 объявляется результатом вычитания 1 – 2. При этом ошибка не фиксируется, зато в флаг переноса CF заносится 1, что сигнализирует о заеме единицы, о неправильном результате (при x>=y в CF заносится 0).
Особенности сложения и вычитания знаковых чисел
Оказывается, если целые со знаком представлены в дополнительном коде, то складывать и вычитать их можно по алгоритмам для беззнаковых чисел. Делается это так: дополнительные коды знаковых операндов рассматривают как числа без знака и в таком виде их складывают и вычитают, а полученный результат затем рассматривают как дополнительный код знакового ответа.
Пример (для ячейки в 8 битов).
+3 складываем с –1.
Их дополнительные коды это 3 и (256 –1)=255.
Складываем как числа без знака: 3+255 (mod 256) = 258 (mod 256) =2. Рассматриваем 2 как дополнительный код ответа, поэтому получаем ответ +2.
Другой пример: –3+1.
Дополнительные коды: (256–3)=253 и 1.
Складываем как беззнаковые числа: 253+1 (mod 256) = 254. Рассматривая 254 как доп.код ответа, получаем результат –2 (254 = 256 –2).
Переполнение мантиссы при сложении (вычитании)
Однако и при сложении (и вычитании) знаковых чисел, есть свои неприятности. Например, при размере ячеек в 8 битов (а там числа представляются в интервале от –128 до +127) сложим +127 и +2. Получаем 129. Рассматривая его как доп.код ответа, получаем: 129 = 256 –127, т.е. результат –127! При складывании положительных чисел получили отрицательное число! В чем тут дело?
Дело в том, что результат 129=10000001b, т.е. мы залезли в знаковый разряд. Такое налезание модуля (мантиссы, цифровой части) числа на знаковый разряд называется «переполнением мантиссы». В общем случае оно происходит при сложении чисел одного знака, когда настоящая сумма оказывается вне диапазона представления знаковых чисел. Переполнение мантиссы фиксируется в флаге переполнения OF: он получает значение 1 , если было переполнение, и значение 0 иначе.
Аналогичное переполнение мантиссы возможно и при вычитании. Например: (+127)–(–2) = 127+2=129, а это доп.код числа –127, но истинный результат 129! И здесь факт переполнения фиксируется в флаге OF: он получает значение 1, если было переполнение мантиссы и результат операции неправильный, и значение 0, если не было переполнения и ответ правильный.
Итак, при сложении и вычитании как беззнаковых, так и знаковых чисел возможны особые случаи, когда настоящий (в математическом смысле) результат выходит за диапазон представимых чисел, и тогда результат искажается. Такое искажение результата фиксируется в флагах CF и DF. Распознать такую ошибку можно анализом этих флагов. Причем программист должен сам следить за тем или иным флагом, зная какие числа складываются (вычитаются) – знаковые или беззнаковые:
для беззнаковых анализировать флаг CF,
для знаковых – флаг OF.
Флаг нуля и Флаг знака при сложении (вычитании)
При сложении и вычитании чисел меняются также флаг нуля ZF и флаг знака SF. Флаг ZF получает значение 1, если результат оказался нулевым, и значение 0, если результат оказался ненулевым; это флаг представляет интерес при работе как со знаковыми, так и беззнаковыми числами.
В флаг SF заносится знаковый (самый левый) бит результата; этот флаг полезен при работе со знаковыми числами, т.к. он получает значение 1, если результат оказался отрицательным, и значение 0 иначе.
Примеры (ячейки размеров в байт):
9 – 9 = 0 =00000000b => ZF=1, SF=0
8 – 9= –1 = 11111111b => ZF=0, SF=1
9 – 8 = 1 = 00000001b => ZF=0, SF=0
28. Команды сложения и вычитания на Ассемблере.
Имеется несколько команд сложения и вычитания.
Команда сложения: ADD приемник, источник
Выполняется она так: приемник складывается с источником и рузультат помещается в приемник.
Имеются так же команды сложения:
INC источник — увеличение источника на единицу
DEC источник — уменьшение источника на единицу
NEG источник — команда изменения знака
ADC приемник, источник — команда сложения с учетом переноса, ее отличие от команды ADD в том,что она к сумме операндов прибавляет значение флага переноса CF
Команда вычитания: SUB приемник, источник
Выполняется она так: из приемника вычитается источник и результат помещается в приемник.
Имеются так же команды вычитания:
SBB приемник, источник — команда вычитания с учетом переноса, ее отличие от команды SUB в том,что она от разности операндо отнимает значение флага переноса CF
Например,
ADD AH, 12 ; AH:=AH+12
SUB SI, Z ; SI:=SI –Z
ADD Z, –300 ; Z:=Z+(–300)
Эти команды работают как с числами размером в байт, так и с числами размером в слово или двойное слово; нельзя, чтобы один операнд был байтом, а другой – словом или двойным словом.