Лабораторная работа 3 Основы языка Ассемблер. Команды условных и безусловных переходов Цель работы
Скачать 20.09 Kb.
|
Лабораторная работа №3Основы языка Ассемблер.Команды условных и безусловных переходовЦель работы Получить навыки использования операторов сравнения (cmp), условных(Jxx), безусловных (JMP) переходов и циклов (LOOP). Описание команд В ассемблере команда безусловного перехода (аналог GOTO) имеет вид: JMP <метка>. Она обеспечивает переход на помеченную меткой команду в пределах одного сегмента кода. Команды условного перехода записываются единообразно: Jxxx <метка> где операнд указывает метку, на которую надо сделать переход в случае выполнения некоторого условия, а КОП начинается буквой J, за которой следует от одной до трех букв, описывающих это условие. Список кодов команд арифметического условного перехода, используемых после команды сравнения (CMP op1,op2), приведен ниже. Мнемокод Условие перехода Значения флагов для любых чисел JE op1=op2 ZF=1 E - equal JNE op1<>op2 ZF=0 NE - not equal для чисел со знаком JL, JNGE op1 JLE, JNG op1<=op2 SF<>OF или ZF=1 LE - less or equal JG, JNLE op1>op2 SF=OF и ZF=0 G - greater JGE, JNL op1>=op2 SF=OF GE - greater or equal для чисел без знака JB, JNAE op1 JBE, JNA op1<=op2 CF=1 или ZF=1 JA, JNBE op1>op2 CF=0 и ZF=0 JAE, JNB op1>=op2 CF=0 Во вторую группу команд условного перехода входят команды, реагирующие на значение флага. В кодах этих команд указываются буквы проверяемого флага: Мнемокод Условие перехода Мнемокод Условие перехода JZ ZF=1 JNZ ZF=0 JS SF=1 JNS SF=0 JC CF=1 JNC CF=0 JO OF=1 JNO OF=0 JP PF=1 JNP PF=0 Команда условного перехода JCXZ <метка> проверяет значение регистра CX. Действие этой команды можно описать так: if CX=0 then goto <метка>. Еще одна команда LOOP <метка> обеспечивает управление циклом по счетчику в регистре ECX. Она ставится последней в цикле с известным числом повторений. Действие этой команды можно описать так: ECX:=ECX-1; if ECX <> 0 then goto <метка>. Учтите, что цикл с командой LOOP всегда выполняется хотя бы один раз. Если начальное значение EСХ равно 0, цикл будет выполняться 65536 раз. (Подумайте почему!) Команды условного перехода обеспечивают только короткий переход, т.е. переход по адресу в пределах от -128 до +127 байт. Если метка расположена дальше этих значений, ассемблер фиксирует ошибку. Для организации вложенных циклов значение счётчика внешнего цикла можно положить в стек командой push, если он не нужен во внутреннем цикле. После выполнения внутреннего цикла значение счётчика можно извлечь командой pop. Примеp: if (X>10) CMP X,10 { JLE M1 //если X<=10, перепрыгиваем на M1 <тело> <тело> } M1: if (X>10) CMP X,10; { JLE M1; //если X<=10, перепрыгиваем на M1 <тело1> <тело1> } JMP M2; //перепрыгиваем на M2 else M1: { <тело2> <тело2> M2: } ECX = 10; MOV ECX, 10; do M1: { <тело> <тело> LOOP M1; ECX--; } while (ECX!=0) I = 10; MOV ECX, 10; do M1: { PUSH ECX; //Сохраняем ECX в стек J = 20; MOV ECX, 20; do M2: { <тело> <тело> LOOP M2; //Берём ECX из стека I--; POP ECX; } LOOP M1; while (J!=0) I--; } while (I!=0) while (ECX < 10) M1: { CMP ECX, 10 <тело> JGE M2 ECX++; <тело> } INC ECX; JMP M1; M2: Задание Задание из двух частей. В первом задании необходимо подсчитать количество чисел, соответствующих определенному условию на некотором числовом промежутке. Во втором задании требуется модифицировать свою программу так, чтобы найти и вывести на экран двухсотое число или пару чисел соответствующих заданному условию. Если таких чисел меньше двухсот, то вывести об этом сообщение на экран. Для выполнения задания выделяется 8 часов аудиторного времени. Варианты 1) На промежутке от 1 до 90 000. Подсчитать количество таких чисел X, что (Х+Х-1) - простое число. Ответ вывести на экран. 2) На промежутке от 1 до 127. Подсчитать количество таких чисел X, что ((Х*Х)-1) - простое число. Ответ вывести на экран. 3) На промежутке от 1 до 100 000. Подсчитать количество таких чисел X, что (Х+X-2) - делится на 3 без остатка. Ответ вывести на экран. 4) На промежутке от 1 до 255. Подсчитать количество таких пар чисел X и У, что (Х*У) при делении на 303 дает в остатке 1. Ответ вывести на экран. 5) На промежутке от -127 до 127. Подсчитать количество таких пар чисел X и Y, что (Х+У) = 80. Ответ вывести на экран. 6) На промежутке от -128 до 127. Подсчитать количество таких пар чисел X и Y, что (/Х/+У) <=70. Ответ вывести на экран. 7) На промежутке от -128 до 127. Подсчитать количество таких пар чисел X и Y, что 50 < (Х-У) <= 80. Ответ вывести на экран. 8) На промежутке от 1 до 100 000. Подсчитать количество таких чисел X, что (Х+Х-1)div500 - простое число. Ответ вывести на экран. 9) На промежутке от 1 до 32768. Подсчитать количество таких чисел X, что ((Хdiv21))-1) - четное число. Ответ вывести на экран. 10) На промежутке от -128 до 127. Подсчитать количество таких пар чисел X и Y, что Х/Y дает в остатке 0. Ответ вывести на экран. 11) На промежутке от -128 до 127. Подсчитать количество таких пар чисел X и У, что (Х*У-(Xdiv2))=0. Ответ вывести на экран. 12) На промежутке от -128 до 127. Подсчитать количество таких пар чисел X и Y, что (Х+У*X) 5000. Ответ вывести на экран. 13) На промежутке от -128 до 127. Подсчитать количество таких пар чисел X и Y, что (|Х|+У)div50 =>100. Ответ вывести на экран. 14) На промежутке от -128 до 127. Подсчитать количество таких пар чисел X и Y, что (|Х|-|У|) mod 4 =0. Ответ вывести на экран. |