Федеральное государственное бюджетное образовательное
учреждение высшего образования 
Московский государственный университет имени М.В. Ломоносова
Факультет вычислительной математики и кибернетики

УТВЕРЖДАЮ
декан факультета вычислительной математики и кибернетики
______________/И.А. Соколов /
«___» ________________20___г.

РАБОЧАЯ ПРОГРАММА ДИСЦИПЛИНЫ
Наименование дисциплины:
Архитектура ЭВМ и язык Ассемблера
Уровень высшего образования:
бакалавриат
Направление подготовки / специальность:
01.03.02 «Прикладная математика и информатика» (3++)
Направленность (профиль):
Математические и компьютерные методы решения задач естествознания
Форма обучения:
очная

Москва 2023

Рабочая программа дисциплины (модуля) разработана в соответствии с самостоятельно установленным МГУ образовательным стандартом (ОС МГУ) для реализуемых основных профессиональных образовательных программ высшего образования по направлению подготовки 01.03.02, 01.04.02 "Прикладная математика и информатика" программы бакалавриата  Утвержден приказом МГУ от 30 августа 2019 года № 1041 (в редакции приказов МГУ от 11 сентября 2019 года № 1109, от 10 июня 2021 года № 609, от 7 октября 2021 года № 1048, от 21 декабря 2021 года № 1404, от 2 ноября 2022 года № 1299)

1. Дисциплина относится к базовой части ОПОП ВО.

2. Входные требования для освоения дисциплины (модуля): учащиеся должны владеть знаниями по алгоритмам и алгоритмическим языкам в объеме, соответствующем программе первого года обучения основных образовательных программ бакалавриата по укрупненным группам направлений и специальностей 01.00.00 «Математика и механика», 02.00.00 «Компьютерные и информационные науки».

3. Результаты обучения по дисциплине (модулю), соотнесенные с требуемыми компетенциями выпускников.

Компетенции выпускников, частично формируемые при реализации дисциплины (модуля):

•	ПК-4.Б Способность применять в профессиональной деятельности современные средства разработки программного обеспечения и методы параллельной обработки данных, реализовывать отдельные этапы разработки системного и прикладного программного обеспечения, систем обработки и анализа данных, сетевых технологий
•	ПК-5.Б Способность определить совокупность математических методов и программных решений для отдельного этапа решения прикладной задачи в рамках заданной схемы 
Планируемые результаты обучения по дисциплине (модулю):

Знать:
1.	основные принципы устройства ЭВМ, его основные компоненты, их качественные и количественные характеристики.
2.	особенности архитектуры IA-32, влияние архитектуры набора команд на реализацию языков высокого уровня и систему программирования.
3.	язык ассемблера архитектуры IA-32.
4.	особенности реализации различных конструкций языка Си на уровне языка ассемблера и причины, влияющие на выбор механизма реализации.
5.	свойства аппаратуры, влияющие на производительность и безопасность работы программ.
6.	особенности двоичного (бинарного) интерфейса приложений на примере архитектуры IA-32.

Уметь:  
1.	составлять и отлаживать многомодульные программы на языках Си и ассемблера;
2.	использовать стандартную библиотеку языка Си, в том числе в программах на языке ассемблера.
3.	обосновано выбирать механизмы реализации конструкций языка Си и корректно их кодировать на языке ассемблера архитектуры IA-32.
4.	оценивать производительность программ на языках Си и ассемблера, используя знания об особенностях устройства аппаратуры ЭВМ и аппаратные средства профилирования архитектуры IA-32.
5.	восстанавливать по ассемблерному коду операторы и типы данных языка Си.

Владеть:  
1.	современной технологией разработки и отладки многомодульных программ на языках Си и ассемблера.

4. Формат обучения: лекции проводятся с использованием компьютера и мультимедийного проектора для демонстрации слайдов.

5. Объем дисциплины (модуля) составляет 3 з.е., в том числе 54 академических часов, отведенных на контактную работу обучающихся с преподавателем, 54 академических часов на самостоятельную работу обучающихся. 

6. Содержание дисциплины (модуля), структурированное по темам (разделам) с указанием отведенного на них количества академических часов и виды учебных занятий.
Наименование и краткое содержание разделов и тем дисциплины (модуля),

Форма промежуточной аттестации по дисциплине (модулю)	Всего
(часы)	В том числе	
		Контактная работа 
(работа во взаимодействии с преподавателем)
Виды контактной работы, часы	Самостоятельная работа обучающегося,
 часы 	
		Занятия лекционного типа*	Занятия семинарского типа*	Всего		
1.	Введение в архитектуру ЭВМ. Основные компоненты компьютера. Архитектура IA-32.	5	4	0	4	1	
2.	Организация ассемблерной программы.	2	1	0	1	1	
3.	Операции над целыми числами и машинными словами.	5	4	0	4	1	
4.	Условная и безусловная передача управления. 	5	4	0	4	1	
5.	Адресная арифметика и массивы.	5	4	0	4	1	
6.	Текущий контроль успеваемости: коллоквиум №1	4	0	0	0	4	
7.	Двоичный (бинарный) интерфейс приложений. Выравнивание данных в памяти. Точка входа в программу.	4	3	0	3	1	
8.	Организация вызова функций. Соглашения вызова.	5	5	0	5	0	
9.	Безопасность программ. Механизмы защиты от эксплуатации ошибок.	3	2	0	2	1	
10.	Развитие архитектуры системы команд (на примере Intel64). Совместимость архитектур.	3	2	0	2	1	
11.	Динамическая память: способы организации и характеристики.	3	2	0	2	1	
12.	Числа с плавающей точкой (стандарт IEEE754). Стековый процессор (на примере x87).	5	4	0	4	1	
13.	Текущий контроль успеваемости: коллоквиум №2	4	0	0	0	4	
14.	Система программирования, ассемблирование и компоновка программ.	5	5	0	5	0	
15.	Организация аппаратного обеспечения компьютера.	4	4	0	4	0	
16.	Организация ввода/вывода, периферийные устройства.	2	2	0	2	0	
17.	Локальность и кэширование. Эффективность программ.	4	4	0	4	0	
18.	Загрузка компьютера и многозадачная работа.	4	4	0	4	0	
Промежуточная аттестация: устный экзамен	36	0	0	0	36	
Итого	108	54	0	54	54	

7. Фонд оценочных средств (ФОС) для оценивания результатов обучения по дисциплине (модулю)

7.1. Типовые контрольные задания или иные материалы для проведения текущего контроля успеваемости.

Типовой вариант коллоквиума №1 
1.	Секция .data была размещена в памяти, начиная с базового адреса 0x0804a024. Выпишите значение регистра EAX и флагов после выполнения указанных команд. 
section .data
a dd b 
b dd a 	section .text
   mov   eax, 0xFF00
   add   ah, 0xCD       ; (1)
   movsx eax, word [a+3] ; (2)	Ответ:
(1) EAX = ______________ 
CF = __, OF = __, ZF = __, SF = __
(2) EAX = ______________ 	
2.	По данному фрагменту ассемблерного кода восстановите объявления глобальных Си-переменных и выражение-оператор. 
mov     eax, dword [a]
cdq
idiv    dword [t]
mov     dword [a], edx	mov     ecx, dword [i]
shr     dword [z], cl	moval, byte [s]
cmp     byte [q], al
setl    al
mov     byte [m], al	
___________________________
___________________________
___________________________	___________________________
___________________________
___________________________	___________________________
___________________________
___________________________	
3.	Для данного фрагмента ассемблерного кода восстановите пропуски в соответствующем коде на языке Си. 
mov     edx, dword [a]
mov     eax, dword [c]
lea     eax, [eax+edx*8]
mov     edx, dword [p1]
add     eax, eax
add     eax, dword [b]
movsx   edx, word [edx]
mov     dword [gg+eax*4], edx	// объявление переменных 
_________________________;
______________ gg[5][__][__];
inta, b, c;
// выражение-оператор 
_______________ = _______________;	
4.	Для данного фрагмента ассемблерного кода восстановите пропуски в соответствующем коде на языке Си. 
xor     eax, eax
xor     ebx, ebx
.L3:
mov     ecx, dword[b+eax*4]
mov     edx, dword [a+eax*4]
sub     edx, ecx
cmp     dword [a+eax*4], ecx
cmovl   edx, ebx
mov     dword[c+eax*4], edx
inc     eax
cmp     eax, 1024
jne     .L3	#define N 1024

static int a[N], b[N], c[N];

   for (_______________________) {
____________________________________________;
   }	
5.	Для данного фрагмента Си-кода приведите соответствующий ассемблерный код, причем значение вычисляемого булевского выражения после выполнения оператора должно оказаться в регистре EAX. 
static int *p1, *p2;
static int diff;
p1 && p2 && (diff = p1 – p2++);	

Типовой вариант коллоквиума №2 
1.	Реализуйте заданную функцию на языке ассемблера для платформы IA-32/Linux. 
Дополнительные требования: (1) при вызове функций сохраняйте выравненность стека по 16 байтной границе, (2) код должен отражать особенности компиляции с ключом -fomit-frame-pointer. 
typedef struct link link;

struct link {
  long  data;
  link *next;
};

typedef __attribute__((fastcall)) _Bool (*comparator)(long, long);

link* first(link* p, comparator fp, long data) {
   if ((0 == p) || fp(p->data, data)) {
      return p;
   } else {
      return first(p->next, fp, data);
}
}

2.	Для приведенного Си-кода компилятор построил следующий ассемблерный код (платформа IA-32/Linux). 
#include <stdio.h>

typedef unsigned int uint32_t;

typedef uint32_t Elf32_Word;

typedef uint32_t Elf32_Addr;

typedef struct {
   Elf32_Addr    r_offset;
   Elf32_Word    r_info;
} Elf32_Rel;

unsigned rel_type(FILE* fd) {
   Elf32_Rel rel;

   fread(&rel, sizeof(rel), 1, fd);
   return (rel.r_info) & 0xff;

порядок байт в dword

направление роста адресов

}	rel_type:
	push	ebp
	mov	ebp, esp
	sub	esp, 24
	mov	eax, dword [gs:20]
	mov	dword [ebp-12], eax
	xor	eax, eax
	lea	eax, [ebp-20]
	push	dword [ebp+8]
	push	dword 1
	push	dword 8
	push	eax
	call	fread
	mov	edx, dword [ebp-12]
	xor	edx, dword[gs:20]
	movzx	eax, byte [ebp-16]
	je	.L2
	call	__stack_chk_fail
.L2:
	leave
	ret	
0	1	2	
Нарисуйте устройство фрейма функцииrel_type: 
(1)	где были размещены сохраненные регистры, 
(2)	автоматические локальные переменные, 
(3)	пространство аргументов вызываемых функций, 
(4)	«канарейку» (если использовалась), 
(5)	неиспользуемые элементы стека. 

3	
адрес возврата	

	

	

	

	

3.	Используется 8-ти битный формат, удовлетворяющий требованиям стандарта IEEE 754: знаковый бит, 3 бита – порядок, 4 бита - мантисса. Приведите битовое представление следующих чисел 
Наименьшее денормализованное 	Месяц Вашего рождения 	Следующий за ним месяц 	
			
Для месяца рождения – укажите его номер (от 1 до 12) в десятичной кодировке: _____ 

4.	Модельный менеджер памяти управляет кучей из 24 четырехбайтных машинных слов. Для отслеживания свободных блоков используется неявный список. Начальное состояние кучи показано на рисунке ниже. Свободный блок белого цвета, занятые блоки заштрихованы, неиспользуемая из-за выравнивания память перечеркнута. Начальный и последний блок – служебные, для пользователя они недоступны. Байтовый размер блока хранится в заголовке и граничном теге. В выделенных блоках, за исключением начального блока, граничный тег не используется. Предоставляемая пользователю память выравнивается по 8-ми байтной границе (на рисунке обозначено засечками). Поиск свободного блока начинается с текущей позиции в списке, выбирается первый подходящий. При расщеплении используется первая часть блока, вторая часть – текущая позиция. Слияние проводится незамедлительно. 

После выполнения шести обращений к менеджеру динамической памяти
U6 = ___ 

А) запишите значения тегов и Б) рассчитайте пиковое использование памяти U6: 
p1 = malloc(14); p2 = malloc(22); p3 = malloc(8); free(p1); p4 = malloc(4); free(p2);

5.	Си-программа состоит из двух модулей: t5-1.c и t5-2.c. В результате компоновки: у модуля t5-1 секция .rodata оказалась по адресу 0x080484d0, секция .data по адресу 0x0804a020; у модуля t5-2 секция .textразместилась по адресу 0x0804842b. Символ strcpy@plt исполняемого файла помещен на адрес 0x80484b0. Определите значения указанных ссылок в исполняемом файле после перебазирования. 

// t5-1.c
extern void transfer();

char *rmi[3] = { "MC Solaar",
                 "3ème Oeil",
                 "Carré Rouge"};
char *rsa[3];

int main(void) {
   transfer();
}

t5-1.o:     file format elf32-i386
RELOCATION RECORDS FOR [.data]:
OFFSET   TYPE              VALUE 
00000000 R_386_32          .rodata
00000004 R_386_32          .rodata
00000008 R_386_32          .rodata

Contents of section .data:
 0000 00000000 0a000000 15000000           ............    

// t5-2.c
#include <string.h>

extern char* rmi[];
extern char* rsa[];

void transfer(int pauvre) {
   strcpy(rsa[pauvre], rmi[pauvre]);
}

t5-2.o:     file format elf32-i386
Disassembly of section .text:
00000000 <transfer>:
   0:	55                   	push   ebp
   1:	89 e5                	mov    ebp,esp
   3:	83 ec 10             	sub    esp,0x10
   6:	8b 45 08             	mov    eax,DWORD PTR [ebp+0x8]
   9:	ff 34 85 00 00 00 00	push   DWORD PTR [eax*4+0x0]
			c: R_386_32	rmi
  10:	ff 34 85 00 00 00 00 	push   DWORD PTR [eax*4+0x0]
			13: R_386_32	rsa
  17:	e8 fc ff ff ff	call   18 <transfer+0x18>
			18: R_386_PC32	strcpy
  1c:	83 c4 10             	add    esp,0x10
  1f:	c9                   	leave  
  20:	c3                   	ret    

Модуль	Секция 	Смещение ссылки 	Новое значение 	
t5-1	.data	0x4		
t5-2	.text	0xс		
t5-2	.text	0x18		

7.2. Типовые контрольные задания или иные материалы для проведения промежуточной аттестации.

Программа экзамена по курсу
Шестнадцатеричная система счисления. Знаковые числа, дополнительный код. Арифметические операции. Флаги: CF, SF, OF и ZF.
Архитектура IA-32: основные регистры, форматы команд. Порядок байт в памяти. Машинные типы данных: байт, слово, двойное слово, четверное слово. Аппаратный стек. 
Инструкции в IA-32/nasm: пересылки, в том числе условные, арифметические, логические, битовые, сдвиги и вращения, передачи управления.
Отображение операторов разыменование указателя и взятия адреса из языка Си в язык ассемблера. Размещение различных типов переменных языка Си в памяти компьютера. Работа с указателями. Адресная арифметика.
Массивы: одномерные, многомерные, многоуровневые. Расположение в памяти, способы работы с отдельными элементами. Преобразование индексных выражений в адресную арифметику. 
Реализация классов памяти языка Си на уровне языка ассемблера, размещение переменных: глобальных, статических, автоматических. Приведение типов данных. Работа со знаковыми и беззнаковыми числами.
Передача управления. Условные и безусловные переходы. Связь регистра EFLAGS и мнемонических кодов условий. Реализация управляющих операторов языка Си на языке ассемблера. 
Организация работы со структурами и объединениями языка Си на уровне языка ассемблера. Доступ к полям. Выравнивание данных в ОС Windows и Linux. Размер агрегатных типов данных. 
Соглашение о вызове функций cdecl. Распределение памяти во фрейме функции. Возвращаемое значение в соглашении cdecl. Функции с переменным числом параметров.  
Соглашение вызова stdcall, fastcall, реализация вызова функции без использования указателя фрейма, гибридное соглашение вызова. 
Выравнивание фреймов в стеке. Организация вызова функций стандартной библиотеки языка Си из ассемблерного кода. 
Управление динамической памятью. Пропускная способность и эффективность расходования. Внутренняя и внешняя фрагментация. Управление свободными блоками: неявный список.
Представление чисел с плавающей точкой. Стандарт IEEE 754. Свойства чисел с плавающей точкой. Операции над числами с плавающей точкой. Округление чисел.  
Сопроцессор FPU x87. Аппаратный стек регистров. Организация работы с числами с плавающей точкой в языке Си: пересылка данных, основные арифметические операции. 
Устройство современного компьютера, запоминающие устройства: организация, емкость. Соотношение временных характеристик доступа на разных уровнях иерархической памяти компьютера. 
Кэш-память процессора, способы ее организации: кэш прямого отображения, N-канальный множественно-ассоциативный кэш, полностью ассоциативный кэш.
Организация виртуальной памяти, страничная трансляция адреса. Буфер быстрого преобразования адреса (TLB). 
Многомодульные программы. Глобальные, локальные, внешние имена. Сильные и слабые символы, COMMON-символы. 
Объектные файлы формата ELF. Статическая компоновка программы: разрешение символов, перемещение кода, модификация символов и ссылок. 
Загрузка исполняемого файла в память. Динамическая компоновка, разделяемые библиотеки. Позиционно независимый код. Глобальная таблица смещений. Ленивое связывание в динамической компоновке. Динамическая загрузка. 
Вариант письменного экзамена по курсу
1.	После выполнения последовательности команд в регистре-аккумуляторе было получено некоторое значение. Выпишите восстановленное содержимое ячеек памяти согласно заданной директиве. Если часть значения не может быть восстановлена, запишите вместо соответствующих шестнадцатеричных цифр символы ‘?’. 
a dd ________________
mov eax, dword [a]
shl eax, 8
; EAX = 0xae191700	b dw ________, _________
mov eax, dword [b]
ror eax, 8
or  ax, 0x0f0f
; EAX = 0xf4c01fcf	c dw ________
movsx ax, byte [c + 1]
cmp   ah, byte [c]
setbe ah
; AX = 0x01c3	

2.	Реализуйте приведенный Си-код, включая объявления переменных.

static int i;
static short *a[10];
...
a[i++][5] *= -1;
3.	Для данного фрагмента ассемблерного кода восстановите соответствующий код на языке Си. 
section .rodata 
.L6:
dd .L1 
dd .L2 
dd .L3 
dd .L4 
dd .L1 
dd .L4 
	mov     ecx, dword [x]
   cmp     ecx, 5
   ja      .L1
   jmp     [.L6+ecx*4]
.L1:
   mov     eax, 107
   add     eax, dword [a + 12]
   jmp     .L5
.L2:
   mov     eax, 99 
.L3:
   add     eax, dword [a]
   jmp     .L5
.L4:
   mov     eax, dword [a + 4]
   add     eax, dword [a + 8]
.L5:	   static int a[N];
   static int x;
inty; // размещенавEAX
switch (x) {
   ________________________
   ________________________
   ________________________
   ________________________
   ________________________
   ________________________
   ________________________
   ________________________
   ________________________
   ________________________
   ________________________
   }	
4.	Перечислите Си-выражения, имеющие истинное значение при любых значениях переменных заданных типов. Предполагается, что переменные типа float и double имеют значение отличное от NAN. 
signed char c;
short s;
int i;
float f;
double d;	А) i == -(-i);
Б) f*(f+s) == f*f+f*s;
В) i < s ⇒ -i > -s
Г) 32/4.0 == 32/4	Д) i == (int)(float)i; 
Е) d > f ⇒ -f > -d;
Ж) -f * f < 0.0
З) (c+s)+i == c+(s+i);	Ответ:
	
5.	Си-программа, использующая тип данных s, была скомпилирована на платформе IA-32/Linux. 
typedef struct t_s st;

struct t_s {
   char          b;
   union {
      st   *n;
      int   val[2];
   }             u;
double        d;
   int           r;
};

static st s, *p;
static int x;	Приведите соответствующий ассемблерный код (В, Г) либо выпишите числовое значение(А, Б): 
А)sizeof(s) 
Б) Смещениеполяs.u.val[1]
В)
s.r = s.u.val[0] + s.u.val[1];
Г)
x = p->u.n->r;
	А)
Б)
В)

Г)	
6.	Компилятор построил для тела Си-функции f следующий ассемблерный код. Исходя из этого кода и того, что было использовано соглашение cdecl, восстановите заголовок функции: типы параметров, их порядок, тип возвращаемого значения. 
mov     ecx, dword [ebp+16]
   mov     eax, dword [ebp+8]
   mov     ebx, dword [ebp+12]
   movsx   esi, byte [eax]
   mov     eax, dword [ecx]
   cdq
   idiv    esi
   mov     edx, dword [ebp+20]
   sar     dx, 2
   movsx   edx, dx
   mov     dword [ecx], eax
   add     dword [ebx], edx
   mov     eax, ecx	____________ f(___________________ , 
               ___________________ , 
               ___________________ , 
               ___________________ ) {
   *z = *z / *w;
   *x = *x + (v >> 2);
   return z; 
}	

7.	Реализуйте на языке ассемблера заданную рекурсивную функцию, используя соглашение cdecl. Перед вызовом функции f стек уже выровнен должным образом. Дополнительные требования: 1) сохраняйте выравненность стека,2) код должен отражать особенности компиляции с ключом –fomit-frame-pointer.

typedef __attribute__((fastcall)) void (*fp)(int);

typedef struct link link;

struct link {
   fp *payload;
   link *next;
};

void f(int v, link* p) {
   if (p) {
      f(v, p->next);
      (*p->payload)(v);
   }
Параметр	Значение	
VPN		
Попадание в TLB? (да/нет)		
Страница присутствует? (да/нет)		
PPN		
Номер набора в кэш данных		
Бит валидности 		
Попадание в кэш? (да/нет)		
}
Кэш данных	
Набор	tag	v	
0	3	1	
1	2	0	
2	1	0	
3	0	1	
4	1	1	
5	1	0	
6	0	1	
7	0	1	

8.	Память модельного компьютера состоит из 512 адресуемых ячеек размером 1 байт. Выполняется страничная трансляция линейных адресов при обращении к физической памяти. Размер страницы – 64 байта. Транслированные адреса сохраняются в TLB, организованный как полностью ассоциативный кэш. Обращение к физической памяти предваряется проверкой кэша данных, имеющего следующее устройство: прямое отображение, 16 байт в строке, 8 наборов. Дано: состояние TLB, фрагмент таблицы страниц, кэш данных. Бит p в TLB и таблице страниц показывает присутствие страницы. Заполните столбец «Значение» в таблице, определив, как именно будет происходить чтение байта по виртуальному линейному адресу 0x1ce. 

VPN – Номерстраницы виртуальной памяти
PPN – Номерстраницы физической памяти

Фрагмент таблицы страниц	
VPN	PPN	p	
5	4	1	
6	3	1	
7	3	1	
8	‑	0	
Состояние TLB	
tag	v	PPN	p	tag	v	PPN	p	
0	0	‑	0	6	1	3	1	
2	1	1	1	3	1	‑	0	

9.	Си-программа состоит из двух модулей: t9-m.c и t9-e.c. Заполните таблицы, приведенные ниже. Для каждого заданного в таблице имени переменной или функции укажите (да/нет), содержится ли соответствующая запись в таблице символов .symtab объектного файла, Если да, укажите тип связывания символа (local, global, extern), в каком модуле (t9-m.o, t9-e.o, еслиCOMMON-символ присутствует в двух модулях – указывайте оба модуля) и какой именно секции (.text, .bss, .data, COMMON-символ) символ определен. Если ответ дать невозможно – ставьте прочерк. 

t9-m.c	t9-e.c	
#include <sys/stat.h>

char* fileName;

extern 
void printLastAccess(struct stat *s);

int main(int argc, char *argv[]) {
static struct stat sb = {0};
   int res;
   res = stat(fileName = argv[1], &sb);
   printLastAccess(&sb);
   return res;
}	#include <sys/stat.h>
#include <stdio.h>
#include <time.h>

extern char* fileName;
FILE *fd;

void printLastAccess(struct stat *s) {
   char *formatedTime = ctime(&s->st_atime);
   printf("Last file access: %s", formatedTime);
   fd = fopen("/tmp/leak.log", "a");
   fprintf(fd, "%s\n", fileName);
   fclose(fd);
}	
Файл t9-m.c
Имя функции/переменной	Присутствует ли в .symtab файла t9-m.o	Тип связывания символа	Модуль, в котором символ определен	Секция, в которой символ определен	
printLastAccess					
main					
Файл t9-e.c
Имя функции/переменной	Присутствует ли в .symtab файла t9-e.o	Тип связывания символа	Модуль, в котором символ определен	Секция, в которой символ определен	
formatedTime					
fd					

Модуль t10-m.c

10.	Си-программа состоит из двух модулей: t10-m.c и t10-p.c, использующих общий заголовочный файл t10.h. В результате компоновки секция .text из модуля t10-m.c была размещена по адресу 0x0804844b, а ссылки в этой секции получили новые значения d9 fe ff ff, 39 00 00 00, 30 a0 04 08 (приведены в порядке их следования в ассемблерном листинге). Заполните в таблице последний столбец, вычислив адреса размещения указанных символов и секций. 

#include <stdlib.h>
#include "t10.h"

unsigned salt = 0xfaceb00c;
char* tbl[3] = {"http://cmc.msu.ru",
                "https://www.mipt.ru",
                "https://cs.hse.ru"};

int main(int argc, char* argv[]) {
   print(atoi(argv[1]));
   return 0;
}

int randIndex(int i) {
   return (i ^ salt) % 3;
}

t10-m.o:     file format elf32-i386

Contents of section .data:
0000 00000000 12000000 26000000 0cb0cefa  ........&.......

Модуль	Секция / символ	Адрес размещения	
‑	atoi@plt		
t10-p.o	.text		
t10-m.o	.data		

extern char* tbl[3];
extern unsigned salt;

extern void print(int i);
extern int randIndex(int i);

Заголовочный файл t10.h

Модуль t10-p.c

t10-m.o:     file format elf32-i386

Disassembly of section .text:

00000000 <main>:
   0:	8d 4c 24 04          	lea    ecx,[esp+0x4]
   4:	83 e4 f0             	and    esp,0xfffffff0
   7:	ff 71 fc             	push   DWORD PTR [ecx-0x4]
   a:	55                   	push   ebp
   b:	89 e5                	mov    ebp,esp
   d:	51                   	push   ecx
   e:	83 ec 10             	sub    esp,0x10
  11:	8b 41 04             	mov    eax,DWORD PTR [ecx+0x4]
  14:	ff 70 04             	push   DWORD PTR [eax+0x4]
  17:	e8 fc ff ff ff	call   18 <main+0x18>
			18: R_386_PC32	atoi
  1c:	89 04 24             	mov    DWORD PTR [esp],eax
  1f:	e8 fc ff ff ff	call   20 <main+0x20>
			20: R_386_PC32	print
  24:	8b 4d fc             	mov    ecx,DWORD PTR [ebp-0x4]
  27:	31 c0                	xor    eax,eax
  29:	c9                   	leave  
  2a:	8d 61 fc             	lea    esp,[ecx-0x4]
  2d:	c3                   	ret    

0000002e <randIndex>:
  2e:	55                   	push   ebp
  2f:	b9 03 00 00 00       	mov    ecx,0x3
  34:	31 d2                	xor    edx,edx
  36:	89 e5                	mov    ebp,esp
  38:	8b 45 08             	mov    eax,DWORD PTR [ebp+0x8]
  3b:	33 05 00 00 00 00	xor    eax,DWORD PTR ds:0x0
			3d: R_386_32	salt
  41:	5d                   	pop    ebp
  42:	f7 f1                	div    ecx
  44:	89 d0                	mov    eax,edx
  46:	c3                   	ret  

#include <stdio.h>
#include "t10.h”

... // пропущенныйкод

void print(int i ) {
   puts(tbl[randIndex(i)]);
}

t10-p.o:     file format elf32-i386

Disassembly of section .text:
...
00000016 <print>:
  16:	55                   	push   ebp
  17:	89 e5                	mov    ebp,esp
  19:	83 ec 14             	sub    esp,0x14
  1c:	ff 75 08             	push   DWORD PTR [ebp+0x8]
  1f:	e8 fc ff ff ff	call   20 <print+0xa>
			20: R_386_PC32	randIndex
  24:	8b 04 85 00 00 00 00	mov    eax,DWORD PTR [eax*4+0x0]
			27: R_386_32	tbl
  2b:	83 c4 10             	add    esp,0x10
  2e:	89 45 08             	mov    DWORD PTR [ebp+0x8],eax
  31:	c9                   	leave  
  32:	e9 fc ff ff ff	jmp    33 <print+0x1d>
			33: R_386_PC32	puts

ШКАЛА И КРИТЕРИИ ОЦЕНИВАНИЯ результатов обучения (РО) по дисциплине (модулю)  
	
Оценка
РО и
соответствующие виды оценочных средств 	2	3	4	5	
Знания
Коллоквиумы №№1 и 2
Экзамен	Отсутствие знаний	Фрагментарные знания	Общие, но не структурированные знания	Сформированные систематические знания	
Умения
Коллоквиумы №№1 и 2
Экзамен 	Отсутствие умений	В целом успешное, но не систематическое умение	В целом успешное, но содержащее отдельные пробелы умение (допускает неточности непринципи-ального характера)	Успешное и систематическое умение	
Навыки 
(владения, опыт деятельности)
Экзамен	Отсутствие навыков (владений, опыта)	Наличие отдельных навыков (наличие фрагментарного опыта)	В целом, сформированные навыки (владения), но используемые не в активной форме	Сформированные навыки (владения), применяемые при решении задач	

Соответствие результатов обучения и компетенций, в развитии которых участвует дисциплина (модуль)
	
Результаты обучения	Компетенция, с частичным формированием которой связано достижение результата обучения	
Знать:
1.	язык ассемблера архитектуры IA-32.
2.	особенности реализации различных конструкций языка Си на уровне языка ассемблера и причины, влияющие на выбор механизма реализации.
3.	свойства аппаратуры, влияющие на производительность и безопасность работы программ.
4.	особенности двоичного (бинарного) интерфейса приложений на примере архитектуры IA-32.

Уметь:  
1.	составлять и отлаживать многомодульные программы на языках Си и ассемблера;
2.	использовать стандартную библиотеку языка Си, в том числе в программах на языке ассемблера.
3.	обосновано выбирать механизмы реализации конструкций языка Си и корректно их кодировать на языке ассемблера архитектуры IA-32.
4.	оценивать производительность программ на языках Си и ассемблера, используя знания об особенностях устройства аппаратуры ЭВМ и аппаратные средства профилирования архитектуры IA-32.
5.	восстанавливать по ассемблерному коду операторы и типы данных языка Си.

Владеть:  
1.	современной технологией разработки и отладки многомодульных программ на языках Си и ассемблера.

ПК-4.Б	
Знать:
1.	основные принципы устройства ЭВМ, его основные компоненты, их качественные и количественные характеристики.
2.	особенности архитектуры IA-32, влияние архитектуры набора команд на реализацию языков высокого уровня и систему программирования.

ПК-5.Б	

8. Ресурсное обеспечение:

Основная литература:
  
1.	Рэндал Э. Брайант, Дэвид О’Халларон. Компьютерные системы: архитектура и программирование (Computer Systems: A Programmer’s Perspective). Издательство: БХВ-Петербург, 2005 г. — 1186 стр.
2.	Э. Таненбаум. Т. Остин. Архитектура компьютера. 6-е изд. – СПб.: Питер, 2017. — 816 стр.
3.	Кип Р. Ирвин. Язык ассемблера для процессоров Intel. 4-е издание. Вильямс, 2005. — 912 стр.

Дополнительная литература:

1.	Randal E. Bryant, David R. O'Hallaron. Computer Systems: A Programmer's Perspective (3rd Edition). Pearson2016. —984стр.
2.	John L. Hennesy and David A. Patterson. Computer Architecture: A Quantitative Approach. Sixth Edition. Morgan Kaufmann 2017.—936стр.

Информационные справочные системы:

•	Вебсайт учебного курса: http://asmcourse.cs.msu.ru/ 
•	SASM– свободнораспространяемая интегрированная среда разработки учебных программ на языке ассемблера (https://dman95.github.io/SASM/) 
•	Свободно распространяемыеинструменты командной строки: UNIX-подобная среда (http://www.cygwin.com/), ассемблер nasm. (http://www.nasm.us/).

Материально-техническое обеспечение:

Используются  компьютер и мультимедийный проектор для демонстрации слайдов входе лекций.

9. Язык преподавания - русский.

10. Преподаватели:  доцент факультета ВМК МГУ В.А. Падарян.

11. Авторы программы:  Доцент факультета ВМК МГУ В.А. Падарян.