Семинары по курсу «Архитектура ЭВМ и язык ассемблера» учебно-методическое пособие. Часть 1. - Е.А. Кузьменкова_ В.С. Махнычев_ В.А. Падарян (1110587), страница 10
Текст из файла (страница 10)
По заданномуассемблерному коду, реализующему данную операцию сравнения, требуетсявосстановить data_t и COMP (возможно несколько вариантов решения).(A)TEST EСX, EСXSETNE AL(В)TEST СL, СLSETG AL(Б)TEST СX, СXSETE AL(Г)TEST СX, СXSETA ALЗадача 5-2 Восстановление типа и операции сравненияНиже приведен код на языке Си, где data_t – некоторый целочисленный типданных, а COMP – некоторая операция сравнения. Пусть переменная a расположенав регистре EDX, а переменная b в регистре ECX.
По заданному ассемблерному коду,реализующему данную операцию сравнения, требуется восстановить data_t иCOMP (возможно несколько вариантов решения).int comp(data_t a, data_t b) {return a COMP b;}(А)CMP DX, CXSETGE AL(В)CMP EDX, ECXSETNE AL(Б)CMP DL, CLSETB AL63Задача 5-3 Реализация тернарного оператора на языке ассемблераДан фрагмент Си-кода.int x, y = 100, a = 0, b = 1;x = y <= 0 ? a : b;Требуется реализовать тернарный оператор x = (y <= 0? a : b) на языкеассемблера, используя инструкцию CMOVcc.Задача 5-4 Модуль числаТребуется составить программу, которая для заданного с клавиатуры числапечатает модуль этого числа.Задача 5-5 Реализация тела функцииДана Си-функция.void cond(int a, int *p) {if (p && a > 0) {*p += a;}}Требуется написать соответствующий код на языке ассемблера.
Размещениеформальных параметров функции считать следующим:mov edx, dword [ebp + 8] ; int amov eax, dword [ebp + 12] ; int *pЗадача 5-6 Вычисление факториалаТребуется написать ассемблерную программу, вычисляющую факториал заданногочисла.Задача 5-7 Вычисление суммы арифметической прогрессииТребуется написать ассемблерную программу, вычисляющую сумму первых членоварифметической прогрессии.
С клавиатуры задаются: первый член прогрессии,шаг, количество членом прогрессии, которые требуется суммировать.Задача 5-8 Восстановление структуры программы: ветвленияДан ассемблерный код, реализующий код Си-функции.64mov eax, dword [ebp + 8] ; параметр xmov edx, dword [ebp + 12] ; параметр ycmp eax, -3jge l2cmp eax, edxgle l3imull eax, edxjmp l4l3:lea eax, dword [eax + edx]jmp l4l2:cmp eax, 2jg l5xor eax, edxjmp l4l5:sub eax, edxl4:Сама Си-функция задана с пропущенными выражениями в операторах.int test(int x, int y) {int val = __________;if (______) {if (______) {val = __________;} else {val = __________;}} else if (______) {val = __________;}return val;}Требуется восстановить пропущенные выражения.Задача 5-9 Восстановление структуры программы: ветвленияДан ассемблерный код, реализующий код на языке Си.65movmovcmpjgjlxorjmpebx,ecx,ebx,.L7.L8eax,.L9dword [a]dword [b]ecxmovmovsarsubidivjmpedx,eax,edx,ecx,ecx.L9dword [c]edx31ebxmovmovsarsubidivedx,eax,edx,ebx,ebxdword [c]edx31ecxmovdword [d], eax...static _____________________static _____________________static _____________________static _____________________if (__________) {d = ________________;} else if (__________) {d = ________________;} else {d = ________________;}eax.L8:....L7:.L9:Требуется восстановить пропуски в Си-коде.Задача 5-10 Числа с различными цифрамиНапечатать все двузначные числа, у которых цифры не равны между собой.Задача 5-11 Восстановление структуры программы: циклыДан код на языке Сиint dw_loop(int x, int y, int n) { //1{//2do {//3x += n;//4y *= n;//5n--;//6} while ((n > 0) && (y < n));//7return x;//8}компилятор генерирует следующий ассемблерный код:66a;b;c;d;mov eax, dword [ebp + 8] ;mov ecx, dword [ebp + 12] ;mov edx, dword [ebp + 16] ;L2:;add eax, edx;imul ecx, edx;sub edx, 1;test edx, edx;jle L5;cmp ecx, edx;jl L2;L5:;(1) переменная x(2) переменная y(3) переменная n(4)(5)(6)(7)(8)(9)(10)(11)(12)Разметить ассемблерный код комментариями, выделив в нем выражение-условие,проверяемое в цикле, и операторы, составляющие тело цикла в Си-коде.Задача 5-12 Переход на меткуУказать, на какую метку будет осуществлен переход при выполнении следующегофрагмента ассемблерного кода:mov al, -80cmp al, 150jb M1jl M2jmp M3Задача 5-13 Сумма цифр числаНайти сумму цифр заданного неотрицательного целого числа типа unsigned int.Задача 5-14 Число ФибоначчиНайти первое по порядку число Фибоначчи, превосходящее заданноенеотрицательное значение N (N > 1).
Числа Фибоначчи задаются соотношением:F0 = F1 = 1, Fk = Fk-1 + Fk-2, k ≥ 2.Задача 5-15 Максимум последовательностиДана последовательность из 30 целых чисел. Найти:a) максимум данной последовательности,b) номер максимального элемента последовательности (считать, чтопоследовательность не содержит повторяющихся элементов),c) количество вхождений максимального элемента в последовательность.67Ответы и решенияЗадача 1-1Двоичноепредставление (байт)16-ричноепредставление(байт)Числодесятичное сознакомЧислодесятичное беззнакаBDh76h28h87h-6711840-1211891184013510111101011101100010100010000111Задача 1-5(а) EAX = 0xdde(е) EAX = 0xfffffef0(б) EAX = 0xd(ж) EAX = 0xffff000d(в) EAX = 0xcafe(з) EAX = 0xffff006f(г) EAX = 0xfffffffe(и) EAX = 0xff79000d(д) EAX = 0xffff00ba(к) EAX = 0x2179fffeЗадача 1-6section .bssa resd 1b resd 1section .textmov al, byte [a]mov byte [b], almov al, byte [a +mov byte [b + 3],mov ax, word [a +mov word [b + 1],Задача 2-1; amovzx eax, byte [a]mov dword [b], eax; bmovsx eax, byte [a]mov word [b], eax681]al2]axЗадача 2-2(a) ALзнаковое =(b) ALзнаковое =(c) ALзнаковое =(d) ALзнаковое =-118,ALбеззнаковое = 138, CF = 1, OF = 0, ZF = 0, SF = 1.5,ALбеззнаковое = 5,-90,ALбеззнаковое = 166, CF = 1, OF = 0, ZF = 0, SF = 1.58,ALбеззнаковое = 58,CF = 0, OF = 0, ZF = 0, SF = 0.CF = 1, OF = 0, ZF = 0, SF = 0.Задача 3-1void decode2(int *xp, int *yp, int *zp) {int y = *yp;*yp = *xp + *zp;*xp = *yp;*zp = y;}Задача 4-4eax = -8edx = 65528Задача 4-12 Обращение операцийz dw 0x1ee7xor eax, eaxorax, word [z]imul eax, eax, 16; EAX = 0x1ee70Задача 5-1(А)data_t – int, unsigned, указатель,для целочисленных типов допустим спецификатор longCOMP - !=(Б)data_t – short или unsigned shortCOMP - ==(В)data_t – charCOMP - >(Г)data_t – unsigned shortCOMP - >69Задача 5-2(А)data_t – shortCOMP - >=(Б)data_t – unsigned charCOMP - <(В)data_t – int, unsigned, указатель;для целочисленных типов допустим спецификатор longCOMP - !=Задача 5-3section .bssx resd 1section .datay dd 100a dd 0b dd 1section .textglobal CMAINCMAIN:cmp dword [y], 0mov eax, dword [b]cmovle eax, dword [a]mov dword [x], eax70Задача 5-4%include 'io.inc'section .textglobal CMAINCMAIN:GET_DEC 4, eaxcmp eax, 0jge labelneg eaxlabel:PRINT_DEC 4, eaxNEWLINExor eax, eaxretЗадача 5-5test eax, eaxjz labeltest edx, edxjle labeladd dword [eax], edxlabel:Задача 5-6%include 'io.inc'section .textglobal CMAINCMAIN:GET_DEC 4, ecxmov eax, 1jecxz end_labelloop_body:imul eax, ecxloop loop_bodyend_label:PRINT_DEC 4, eaxmov eax, 0ret71Задача 5-7%include 'io.inc'section .textglobal CMAINCMAIN:GET_DEC 4, ebx ; первый членGET_DEC 4, edx ; шаг прогрессииGET_DEC 4, ecx ; количество шаговxor eaxjexcz end_labelloop_body:add eax, ebxadd ebx, edxloop loop_bodyend_label:PRINT_DEC 4, eaxmov eax, 0retЗадача 5-8int test(int x, int y) {int val = x^y;if (x < -3) {if (y < x) {val = x * y;} else {val = x + y;}} else if (x > 2) {val = x - y;}return val;}Восстанавливать можно по следующей методике.
В первую очередь выявляютсялинейные блоки. Строится граф потока управления для ассемблерной программы.Этот граф сопоставляется с предложенным шаблоном программы. В концахбазовых блоков выявляются пары инструкций CMP Jcc, которые позволяютвосстановить условия операторов if и их ветви. Следует отметить, что длязаданного ассемблерного кода будет корректно и такое восстановление.72int test(int x, int y) {int val;if (x < -3) {if (y < x) {val = x * y;} else {val = x + y;}} else if (x > 2) {val = x - y;} else {val = x^y;}return val;}Задача 5-9...static int a;static int b;static int c;static int d;if (a > b) {d = c / (a - b);} else if (a < b) {d = c / (b - a);} else {d = 0;}...73Задача 5-10%include 'io.inc'section .textglobal CMAINCMAIN:mov eax, 1.loop1:cmp eax, 10jge .exit1xor ebx, ebx.loop2:cmp ebx, 10jge .exit2cmp eax, ebxje .lcPRINT_DEC 4, eaxPRINT_DEC 4, ebxNEWLINE.lc:inc ebxjmp .loop2.exit2:inc eaxjmp .loop1.exit1:xor eax, eaxret; цикл по старшей цифре; цикл по младшей цифре; проверка цифр на неравенствоЗадача 5-11mov eax, dword [ebp + 8] ; (1) переменная xmov ecx, dword [ebp + 12] ; (2) переменная ymov edx, dword [ebp + 16] ; (3) переменная nL2:; (4)add eax, edx; (5) x += n;imul ecx, edx; (6) y *= n;sub edx, 1; (7) n--;test edx, edx; (8) n v 0jle L5; (9) n <= 0 – выходим из циклаcmp ecx, edx; (10) y v njl L2; (11) y < n;переходим на новую итерациюL5:; (12)Задача 5-12Ответ: M374Решение:mov al, -80; доп(-80) = 176cmp al, 150; 150 = доп(-106)jb M1jl M2jmp M3Переход на метку M1 не будет осуществлен, поскольку 176 > 150; переход на меткуM2 также не будет осуществлен, т.к.
-80 > -106. Будет выполнен переход на меткуM3.75Литература761.Рэндал Э. Брайант, Дэвид О’Халларон. Компьютерные системы: архитектураи программирование (Computer Systems: A Programmer’s Perspective).Издательство: БХВ-Петербург, 2005 г. — 1186 стр.2.Henry S. Warren.
Hacker's Delight (2nd Edition). / Addison-Wesley Professional; 2edition (October 5, 2012) — р. 5123.А.А. Белеванцев, С.С. Гайсарян, Л.С. Корухова, Е.А. Кузьменкова,В.С. Махнычев. Семинары по курсу “Алгоритмы и алгоритмические языки”(учебно-методическое пособие для студентов 1 курса ). М.: Издательскийотдел факультета ВМК МГУ имени М.В. Ломоносова4.А.А.
Белеванцев, С.С. Гайсарян, В.П. Иванников, Л.С. Корухова, В.А. Падарян.Задачи экзаменов по вводному курсу программирования(учебно - методическое пособие). М.: Изд. отдел ф-та ВМК МГУ имени М.В.Ломоносова, 2012.5.К.А. Батузов, А.А. Белеванцев, Р.А. Жуйков, А.О. Кудрявцев, В.А. Падарян,М.А. Соловьев. Практические задачи по вводному курсу программирования(учебное пособие). М.: Изд. отдел ф-та ВМК МГУ имени М.В. Ломоносова,2012..