- •Программирование
- •Часть 1 программирование на языке Си
- •1. Задание и методические указания
- •К выполнению курсовой работы
- •2. Краткие теоретические сведения
- •Int num; // названия элементов
- •2. Краткие теоретические сведения
- •Часть 2 Программирование на языке Ассемблер
- •1. Задание и методические указания
- •К выполнению курсовой работы
- •Окончание табл. 8
- •Литература
- •Программирование на языках си и Ассемблер Методические указания
- •6 30092, Г. Новосибирск, пр. К. Маркса, 20
Часть 2 Программирование на языке Ассемблер
1. Задание и методические указания
К выполнению курсовой работы
Написать подпрограмму на Ассемблере, выполняющую действия над массивами байтов (строками) в соответствии с вариантом из табл. 1–8. Подпрограмма должна вызываться из Си-программы. Следует написать программу на языке Си, содержащую прототип ассемблерной функции, ввод исходных данных, вызов подпрограммы и вывод результата.
Каждая строка описана в Си-программе в виде байтового массива и заканчивается двоичным нулем. Строки имеют разную длину. В функцию передаются две строки и один целый параметр (байт). Функция возвращает модифицированные строки и одно целое значение (байт или слово). Модифицированная строка помещается на место первой строки или в отдельный массив.
Передача строк в функцию:
1 – по ссылке
2 – через глобальные переменные
Передача целых значений в функцию:
1 – по значению
2 - по ссылке
Действия над строками:
1 – объединить соответствующие нечетные байты строк по «или». Целый параметр – длина второй строки.
2 – поменять местами соответствующие четные байты строк. Целый параметр – максимально допустимое количество замен.
3 – нечетные байты первой строки поменять с четными байтами второй строки. Целый параметр – длина первой строки.
4 – из первой строки побайтно вычесть вторую. Целый параметр прибавлять к результату вычитания.
5 – четные байты первой строки сложить с нечетными байтами второй строки. Целый параметр – максимальное количество сложений.
6 – ко всем элементам первой строки прибавить целый параметр. В конец первой строки дописать вторую строку.
7 – на место четных байтов первой строки записать соответствующие байты из второй строки, объединенные по «и» с целым параметром.
8 – к нечетным байтам первой строки прибавить четные байты второй строки. Целый параметр – максимальное количество сложений
9 – сложить попарно байты второй строки и записать их на место соответствующих четных байтов первой строки. Целый параметр – количество пар во второй строке.
Формирование целого результата:
1 – длина первой строки
2 – длина второй строки
Возврат целого результата:
1 – по ссылке
2 – через имя функции
2. Краткие теоретические сведения
Для подпрограмм, предназначенных для вызова из Си-программ, необходимо выполнять соглашения о характеристиках сегментов, модели памяти, правилах передачи параметров и использовании регистров.
Оформленная таким образом ассемблерная подпрограмма имеет вид
.MODEL SMALL,С
func PROC NEAR USES SI DI, a:WORD, b:WORD
LOCAL X:WORD, y:WORD
; текст подпрограммы
RET
func ENDP
Ассемблерной функции func соответствует следующий прототип в Си-программе:
int func(int a, int b);
В тексте программы в качестве операндов можно использовать имена локальных переменных и передаваемых параметров. По команде RET автоматически генерируются команды восстановления регистров SI, DI, ВР, SP и затем выполняется возврат содержимого регистра AX в вызывающую программу.
В ассемблерной процедуре можно свободно использовать регистры AX, BX, CX, DX. Остальные регистры должны быть сохранены и восстановлены.
Для обработки строковых данных ассемблер имеет пять команд обработки строк: MOVS – переслать один байт или одно слово из одной области памяти в другую; LODS – загрузить из памяти один байт в регистр AL или одно слово в регистр AX; STOS – записать содержимое регистра AL или AX в память; CMPS – сравнить содержимое двух областей памяти, размером в один байт или одно слово; SCAS – сравнить содержимое регистра AL или AX с содержимым памяти. Префикс REP позволяет этим командам обрабатывать строки любой длины.
Флаг направления DF = 0 (устанавливается командой CLD) задает направление слева направо, а DF = 1 (устанавливается командой STD) – справа налево.
В следующем примере выполняется пересылка 20 байт из STRING1 в STRING2:
STRING1 DB 20 DUP('*')
STRING2 DB 20 DUP(")
CLD ;Сброс флага DF
MOV СХ, 20 ;Счетчик на 20 байт
LEA DL, STRING2 ; Адрес области "куда"
LEA SI, STRING1 ;Адрес области "откуда"
REP MOVSB ;Переслать данные
Таблица 1
№ |
Передача строк в функцию |
Передача целых значений |
Действия над строками |
Формирование целого результата |
Возврат целого результата |
1 |
1 |
1 |
1 |
1 |
1 |
2 |
2 |
1 |
2 |
1 |
1 |
3 |
1 |
2 |
3 |
1 |
1 |
4 |
2 |
2 |
4 |
1 |
1 |
5 |
1 |
1 |
5 |
2 |
1 |
6 |
2 |
1 |
6 |
2 |
1 |
Окончание табл. 1
№ |
Передача строк в функцию |
Передача целых значений |
Действия над строками |
Формирование целого результата |
Возврат целого результата |
7 |
1 |
2 |
7 |
2 |
1 |
8 |
2 |
2 |
8 |
2 |
1 |
9 |
1 |
1 |
9 |
1 |
2 |
10 |
2 |
1 |
1 |
1 |
2 |
11 |
1 |
2 |
2 |
1 |
2 |
12 |
2 |
2 |
3 |
1 |
2 |
13 |
1 |
1 |
4 |
2 |
2 |
14 |
2 |
1 |
5 |
2 |
2 |
15 |
1 |
2 |
6 |
2 |
2 |
16 |
2 |
2 |
7 |
2 |
2 |
17 |
1 |
1 |
8 |
1 |
1 |
18 |
2 |
1 |
9 |
1 |
1 |
19 |
1 |
2 |
1 |
1 |
1 |
20 |
2 |
2 |
2 |
1 |
1 |
21 |
1 |
1 |
3 |
2 |
1 |
22 |
2 |
1 |
4 |
2 |
1 |
23 |
1 |
2 |
5 |
2 |
1 |
24 |
2 |
2 |
6 |
2 |
1 |
25 |
1 |
1 |
7 |
1 |
2 |
Таблица 2
№ |
Передача строк в функцию |
Передача целых значений |
Действия над строками |
Формирова-ние целого результата |
Возврат целого результата |
1 |
2 |
1 |
8 |
1 |
2 |
2 |
1 |
2 |
9 |
1 |
2 |
3 |
2 |
2 |
1 |
1 |
2 |
4 |
1 |
1 |
2 |
2 |
2 |
5 |
2 |
1 |
3 |
2 |
2 |
6 |
1 |
2 |
4 |
2 |
2 |
7 |
2 |
2 |
5 |
2 |
2 |
8 |
1 |
1 |
6 |
1 |
1 |
9 |
2 |
1 |
7 |
1 |
1 |
Окончание табл. 2
№ |
Передача строк в функцию |
Передача целых значений |
Действия над строками |
Формирование целого результата |
Возврат целого результата |
10 |
1 |
2 |
8 |
1 |
1 |
11 |
2 |
2 |
9 |
1 |
1 |
12 |
1 |
1 |
1 |
2 |
1 |
13 |
2 |
1 |
2 |
2 |
1 |
14 |
1 |
2 |
3 |
2 |
1 |
15 |
2 |
2 |
4 |
2 |
1 |
16 |
1 |
1 |
5 |
1 |
2 |
17 |
2 |
1 |
6 |
1 |
2 |
18 |
1 |
2 |
7 |
1 |
2 |
19 |
2 |
2 |
8 |
1 |
2 |
20 |
1 |
1 |
9 |
2 |
2 |
21 |
2 |
1 |
1 |
2 |
2 |
22 |
1 |
2 |
2 |
2 |
2 |
23 |
2 |
2 |
3 |
2 |
2 |
24 |
1 |
1 |
4 |
1 |
1 |
25 |
2 |
1 |
5 |
1 |
1 |
Таблица 3
№ |
Передача строк в функцию |
Передача целых значений |
Действия над строками |
Формирование целого результата |
Возврат целого результата |
1 |
1 |
2 |
6 |
1 |
1 |
2 |
2 |
2 |
7 |
1 |
1 |
3 |
1 |
1 |
8 |
2 |
1 |
4 |
2 |
1 |
9 |
2 |
1 |
5 |
1 |
2 |
1 |
2 |
1 |
6 |
2 |
2 |
2 |
2 |
1 |
7 |
1 |
1 |
3 |
1 |
2 |
8 |
2 |
1 |
4 |
1 |
2 |
9 |
1 |
2 |
5 |
1 |
2 |
10 |
2 |
2 |
6 |
1 |
2 |
11 |
1 |
1 |
7 |
2 |
2 |
12 |
2 |
1 |
8 |
2 |
2 |
Окончание табл. 3
№ |
Передача строк в функцию |
Передача целых значений |
Действия над строками |
Формирование целого результата |
Возврат целого результата |
13 |
1 |
2 |
9 |
2 |
2 |
14 |
2 |
2 |
1 |
2 |
2 |
15 |
1 |
1 |
2 |
1 |
1 |
16 |
2 |
1 |
3 |
1 |
1 |
17 |
1 |
2 |
4 |
1 |
1 |
18 |
2 |
2 |
5 |
1 |
1 |
19 |
1 |
1 |
6 |
2 |
1 |
20 |
2 |
1 |
7 |
2 |
1 |
21 |
1 |
2 |
8 |
2 |
1 |
22 |
2 |
2 |
9 |
2 |
1 |
23 |
1 |
1 |
1 |
1 |
2 |
24 |
2 |
1 |
2 |
1 |
2 |
25 |
1 |
2 |
3 |
1 |
2 |
Таблица 4
№ |
Передача строк в функцию |
Передача целых значений |
Действия над строками |
Формирование целого результата |
Возврат целого результата |
1 |
2 |
2 |
4 |
1 |
2 |
2 |
1 |
1 |
5 |
2 |
2 |
3 |
2 |
1 |
6 |
2 |
2 |
4 |
1 |
2 |
7 |
2 |
2 |
5 |
2 |
2 |
8 |
2 |
2 |
6 |
1 |
1 |
9 |
1 |
1 |
7 |
2 |
1 |
1 |
1 |
1 |
8 |
1 |
2 |
2 |
1 |
1 |
9 |
2 |
2 |
3 |
1 |
1 |
10 |
1 |
1 |
4 |
2 |
1 |
11 |
2 |
1 |
5 |
2 |
1 |
12 |
1 |
2 |
6 |
2 |
1 |
13 |
2 |
2 |
7 |
2 |
1 |
14 |
1 |
1 |
8 |
1 |
2 |
Окончание табл. 4
№ |
Передача строк в функцию |
Передача целых значений |
Действия над строками |
Формирование целого результата |
Возврат целого результата |
15 |
2 |
1 |
9 |
1 |
2 |
16 |
1 |
2 |
1 |
1 |
2 |
17 |
2 |
2 |
2 |
1 |
2 |
18 |
1 |
1 |
3 |
2 |
2 |
19 |
2 |
1 |
4 |
2 |
2 |
20 |
1 |
2 |
5 |
2 |
2 |
21 |
2 |
2 |
6 |
2 |
2 |
22 |
1 |
1 |
7 |
1 |
1 |
23 |
2 |
1 |
8 |
1 |
1 |
24 |
1 |
2 |
1 |
1 |
1 |
25 |
2 |
2 |
2 |
1 |
1 |
Таблица 5
№ |
Передача строк в функцию |
Передача целых значений |
Действия над строками |
Формирование целого результата |
Возврат целого результата |
1 |
1 |
1 |
3 |
2 |
1 |
2 |
2 |
1 |
4 |
2 |
1 |
3 |
1 |
2 |
5 |
2 |
1 |
4 |
2 |
2 |
6 |
2 |
1 |
5 |
1 |
1 |
7 |
1 |
2 |
6 |
2 |
1 |
8 |
1 |
2 |
7 |
1 |
2 |
9 |
1 |
2 |
8 |
2 |
2 |
1 |
1 |
2 |
9 |
1 |
1 |
2 |
2 |
2 |
10 |
2 |
1 |
3 |
2 |
2 |
11 |
1 |
2 |
4 |
2 |
2 |
12 |
2 |
2 |
5 |
2 |
2 |
13 |
1 |
1 |
6 |
1 |
1 |
14 |
2 |
1 |
7 |
1 |
1 |
15 |
1 |
2 |
8 |
1 |
1 |
16 |
2 |
2 |
9 |
1 |
1 |
Окончание табл. 5
№ |
Передача строк в функцию |
Передача целых значений |
Действия над строками |
Формирование целого результата |
Возврат целого результата |
17 |
1 |
1 |
1 |
2 |
1 |
18 |
2 |
1 |
2 |
2 |
1 |
19 |
1 |
2 |
3 |
2 |
1 |
20 |
2 |
2 |
4 |
2 |
1 |
21 |
1 |
1 |
5 |
1 |
2 |
22 |
2 |
1 |
6 |
1 |
2 |
23 |
1 |
2 |
7 |
1 |
2 |
24 |
2 |
2 |
8 |
1 |
2 |
25 |
1 |
1 |
9 |
2 |
2 |
Таблица 6
№ |
Передача строк в функцию |
Передача целых значений |
Действия над строками |
Формирование целого результата |
Возврат целого результата |
1 |
2 |
1 |
1 |
2 |
2 |
2 |
1 |
2 |
2 |
2 |
2 |
3 |
2 |
2 |
3 |
2 |
2 |
4 |
1 |
1 |
4 |
1 |
1 |
5 |
2 |
1 |
5 |
1 |
1 |
6 |
1 |
2 |
6 |
1 |
1 |
7 |
2 |
2 |
7 |
1 |
1 |
8 |
1 |
1 |
8 |
2 |
1 |
9 |
2 |
1 |
9 |
2 |
1 |
10 |
1 |
2 |
1 |
2 |
1 |
11 |
2 |
2 |
2 |
2 |
1 |
12 |
1 |
1 |
3 |
1 |
2 |
13 |
2 |
1 |
4 |
1 |
2 |
14 |
1 |
2 |
5 |
1 |
2 |
15 |
2 |
2 |
6 |
1 |
2 |
16 |
1 |
1 |
7 |
2 |
2 |
17 |
2 |
1 |
8 |
2 |
2 |
Окончание табл. 6
№ |
Передача строк в функцию |
Передача целых значений |
Действия над строками |
Формирование целого результата |
Возврат целого результата |
18 |
1 |
2 |
9 |
2 |
2 |
19 |
2 |
2 |
1 |
2 |
2 |
20 |
1 |
1 |
2 |
1 |
1 |
21 |
2 |
1 |
3 |
1 |
1 |
22 |
1 |
2 |
4 |
1 |
1 |
23 |
2 |
2 |
5 |
1 |
1 |
24 |
1 |
1 |
6 |
2 |
1 |
25 |
2 |
1 |
7 |
2 |
1 |
Таблица 7
№ |
Передача строк в функцию |
Передача целых значений |
Действия над строками |
Формирование целого результата |
Возврат целого результата |
1 |
1 |
2 |
8 |
2 |
1 |
2 |
2 |
2 |
9 |
2 |
1 |
3 |
1 |
1 |
1 |
1 |
2 |
4 |
2 |
1 |
2 |
1 |
2 |
5 |
1 |
2 |
3 |
1 |
2 |
6 |
2 |
2 |
4 |
1 |
2 |
7 |
1 |
1 |
5 |
2 |
2 |
8 |
2 |
1 |
6 |
2 |
2 |
9 |
1 |
2 |
7 |
2 |
2 |
10 |
2 |
2 |
8 |
2 |
2 |
11 |
1 |
1 |
9 |
1 |
1 |
12 |
2 |
1 |
1 |
1 |
1 |
13 |
1 |
2 |
2 |
1 |
1 |
14 |
2 |
2 |
3 |
1 |
1 |
15 |
1 |
1 |
4 |
2 |
1 |
16 |
2 |
1 |
5 |
2 |
1 |
17 |
1 |
2 |
6 |
2 |
1 |
18 |
2 |
2 |
7 |
2 |
1 |
19 |
1 |
1 |
8 |
1 |
2 |
Окончание табл. 7
№ |
Передача строк в функцию |
Передача целых значений |
Действия над строками |
Формирование целого результата |
Возврат целого результата |
||||
20 |
2 |
1 |
9 |
1 |
2 |
||||
21 |
1 |
2 |
1 |
1 |
2 |
||||
22 |
2 |
2 |
2 |
1 |
2 |
||||
23 |
1 |
1 |
3 |
2 |
2 |
||||
24 |
2 |
1 |
4 |
2 |
2 |
||||
25 |
1 |
2 |
5 |
2 |
2 |
||||
Таблица 8
№ |
Передача строк в функцию |
Передача целых значений |
Действия над строками |
Формирование целого результата |
Возврат целого результата |
1 |
2 |
2 |
6 |
2 |
2 |
2 |
1 |
1 |
7 |
1 |
1 |
3 |
2 |
1 |
8 |
1 |
1 |
4 |
1 |
2 |
9 |
1 |
1 |
5 |
2 |
2 |
1 |
1 |
1 |
6 |
1 |
1 |
2 |
2 |
1 |
7 |
2 |
1 |
3 |
2 |
1 |
8 |
1 |
2 |
4 |
2 |
1 |
9 |
2 |
2 |
5 |
2 |
1 |
10 |
1 |
1 |
6 |
1 |
2 |
11 |
2 |
1 |
7 |
1 |
2 |
12 |
1 |
2 |
8 |
1 |
2 |
13 |
2 |
2 |
9 |
1 |
2 |
14 |
1 |
1 |
1 |
2 |
2 |
15 |
2 |
1 |
2 |
2 |
2 |
16 |
1 |
2 |
3 |
2 |
2 |
17 |
2 |
2 |
4 |
2 |
2 |
18 |
1 |
1 |
5 |
1 |
1 |
19 |
2 |
1 |
6 |
1 |
1 |
