ассемблер. вопросы практика. Add inc операнд операция инкремента
Скачать 29.5 Kb.
|
1 Вопросы для зачета по работе: 1. Какая команда выполняет сложение чисел? Команда сложения ADD. INC операнд — операция инкремента, то есть увеличения значения операнда на 1; операнд = операнд +1 2. Какой синтаксис команды сложения чисел? Команды ADD (add - сложить) и ADC (add with carry - сложить с переносом) могут складывать как 8-, так и 16-битовые операнды. Команда ADD складывает содержимое операнда-источника и операнда-приемника и помещает результат в операнд-приемник. В символической нотации ее действия можно описать как ADD операнд_1,операнд_2 Операнд_1 = операнд_1 + операнд_2 3. Какая команда выполняет сложение чисел с учётом флага переноса? Команда сложения с добавлением переноса ADC 4. Какой синтаксис команды сложения чисел с учётом флага переноса? Команда ADC делает то же, что и команда ADD, но при сложении использует также флаг переноса CF, что можно записать следующим образом: ADC операнд_1,операнд_2 операнд_1 = операнд_1 + операнд_2 + значение_cf Флаг переноса CF равен 1, если результат сложения не помещается в операнде-приемнике; в противном случае он равен 0. Флаг четности PF равен 1, если результат имеет четное число битов со значением 1; в противном случае он равен 0. Вспомогательный флаг переноса AF равен 1, если результат сложения десятичных чисел требует коррекции; в противном случае он равен 0. Флаг нуля ZF равен 1, если результат равен 0; в противном случае он равен 0. Флаг знака SF равен 1, если результат отрицателен (старший бит равен 1); в противном случае он равен 0. Флаг переполнения OF равен 1, если сложение двух чисел одного знака (оба положительные или оба отрицательные) приводит к результату, который превышает диапазон допустимых значений приемника в обратном коде, а сам приемник при этом меняет знак. В противном случае флаг OF равен 0. Флаги SF и OF имеют смысл только при сложении чисел со знаком, а флаг AF -только при сложении десятичных чисел. 5. Какая команда выполняет вычитание чисел? Инструкция SUB выполняет вычитание операндов. Как и в случае с инструкцией ADD результат операции помещается в первый операнд. На самом деле процессор не умеет вычитать числа. Он все делает через сложение Просто перед сложением он подменяет знак второго операнда на противоположный. Так что между инструкциями SUB и ADD даже больше общего. 6. Какой синтаксис команды вычитания чисел? SUB операнд_1,операнд_2 операнд_1 = операнд_1 - операнд_2 7. Какая команда выполняет вычитание чисел с учётом флага переноса? SBB (substract with borrow - вычесть с заемом) 8. Какой синтаксис команды вычитания чисел с учётом флага переноса? SBB операнд_1,операнд_2 операнд_1 = операнд_1 – операнд_2 – значение_cf флаг cf выполняет роль индикатора заема 1 из старшего разряда при вычитании чисел DEC операнд — операция декремента, то есть уменьшения значения операнда на 1 NEG операнд — отрицание с дополнением до двух. 9. Какая команда выполняет умножение без знака? Для умножения чисел без знака предназначена команда MUL сомножитель_1 10. Какой синтаксис команды умножения без знака? Синтаксис команды: MUL Возможные варианты команды: MUL reg/mem Команда MUL (Unsigned Multiply) относится к группе команд целочисленной (или двоичной) арифметики (Binary Arithmetic Instructions) и производит умножение двух беззнаковых целочисленных операндов. Операнд-назначение (DEST) задается неявно и является переменной в регистре (или регистровой паре) AX, DX:AX 11. Для чего используется флаг CF в команде умножения без знака? В результате выполнения команды MUL устанавливаются два флага: переноса CF и переполнения OF, если значение старшей половины произведения не равно нулю. Флаг CF обычно он используется при анализе результатов выполнения арифметических команд с целыми числами без знака. Например, при умножении регистра АХ на 16- разрядный операнд, произведение сохраняется в паре регистров DX: АХ. При этом, если регистр DX не равен нулю, будет установлен флаг переноса СF. Для арифметических операций над беззнаковыми числами флаг переноса — это признак переполнения 12. Какая команда выполняет умножение чисел со знаком? Для умножения чисел со знаком предназначена команда IMUL 13. Для чего используется флаг OF в команде умножения чисел со знаком? В результате выполнения команды IMUL устанавливаются два флага: переноса СF и переполнения OF, если значение старшей половины произведения не является расширением знакового разряда, взятым с младшей половины произведения. Флаг OF обычно используется при анализе результатов выполнения арифметических команд с целыми числами со знаком. 14. Какой синтаксис команды умножения чисел со знаком? IMUL имеет три формы, различающиеся количеством операндов: С одним операндом — форма, аналогичная команде MUL. В качестве операнда указывается множитель. Местоположение другого множителя и результата определяется по таблице. С двумя операндами — указываются два множителя. Результат записывается на место первого множителя. Старшая часть результата в этом случае игнорируется. Кстати, эта форма команды не работает с операндами размером 1 байт.(для процессоров 80186+) С тремя операндами — указывается положение результата, первого и второго множителя. Второй множитель должен быть непосредственным значением. Результат имеет такой же размер, как первый множитель, старшая часть результата игнорируется. Это форма тоже не работает с однобайтными множителями. .(для процессоров 80186+) imul cl ; AX = AL * CL imul si ; DX:AX = AX * SI imul bx,ax ; BX = BX * AX imul cx,-5 ; CX = CX * (-5) imul dx,bx,134h ; DX = BX * 134h 15. Какую команду используют для деление чисел без знака? Деление целых двоичных чисел — это всегда деление с остатком! По аналогии с умножением, размер делителя, частного и остатка должен быть в 2 раза меньше размера делимого. Деление чисел без знака осуществляется с помощью команды DIV. 16. Какой синтаксис команды деление чисел без знака? DIV op1 Если размерность операнда составляет 8 бит, то команда производит целочисленное деление содержимого регистра AX на значение операнда и помещает результат деления в регистр AL, а остаток - в регистр AH. Если операнд - 16-битное слово, команда производит целочисленное деление содержимого пары регистров DX:AX на значение операнда и помещает результат деления в регистр AX, а остаток - в регистр DX. 17. Какие команды используются для расширения целого числа со знаком? Команды CBW, CWD, CWDE и CDQ используются для расширения размерности числа с учетом знака. Команда CBW (Convert Byte to Word) расширяет байт до слова. Команда CWD (Convert Word to Double) расширяет слово до двойного слова. И наконец команда CDQ (Convert Double to Quad) расширяет двойное слово до четверного слова. 18. Какой синтаксис имеют команды расширения целого числа со знаком? CBW Команда CBW преобразовывает имеющий знак байт в регистре AL в имеющее знак слово в регистре AX путем расширения старшего бита регистра AL (бита знака) на все биты регистра AH. CWD Команда CWD преобразовывает имеющее знак слово в регистре AX в имеющее знак двойное слово в паре регистров DX:AX путем расширения старшего бита регистра AX (бита знака) на все биты регистра DX. CWDE (80386+) Команда CWDE преобразовывает имеющее знак слово в регистре AX в имеющее знак двойное слово в регистре EAX путем расширения старшего бита регистра AX (бита знака) на два старших байта регистра EAX. CDQ (80386+) Команда CDQ преобразовывает имеющее знак двойное слово в регистре EAX в имеющее знак 8-байтовое значение в паре регистров EDX:EAX путем расширения старшего бита регистра EAX (бита знака) на регистр EDX 19. Какая команда используются для деления целого числа со знаком? IDIV - деление со знаком 20. Какой синтаксис имеет команда деления целого числа со знаком? Команда IDIV позволяет выполнить деление целых чисел со знаком. Она имеет те же форматы операнда, что и команда DIV. При делении на 8-разрядное число, перед выполнением команды IDIV нужно расширить знак делимого в регистр АН с помощью команды CBW После выполнения команды IDIV в регистре AL будет находиться частное, а в регистре АН — остаток По аналогии, при выполнении деления на 16-разрядное число, необходимо вначале расширить знак регистра АХ в регистр DX. 21. Какие ошибки могут возникнуть при использовании команд деления? Если при выполнении команды деления получается частное, размер которого превышает размер выделяемого для его размещения операнда, возникает ситуация переполнения при делении. Это приводит к прерыванию работы процессора и завершению работы текущей программы Неполное деление; эта ошибка возникает, если объем членов деления составляет лишь часть объема делимого понятия Деление на 0 2 Вопросы для зачета по работе: 1. Перечислите флаги, используемые при выполнении условных переходов. Мнемоническое обозначение некоторых команд условного перехода отражает название флага, с которым они работают, и имеет следующую структуру: первым идет символ “j” (jump, переход), вторым — либо обозначение флага, либо символ отрицания “n”, после которого стоит название флага. Такая структура команды отражает ее назначение. Если символа “n” нет, то проверяется состояние флага, и если он равен 1, производится переход на метку перехода. Если символ “n” присутствует, то проверяется состояние флага на равенство 0, и в случае успеха производится переход на метку перехода. Эти команды можно использовать после любых команд, изменяющих указанные флаги.
2. Охарактеризуйте группу команд сравнения операндов. Инструкция CMP (сокр. от compare - сравнить) сравнивает два значения - регистр, память, непосредственное значение, - и устанавливает/сбрасывает флаг ZF. При этом процессор, получив инструкцию cmp, вычисляет разность указанных значений. Теперь должно быть понятно: если значения равны, то результат вычитания будет 0, следовательно поднимается флаг нуля (ZF=1) Инструкция CMP отличается от аналогичной sub (substraction - вычитание) тем, что влияет только на регистр флагов. Инструкция TEST. Получив такую команду, процессор выполняет операцию AND (логическое И) с двумя операндами. Т.е. выполняется побитовое логическое умножение. Если логическое И выдаст только нули, тогда поднимается флаг ZF. Инструкция test так же влияет только на регистр флагов, в этом ее отличие от инструкции AND Выводы: во-первых, CMP и TEST влияют на флаг нуля противоположным образом. Во-вторых, команду TEST нельзя использовать для проверки равенства значений! 3. Охарактеризуйте группу команд условных переходов, ориентированных на сравнение беззнаковых чисел. Команды условного перехода осуществляют переход, который выполняется только в случае истинности некоторого условия. Истинность условия проверяется по значениям флагов. Поэтому обычно непосредственно перед командой условного перехода ставится команда сравнения, которая формирует значения флагов Все команды условного перехода можно разделить на три группы. В первую группу входят команды, которые обычно ставятся после команды сравнения. В их мнемокодах указывается тот результат сравнения, при котором надо делать переход. Во вторую группу команд условного перехода входят те, которые обычно ставятся после команд, отличных от команды сравнения, и которые реагируют на то или иное значение какого-либо флага. И, наконец, в третью группу входят две команды условного перехода, проверяющие не флаги, а значение регистра ECX или CX. Однако эта команда выполняется достаточно долго. Выгоднее провести сравнение с нулём и использовать обычную команду условного перехода 4. Охарактеризуйте группу команд условных переходов, ориентированных на сравнение знаковых чисел. В командах, предназначенных для переходов по результатам сравнения чисел со знаком, анализируются флаги SF и OF, а в командах для беззнаковых сравнений – флаг CF. В любом случае равенство или неравенство чисел отражается состоянием флага ZF 4 Вопросы для зачета по работе: 1. Что такое массив? Массив — это контейнер, содержащий фиксированное количество элементов одного типа. В большинстве структур данных массивы используются для реализации алгоритмов. Все значения этой совокупности объединены под одним именем Термины, необходимые для понимания концепции массивов: Элемент. Это любой элемент, хранящийся в массиве. Индекс. Это числовой индекс, использующийся для идентификации элемента в массиве. У каждого элемента он свой. 2. Как располагаются в памяти элементы одномерного массива? Массив располагается в памяти последовательно, элемент за элементом. Сначала лежит нулевой, потом первый и т.д. Элементы располагаются по возрастанию адреса: Один элемент массива отстоит от другого на количество байт, равное базовому типу массива. К каждому элементу массива имеется прямой доступ. Это означает, что для того чтобы обратиться к какому-либо элементу массива, нет нужды перебирать все его предыдущие элементы, достаточно указать номер этого элемента 3. Как обратится к элементу массива на языке С? В C++ нумерация элементов массива идет с нуля. Таким образом второй элемент будет иметь индекс 1, а десятый — 9 Для обращения к элементу массива в C++ мы должны использовать следующею конструкцию: <любой код> <имя массива> [ <№ элемента> ] <любой код> |