Автор работы: Пользователь скрыл имя, 15 Декабря 2013 в 15:42, курсовая работа
Цель работы: написать подпрограмму на Ассемблере, выполняющую действия над массивами байтов (строками) в соответствии с вариантом 7. Подпрограмма должна вызываться из Си-программы. Следует написать программу на языке Си, содержащую прототип ассемблерной функции, ввод исходных данных, вызов подпрограммы и вывод результата.
Каждая строка описана в Си-программе в виде байтового массива и заканчивается двоичным нулем. Строки имеют разную длину. В функцию передаются две строки и один целый параметр (байт). Функция возвращает модифицированные строки и одно целое значение (байт или слово). Модифицированная строка помещается на место первой строки.
Министерство науки и образования Российской Федерации
Новосибирский Государственный Технический Университет
КУРСОВАЯ РАБОТА
ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ АССЕМБЛЕР
Факультет: АВТ
Преподаватель: Голодных Геннадий Петрович
Группа: АА-27
Студент: Зотов А.С.
Вариант: 16
1) Цель работы: написать подпрограмму на Ассемблере, выполняющую действия над массивами байтов (строками) в соответствии с вариантом 7. Подпрограмма должна вызываться из Си-программы. Следует написать программу на языке Си, содержащую прототип ассемблерной функции, ввод исходных данных, вызов подпрограммы и вывод результата.
Каждая строка описана в Си-программе в виде байтового массива и заканчивается двоичным нулем. Строки имеют разную длину. В функцию передаются две строки и один целый параметр (байт). Функция возвращает модифицированные строки и одно целое значение (байт или слово). Модифицированная строка помещается на место первой строки.
№ |
Передача строк в функцию |
Передача целых значений |
Действия над строками |
Формирование целого результата |
Возврат целого результата |
16 |
1 |
1 |
7 |
2 |
2 |
Передача строк в функцию: 1 – по ссылке
Передача целых значений в функцию: 1 – по значению
Действия над строками: 7 – на место четных байтов первой строки записать соответствующие байты из второй строки, объединенные по «и» с целым параметром.
Формирование целого результата: 2 – длина второй строки
Возврат целого результата: 2 – через имя функции
2) Модуль на языке C:
extern int func(char*,char*,int);
int main()
{
char s1[21], s2[21];
int n;
printf("String 1 (max - 20 elements): \n");
gets(s1);
printf("String 2 (max - 20 elements): \n");
gets(s2);
printf("N: \n");
scanf("%d",&n);
n=func(s1,s2,n);
printf("Modified string - %s\nLength of string 2 - %d\n",s1,n);
return 0;
}
3) Модуль на языке Ассемблер:
TITLE ASM_PART
.MODEL SMALL, C
.DATA
.CODE
PUBLIC func
func PROC NEAR USES SI DI, str1:WORD, str2:WORD, n:BYTE
MOV SI,str1
MOV DI,str2
L1:
CMP BYTE PTR[SI],0; проверка конца строки для str1
JE SHORT L2
CMP BYTE PTR[DI],0; проверка конца строки для str2
JE SHORT L2
MOV BL,n
AND BL, BYTE PTR[DI]; объединение по И с целым параметром (0-ой байт четный)
MOV BYTE PTR[SI], BL; на место четных байтов записываем BL
INC SI
INC DI
CMP BYTE PTR[SI],0; промежуточная проверка для str1
JE SHORT L2
CMP BYTE PTR[DI],0; промежуточная проверка для str2
JE SHORT L2
INC SI
INC DI
JMP L1
L2:
XOR AX,AX
MOV DI,str2; определяем длину str2
L3:
CMP BYTE PTR[DI],0
JE L4
INC AX; func возвращает длину второй строки
INC DI
JMP L3
L4:
RET
func ENDP
END
4) Вывод:.
В ходе написания данной курсовой работы
я расширил свои навыки работы с Assembler’ом
и С. Понял принципы передачи данных из
программы на Си в Ассемблерную функцию
и обратно, соотвественно научился вводить
и выводить данные из ассемблерной функции.
Так же я развил свои навыки в работе со
строками в программах на Си и Assembler’e.
Потренировался в работе с основными аспектами
Ассемблера: регистрами, джампами, основными
командами.
Пример выводы программы: