Дипломы, курсовые, рефераты, контрольные...
Срочная помощь в учёбе

Assembler. 
Разработка программного код на низкоуровневом языке для осуществления арифметических операций с массивами, работающий с регистрами и использующий различные типы адресации и циклы

Курсовая Купить готовую Узнать стоимостьмоей работы

В регистр EAX помещается значение, находящееся по новому адресу, сравнивается с нулем и т. д. Количество повторений определяется размером массива, которое заносится в регистр ECX через константу _с. Если значение EAX больше 0 то значение регистра ESI увеличивается на 4 и т. д. В регистре EBX хранится количество отрицательных элементов массива. По окончании расчета значение регистра EBX будет… Читать ещё >

Содержание

  • ВВЕДЕНИЕ
  • 1. ТЕОРЕТИЧЕСКАЯ ЧАСТ
    • 1. 1. Техническое задание на разработку программного кода
    • 1. 2. Описание платформы, на которой будет работать программа
    • 1. 3. Режимы работы процессора х
    • 1. 4. Регистры процессоров х
    • 1. 5. Программные регистры
    • 1. 6. Среда разработки программ на языке ассемблера
  • 2. ПРАКТИЧЕСКАЯ ЧАСТ
    • 2. 1. Структура программного кода
    • 2. 2. Описание алгоритмов и подпрограмм (функций и процедур), используемых для создания программного кода
    • 2. 3. Текст программы
    • 2. 4. Результаты работы программы
  • ЗАКЛЮЧЕНИЕ
  • Литература

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

Символьные данные помещаются в переменную buf. Функция crt_atoi переводит символы строки buf в числа, помещает их в регистр общего назначения EAX. Заполнение массива mas1 числами полученными в результате работы функции crt_atoi происходит в цикле loopчерез регистр ESI. Аналогично происходит заполнение массива mas2. Расчет количества отрицательных элементов происходит для каждого массива в отдельности. В регистр ESI помещается указатель на начало массива. В регистр EAX помещается значение, находящееся по адресу, на который указывает регистр ESI. Это значение сравнивается с нулем, если меньше нуля, то значение регистра EBX увеличивается на 1. Адрес в регистре ESIувеличивается на 4.

В регистр EAX помещается значение, находящееся по новому адресу, сравнивается с нулем и т. д. Количество повторений определяется размером массива, которое заносится в регистр ECX через константу _с. Если значение EAX больше 0 то значение регистра ESI увеличивается на 4 и т. д. В регистре EBX хранится количество отрицательных элементов массива. По окончании расчета значение регистра EBX будет помещаться в переменную sum_neg.Сумма элементов массива рассчитывается с помощью регистра ESI, в который помещается адрес первого элемента массива. В регистр EAX помещается значение, находящееся по адресу, на который указывает регистр ESI. В регистр EBX помещается сумма регистров EBXиEAX. Адрес, находящийся в регистре ESI увеличивается на 4. В регистр EAX помещается значение, находящееся по новому адресу и т. д. Количество повторений определяется размером массива. В регистре EBX будет накапливаться сумма элементов массива. По окончании расчета суммы значение регистра EBX будет помещаться в переменную sum_mass.

Для сравнивания количества отрицательных элементов массивов значения переменных sum_neg1 и sum_neg2 помещаются в регистры EAXи EBX соответственно. Директива cmpсравнивает регистры EAXи EBX. Если EAXменьше EBX то значение суммы первого массива в переменной sum_mass1 обнуляется. Если EAXбольше EBX то значение суммы второго массива в переменной sum_mass2 обнуляется. Полученные данные преобразуются с помощью функции wsprintf в символьную строку. Консольный вывод осуществляется с помощью функции WriteConsoleA. Блок-схема алгоритма программы: ecx=ebxesi=esi + 4[esi]=eaxebx=excesi=mas1GetStdHandleWriteConsoleAReadConsolecrt_atoiдаecx<5нетecx=0ebx=0esi=mas2ebx=excWriteConsoleAReadConsolecrt_atoi[esi]=eaxesi=esi + 4ecx=ebxдаecx<5нетeax=0ebx=0ecx=0даeax < 0eax=[esi]ecx=_cebx=sum_neg1esi=mas1данетsum_neg1=ebxecx<5esi=esi+4ebx=ebx+1нетecx=_cebx=sum_neg2esi=mas2нетebx=ebx+1нетeax < 0sum_neg2=ebxдаecx<5esi=esi+4eax=[esi]eax=0ebx=0ecx=0ecx=_cebx=sum_mass1esi=mas1eax=[esi]ebx=ebx+eaxesi=esi+4даecx < 5нетsum_mass1=ebxecx=_ceax=0ebx=0ecx=0ebx=sum_mass2esi=esi+4ebx=ebx+eaxeax=[esi]esi=mas2дадаecx < 5sum_mass2=ebxнетнетeax=0ebx=0ecx=0eax=sum_neg1ebx=sum_neg2eax < ebxsum_neg1=0 ReadConsoleWriteConsoleAWriteConsoleAwsprintfebx=sum_mass1WriteConsoleAwsprintfebx=sum_mass_2WriteConsoleAwsprintfebx=sum_neg2ebx=sum_neg1sum_neg2=0wsprintfWriteConsoleA2.3 Текстпрограммы.

386.model flat, stdcalloptioncasemap: none; case sensitive;##################################################################include masm32includewindows. inc include masm32includekernel32. inc ;include masm32includefpu. inc include masm32includeuser32. inc include masm32includemsvcrt. inc includelib masm32libuser32. lib includelib masm32libkernel32. lib includelib masm32libmsvcrt. lib includelib masm32libfpu. lib ;##################################################################.data ;определениепеременныхConsoleTitle db «Sravneniemassivov 4*4», 0_c dd 5 sum_mass1dd 0sum_mass2dd 0 sum_neg1dd 0sum_neg2dd 0buf db 30 dup (?) stdout DWORD? stdin DWORD? cReaddd? mas1dd 5 dup (0) mas2dd 5 dup (0)st1 db «Vvesty masiv1: «, 0 st4 db «Vvesty masiv2: «, 0 st8 db «Vvedite Enter «, 0st8_len = $-st8st3 db 10 dup (0) ifmt1 db «negativelementy 1 massiva = %d», 0if_len1 = $-ifmt1 ifmt2 db «negativelementy 2 massiva = %d», 0 if_len2 = $-ifmt2ifmt3 db «summa elementov 1 massiva = %d», 0 if_len3 = $-ifmt3ifmt4 db «summa elementov 2 massiva = %d», 0 if_len4 = $-ifmt4.data?hOutputdd? hInputdd? nRead db? nWriten db ?;##################################################################.code start: movecx,_clea esi, mas1m1: movebx, ecxinvokeGetStdHandle, STD_OUTPUT_HANDLEmovstdout, eaxinvokeGetStdHandle, STD_INPUT_HANDLEmovstdin, eaxinvokeWriteConsoleA, stdout, ADDR st1,14,NULL, NULL invokeReadConsole, stdin, ADDR buf, 20, ADDR cRead, NULL; чтениячисла;

как символ invokecrt_atoi, ADDRbuf; преобразовать символ в число mov [esi], eaxadd esi, 4 movecx, ebxloop m1 mov ecx, 0mov ebx, 0movecx,_clea esi, mas2m8: movebx, ecxinvokeGetStdHandle, STD_OUTPUT_HANDLEmovstdout, eaxinvokeGetStdHandle, STD_INPUT_HANDLEmovstdin, eaxinvokeWriteConsoleA, stdout, ADDR st4,14,NULL, NULL invokeReadConsole, stdin, ADDR buf, 20, ADDR cRead, NULL; чтениячисла; как символ invokecrt_atoi, ADDRbuf; преобразовать символ в число mov [esi], eaxadd esi, 4 movecx, ebxloop m8 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; расчет количества отрицательных элементов 1 массиваmovecx,_c ;счетчик циклаmov ebx, sum_neg1 leaesi, mas1; загрузка адреса начала массива m3: moveax,[esi]cmp eax, 0jge m2add ebx, 1 m2: add esi, 4 ;добавили к адресу элемента массива 4 байта — ;перешли к следующему числуloopm3mov [sum_neg1], ebxmov eax, 0 ;обнуление регистровmov ebx, 0mov ecx, 0; расчет количества отрицательных элементов 2 массиваmovecx,_c ;счетчик циклаmov ebx, sum_neg2 leaesi, mas2; загрузка адреса начала массива m4: moveax,[esi]cmp eax, 0jge m7add ebx, 1 m7: add esi, 4 ;добавили к адресу элемента массива 4 байта — ;перешли к следующему числуloopm4mov [sum_neg2], ebxmov eax, 0 movebx, 0movecx, 0; расчет суммы элементов 1 массиваmovecx,_cmov ebx, sum_mass1lea esi, mas1 m5: moveax,[esi]addebx, eaxadd esi, 4loop m5mov [sum_mass1], ebxmov eax, 0 ;обнуление регистровmov ebx, 0mov ecx, 0; расчет суммы элементов 2 массиваmovecx,_cmov ebx, sum_mass2lea esi, mas2 m6: moveax,[esi]addebx, eaxadd esi, 4loop m6mov [sum_mass2], ebxmoveax, 0; обнуление регистровmovebx, 0mov ecx, 0moveax,[sum_neg1]movebx,[sum_neg2]cmpeax, ebxjl metka_6mov [sum_mass2], 0jmp metka_1metka6:mov [sum_mass1], 0metka1:; вывод количества отрицательных элементов 1 массива mov ebx, 0movebx,[sum_neg1] invokewsprintf, addr st3, addr ifmt1, ebxinvokeWriteConsoleA, stdout, ADDR st3, if_len1,NULL, NULL; вывод количества отрицательных элементов 2 массива mov ebx, 0movebx,[sum_neg2] invokewsprintf, addr st3, addr ifmt2, ebxinvokeWriteConsoleA, stdout, ADDR st3, if_len2,NULL, NULL; вывод суммы элементов 1 массиваmovebx, 0movebx,[sum_mass1] invokewsprintf, addr st3, addr ifmt3, ebxinvokeWriteConsoleA, stdout, ADDR st3, if_len3,NULL, NULL; вывод суммы элементов 2 массиваmovebx, 0movebx,[sum_mass2] invokewsprintf, addr st3, addr ifmt4, ebxinvokeWriteConsoleA, stdout, ADDR st3, if_len4,NULL, NULL ;завершение программы по нажатию клавиша EnterinvokeWriteConsoleA, stdout, ADDR st8, st8_len, NULL, NULL invokeReadConsole, stdin, ADDR buf, 15, ADDR cRead, NULLinvoke ExitProcess, 0 endstart2.4 Результаты работы программы

ЗАКЛЮЧЕНИЕ

Целью курсового проекта являлось закрепление основ и углубление знаний приемов программирования на языке Assembler (диалекты «masm», «tasm», «nasm»), получение практических навыков в низкоуровневом программировании и работе с регистрами. Задачей курсового проекта ставилось освоение всех этапов создания программного комплекса от постановки задачи до практической реализации. В результате выполнения курсовой работы был разработанпрограммный код на низкоуровневом языке для осуществления арифметических операций с массивами, работающий с регистрами и использующий различные типы адресации и циклы. Литература

Аблязов Р. 3. Программирование на ассемблере на платформе х86−64. — М.: ДМ К Пресс, 2011. — 304 с.: ил. Ирвин, Кип. Язык ассемблера для процессоров Intel, 4-е издание.: Пер.

с англ. — М.: Издательский дом «Вильямс», 2005. — 912 с. Магда Ю. С.

Ассемблер для процессоров IntelPentium. — СПб.: Питер, 2006. — 410 с: ил. Рудольф Марек. Ассемблер на примерах.

Базовый курс. — СПб: Наука и Техника, 2005. — 240 с. Скляров И. Изучаем Assembler за 7 дней.

2010 г. — 197 с. Шубников В. Г., Беляев В. С, Беляев С. Ю. Информатика. Програмирование на языке ассемблера: Учеб.

пособие. СПб.: Изд-во Политехн. ун-та, 2007. 101 с. Юров В. И., Assembler. Учебник для вузов.

2-е изд. — СПб.: Питер, 2006. — 636с. Юров В. И., Assembler.Практикум.

2-е изд. — СПб.: Питер, 2006. —399с.

Показать весь текст

Список литературы

  1. Р. 3. Программирование на ассемблере на платформе х86−64. — М.: ДМ К Пресс, 2011. — 304 с.: ил.
  2. Ирвин, Кип. Язык ассемблера для процессоров Intel, 4-е издание.: Пер. с англ. — М.: Издательский дом «Вильямс», 2005. — 912 с.
  3. Ю. С. Ассемблер для процессоров Intel Pentium. — СПб.: Питер, 2006. — 410 с: ил.
  4. Рудольф Марек. Ассемблер на примерах. Базовый курс. — СПб: Наука и Техника, 2005. — 240 с.
  5. И. Изучаем Assembler за 7 дней. 2010 г. — 197 с.
  6. В.Г., Беляев В.С, Беляев С. Ю. Информатика. Програмирование на языке ассемблера: Учеб.пособие. СПб.: Изд-во Политехн. ун-та, 2007. 101 с.
  7. В. И., Assembler. Учебник для вузов. 2-е изд. — СПб.: Питер, 2006. — 636 с.
  8. В. И., Assembler. Практикум. 2-е изд. — СПб.: Питер, 2006. — 399 с.
Заполнить форму текущей работой
Купить готовую работу

ИЛИ