Задача на Masm32
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
Задача на Masm32 - 2010-06-18 19:55:31.720000
|
|
|
Basher2008
Сообщений: 148
Оценки: 0
Присоединился: 2008-01-27 17:28:11.896666
|
Всем привет. Такая проблема: не могу решить задачу на ассемблере…( задача такая: В одномерном массиве, состоящем из 20 двойных слов, вычислить: - количество отрицательных элементов массива; - сумму модулей элементов массива, расположенных после мини- мального по модулю элемента. Заменить все отрицательные элементы массива их квадратами и упоря- дочить элементы массива по возрастанию. Для начала я решил разобраться с заменой всех отрицательных элементов массива их квадратами…потом уже всё остальное. вот пример из методички. он выполняет упорядочивание элементов массива пузырьковым методом. (по возрастанию): ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ include \masm32\include\masm32rt.inc includelib \masm32\lib\masm32.lib ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ comment * ——————————————— Build this console app with "MAKEIT.BAT" on the PROJECT menu. ——————————————— * .data? value dd ? ; Задать размер массива. array_length = 10 ; Выделить область памяти под массив. array dd array_length dup (?) .data item dd 0 ; Начальное значение генератора случайных чисел. seed dd 24052010 ; Параметры генератора случайных чисел. IA = 16807 IM = 2147483647 IQ = 12773 IR = 2836 RANDOM_MASK = 123459876 ; Минимальное значение случайного числа. MIN_RANDOM = -100 ; Максимальное значение случайного числа. MAX_RANDOM = 100 ; Интервал значений случайных чисел. INT_RANDOM = MAX_RANDOM - MIN_RANDOM .code start: ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ call main inkey exit ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ ; Прототипы процедур. random proto random_array proto :dword,:dword print_array proto :dword,:dword,:dword bubble_sort proto :dword,:dword ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ main proc cls ; Заполнить массив случайными числами. invoke random_array,array_length,addr array ; Вывести сообщение. print "Before sorting:",10,13,10,13,0 ; Вывести элементы массива. fn print_array,"unsorted",array_length,addr array ; Вывести сообщение. print " ",10,13,0 print "After sorting:",10,13,10,13,0 ; Выполнить сортировку массива. invoke bubble_sort,array_length,addr array ; Вывести элементы массива. fn print_array,"sorted",array_length,addr array ret main endp ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ random proc uses ebx edx xor dword ptr seed, RANDOM_MASK xor edx, edx ; EDX <- 0 mov eax, seed ; EDX:EAX <- seed mov ebx, IQ ; EBX <- IQ idiv ebx ; EAX <- seed div IQ push eax ; Сохранить значение EAX. imul ebx ; EDX:EAX <- IQ * EAX mov edx, seed ; EDX <- seed sub edx, eax ; EDX <- seed - EAX mov eax, edx ; EAX <- EDX mov ebx, IA ; EBX <- IA imul ebx ; EDX:EAX <- EAX * IA mov edx, eax ; EDX <- EAX pop eax ; Восстановить значение EAX. push edx ; Сохранить значение EDX. mov ebx, IR ; EBX <- IR imul ebx ; EDX:EAX <- EAX * IR pop edx ; Восстановить значение EDX. sub edx, eax ; EDX <- EDX - EAX jge seed_ge_zero ; ZF сформирован командой SUB. add edx, IM seed_ge_zero: mov eax, edx ; EAX <- EDX mov seed, eax ; seed <- EAX xor dword ptr seed, RANDOM_MASK xor edx, edx ; EDX <- 0 mov ebx, INT_RANDOM ; EBX <- интервал значений. idiv ebx ; EDX <- число в интервале. mov eax, edx ; EAX <- EDX add eax, MIN_RANDOM ; EAX <- случайное число. ret random endp ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ random_array proc arr_len: dword, arr_ref: dword mov ecx, arr_len ; ECX <- размер массива. mov ebx, arr_ref ; EBX <- адрес начала массива. xor edi, edi ; EDI <- 0 (индекс массива). ; Пропустить цикл, если ECX = 0. .if ecx != 0 .repeat ; Сохранить случайное число ; в элементе массива. mov dword ptr [ebx + 4*edi], rv(random) ; Увеличить индекс. inc edi .untilcxz .endif ret random_array endp ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ print_array proc arr_name: dword, arr_len: dword, arr_ref: dword ; Инициализировать счетчик. xor esi, esi ; ESI <- 0 .while esi < arr_len push esi ; Сохранить ESI в стеке. ; Вывести имя массива. print arr_name print "[",0 ; Вывести индекс элемента. pop esi ; Восстановить ESI из стека. mov eax, esi ; EAX <- ESI push esi ; Сохранить ESI в стеке. print sstr$(eax),0 print "] = ",0 ; Получить элемент массива. pop esi ; Восстановить ESI из стека. mov ebx, arr_ref ; EBX <- Начало массива. mov eax, dword ptr [ebx + 4*esi] push esi ; Сохранить ESI в стек. ; Вывести элемент массива. print sstr$(eax),10,13,0 pop esi ; Восстановить ESI из стека. ; Перейти к следующему элементу массива. inc esi .endw ret print_array endp ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ bubble_sort proc arr_len: dword, arr_ref: dword ; Задать адрес начала массива. mov ebx, arr_ref ; Инициализировать счетчик. xor esi, esi ; ESI <- 0 .while esi < arr_len ; Инициализировать счетчик. mov edi, esi ; EDI <- ESI inc edi ; EDI <- ESI + 1 .while edi < arr_len ; Получить значения элементов. mov eax, dword ptr [ebx + 4*esi] ; Выполнить сравнение. .if eax > sdword ptr [ebx + 4*edi] ; Обменять значения. xchg eax, dword ptr [ebx + 4*edi] mov dword ptr [ebx + 4*esi], eax .endif ; Увеличить значение счетчика. inc edi .endw ; Увеличить значение счетчика. inc esi .endw ret bubble_sort endp ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ end start а вот что я изменил (изменению подверглась только выделенная часть.): ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ include \masm32\include\masm32rt.inc includelib \masm32\lib\masm32.lib ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ comment * ——————————————— Build this console app with "MAKEIT.BAT" on the PROJECT menu. ——————————————— * .data? value dd ? ; Задать размер массива. array_length = 10 ; Выделить область памяти под массив. array dd array_length dup (?) .data item dd 0 ; Начальное значение генератора случайных чисел. seed dd 24052010 ; Параметры генератора случайных чисел. IA = 16807 IM = 2147483647 IQ = 12773 IR = 2836 RANDOM_MASK = 123459876 ; Минимальное значение случайного числа. MIN_RANDOM = -100 ; Максимальное значение случайного числа. MAX_RANDOM = 100 ; Интервал значений случайных чисел. INT_RANDOM = MAX_RANDOM - MIN_RANDOM .code start: ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ call main inkey exit ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ ; Прототипы процедур. random proto random_array proto :dword,:dword print_array proto :dword,:dword,:dword bubble_sort proto :dword,:dword ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ main proc cls ; Заполнить массив случайными числами. invoke random_array,array_length,addr array ; Вывести сообщение. print "Before sorting:",10,13,10,13,0 ; Вывести элементы массива. fn print_array,"unsorted",array_length,addr array ; Вывести сообщение. print " ",10,13,0 print "After sorting:",10,13,10,13,0 ; Выполнить сортировку массива. invoke bubble_sort,array_length,addr array ; Вывести элементы массива. fn print_array,"sorted",array_length,addr array ret main endp ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ random proc uses ebx edx xor dword ptr seed, RANDOM_MASK xor edx, edx ; EDX <- 0 mov eax, seed ; EDX:EAX <- seed mov ebx, IQ ; EBX <- IQ idiv ebx ; EAX <- seed div IQ push eax ; Сохранить значение EAX. imul ebx ; EDX:EAX <- IQ * EAX mov edx, seed ; EDX <- seed sub edx, eax ; EDX <- seed - EAX mov eax, edx ; EAX <- EDX mov ebx, IA ; EBX <- IA imul ebx ; EDX:EAX <- EAX * IA mov edx, eax ; EDX <- EAX pop eax ; Восстановить значение EAX. push edx ; Сохранить значение EDX. mov ebx, IR ; EBX <- IR imul ebx ; EDX:EAX <- EAX * IR pop edx ; Восстановить значение EDX. sub edx, eax ; EDX <- EDX - EAX jge seed_ge_zero ; ZF сформирован командой SUB. add edx, IM seed_ge_zero: mov eax, edx ; EAX <- EDX mov seed, eax ; seed <- EAX xor dword ptr seed, RANDOM_MASK xor edx, edx ; EDX <- 0 mov ebx, INT_RANDOM ; EBX <- интервал значений. idiv ebx ; EDX <- число в интервале. mov eax, edx ; EAX <- EDX add eax, MIN_RANDOM ; EAX <- случайное число. ret random endp ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ random_array proc arr_len: dword, arr_ref: dword mov ecx, arr_len ; ECX <- размер массива. mov ebx, arr_ref ; EBX <- адрес начала массива. xor edi, edi ; EDI <- 0 (индекс массива). ; Пропустить цикл, если ECX = 0. .if ecx != 0 .repeat ; Сохранить случайное число ; в элементе массива. mov dword ptr [ebx + 4*edi], rv(random) ; Увеличить индекс. inc edi .untilcxz .endif ret random_array endp ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ print_array proc arr_name: dword, arr_len: dword, arr_ref: dword ; Инициализировать счетчик. xor esi, esi ; ESI <- 0 .while esi < arr_len push esi ; Сохранить ESI в стеке. ; Вывести имя массива. print arr_name print "[",0 ; Вывести индекс элемента. pop esi ; Восстановить ESI из стека. mov eax, esi ; EAX <- ESI push esi ; Сохранить ESI в стеке. print sstr$(eax),0 print "] = ",0 ; Получить элемент массива. pop esi ; Восстановить ESI из стека. mov ebx, arr_ref ; EBX <- Начало массива. mov eax, dword ptr [ebx + 4*esi] push esi ; Сохранить ESI в стек. ; Вывести элемент массива. print sstr$(eax),10,13,0 pop esi ; Восстановить ESI из стека. ; Перейти к следующему элементу массива. inc esi .endw ret print_array endp ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ bubble_sort proc arr_len: dword, arr_ref: dword ; Задать адрес начала массива. mov ebx, arr_ref ; Инициализировать счетчик. xor esi, esi ; ESI <- 0 .while esi < arr_len ; Инициализировать счетчик. mov edi, esi ; EDI <- ESI inc edi ; EDI <- ESI + 1 .while edi < arr_len mov eax, dword ptr [ebx + 4*esi] .if eax < 0 ; если элемент массива меньше 0 mul eax ; умножение eax само на себя mov dword ptr [ebx + 4*esi], eax ; замена умноженного элемента на "старый" .endif ; Увеличить значение счетчика. inc edi .endw ; Увеличить значение счетчика. inc esi .endw ret bubble_sort endp ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ end start но этот код массив абсолютно не изменяет, хотя в ida pro цикл bubble sort проходит около 55 раз… потом нужно будет добавить наверно счётчик отрицательных элементов(или esi и так им является?…хз), ну и добавить ещё один цикл упорядочивающий элементы по возрастанию (взять наверн их часть кода). помогите плз кто чем может…
|
|
|
RE: Задача на Masm32 - 2010-06-18 20:35:58.553333
|
|
|
rgo
Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
|
quote:
ORIGINAL: Basher2008 но этот код массив абсолютно не изменяет, хотя в ida pro цикл bubble sort проходит около 55 раз… потом нужно будет добавить наверно счётчик отрицательных элементов(или esi и так им является?…хз), ну и добавить ещё один цикл упорядочивающий элементы по возрастанию (взять наверн их часть кода). помогите плз кто чем может… Нельзя возводить в квадрат сортируя. Надо сначала возвести все элементы в квадрат, а потом сортировать. Иначе чёрт его знает что получится. Но ты пытаешься провернуть именно это. Вообще не трогай существующие процедуры из методички. Они работают? Вот и оставь их в покое, используй их такими какие они есть. А вообще, сначала стоит найти количество отрицательных элементов и сумму модулей, иначе как ты их будешь искать после того, как возведёшь все элементы в квадрат?
|
|
|
RE: Задача на Masm32 - 2010-06-18 21:38:13.810000
|
|
|
Basher2008
Сообщений: 148
Оценки: 0
Присоединился: 2008-01-27 17:28:11.896666
|
quote:
Надо сначала возвести все элементы в квадрат, а потом сортировать …так мне не надо возводить все элементы…а только орицательные. quote:
Вообще не трогай существующие процедуры из методички. Они работают? да, они работают. quote:
А вообще, сначала стоит найти количество отрицательных элементов и сумму модулей, иначе как ты их будешь искать после того, как возведёшь все элементы в квадрат? да, это верно… "найти сумму модулей элементов массива, расположенных после мини- мального по модулю элемента." …это я вообще не представляю как сделать(
|
|
|
RE: Задача на Masm32 - 2010-06-18 23:05:07.043333
|
|
|
rgo
Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
|
quote:
ORIGINAL: Basher2008 quote:
Надо сначала возвести все элементы в квадрат, а потом сортировать …так мне не надо возводить все элементы…а только орицательные. Тем более. Не трогай существующие процедуры. quote:
ORIGINAL: Basher2008 quote:
А вообще, сначала стоит найти количество отрицательных элементов и сумму модулей, иначе как ты их будешь искать после того, как возведёшь все элементы в квадрат? да, это верно… "найти сумму модулей элементов массива, расположенных после мини- мального по модулю элемента." …это я вообще не представляю как сделать( Разбивай задачу на более мелкие. Сначала найди номер (индекс) минимального элемента. Классическая задачка программирования: найти минимальный элемент. Когда будешь знать номер, тебе останется просуммировать модули элементов начиная с этого номера и до конца массива.
|
|
|
RE: Задача на Masm32 - 2010-06-18 23:35:51.750000
|
|
|
Basher2008
Сообщений: 148
Оценки: 0
Присоединился: 2008-01-27 17:28:11.896666
|
вот, пробовал найти количество отрицательных элементов…так как регистры вроде все заняты, ввел переменную "peremennaya" ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ include \masm32\include\masm32rt.inc includelib \masm32\lib\masm32.lib ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ comment * ——————————————— Build this console app with "MAKEIT.BAT" on the PROJECT menu. ——————————————— * .data? value dd ? ; Задать размер массива. array_length = 10 ; Выделить область памяти под массив. array dd array_length dup (?) peremennaya dd ? .data item dd 0 ; Начальное значение генератора случайных чисел. seed dd 23091991 ; Параметры генератора случайных чисел. IA = 16807 IM = 2147483647 IQ = 12773 IR = 2836 RANDOM_MASK = 123459876 ; Минимальное значение случайного числа. MIN_RANDOM = -100 ; Максимальное значение случайного числа. MAX_RANDOM = 100 ; Интервал значений случайных чисел. INT_RANDOM = MAX_RANDOM - MIN_RANDOM .code start: ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ call main inkey exit ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ ; Прототипы процедур. random proto random_array proto :dword,:dword print_array proto :dword,:dword,:dword bubble_sort proto :dword,:dword ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ main proc cls ; Заполнить массив случайными числами. invoke random_array,array_length,addr array ; Вывести сообщение. print "Before sorting:",10,13,10,13,0 ; Вывести элементы массива. fn print_array,"unsorted",array_length,addr array ; Вывести сообщение. print " ",10,13,0 print "After sorting:",10,13,10,13,0 ; Выполнить сортировку массива. invoke bubble_sort,array_length,addr array ; Вывести элементы массива. fn print_array,"sorted",array_length,addr array print "peremennaya:",10,13,10,13,0 print str$(peremennaya),13,10 ; вывод количества элементов < 0 ret main endp ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ random proc uses ebx edx xor dword ptr seed, RANDOM_MASK xor edx, edx ; EDX <- 0 mov eax, seed ; EDX:EAX <- seed mov ebx, IQ ; EBX <- IQ idiv ebx ; EAX <- seed div IQ push eax ; Сохранить значение EAX. imul ebx ; EDX:EAX <- IQ * EAX mov edx, seed ; EDX <- seed sub edx, eax ; EDX <- seed - EAX mov eax, edx ; EAX <- EDX mov ebx, IA ; EBX <- IA imul ebx ; EDX:EAX <- EAX * IA mov edx, eax ; EDX <- EAX pop eax ; Восстановить значение EAX. push edx ; Сохранить значение EDX. mov ebx, IR ; EBX <- IR imul ebx ; EDX:EAX <- EAX * IR pop edx ; Восстановить значение EDX. sub edx, eax ; EDX <- EDX - EAX jge seed_ge_zero ; ZF сформирован командой SUB. add edx, IM seed_ge_zero: mov eax, edx ; EAX <- EDX mov seed, eax ; seed <- EAX xor dword ptr seed, RANDOM_MASK xor edx, edx ; EDX <- 0 mov ebx, INT_RANDOM ; EBX <- интервал значений. idiv ebx ; EDX <- число в интервале. mov eax, edx ; EAX <- EDX add eax, MIN_RANDOM ; EAX <- случайное число. ret random endp ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ random_array proc arr_len: dword, arr_ref: dword mov ecx, arr_len ; ECX <- размер массива. mov ebx, arr_ref ; EBX <- адрес начала массива. xor edi, edi ; EDI <- 0 (индекс массива). ; Пропустить цикл, если ECX = 0. .if ecx != 0 .repeat ; Сохранить случайное число ; в элементе массива. mov dword ptr [ebx + 4*edi], rv(random) ; Увеличить индекс. inc edi .untilcxz .endif ret random_array endp ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ print_array proc arr_name: dword, arr_len: dword, arr_ref: dword ; Инициализировать счетчик. xor esi, esi ; ESI <- 0 .while esi < arr_len push esi ; Сохранить ESI в стеке. ; Вывести имя массива. print arr_name print "[",0 ; Вывести индекс элемента. pop esi ; Восстановить ESI из стека. mov eax, esi ; EAX <- ESI push esi ; Сохранить ESI в стеке. print sstr$(eax),0 print "] = ",0 ; Получить элемент массива. pop esi ; Восстановить ESI из стека. mov ebx, arr_ref ; EBX <- Начало массива. mov eax, dword ptr [ebx + 4*esi] push esi ; Сохранить ESI в стек. ; Вывести элемент массива. print sstr$(eax),10,13,0 pop esi ; Восстановить ESI из стека. ; Перейти к следующему элементу массива. inc esi .endw ret print_array endp ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ bubble_sort proc arr_len: dword, arr_ref: dword ; Задать адрес начала массива. mov ebx, arr_ref ; Инициализировать счетчик. xor esi, esi ; ESI <- 0 mov peremennaya, 0 ; занес 0 в переменную .while esi < arr_len ; Инициализировать счетчик. mov edi, esi ; EDI <- ESI inc edi ; EDI <- ESI + 1 .while edi < arr_len mov eax, dword ptr [ebx + 4*esi] .if eax < 0 inc peremennaya ; переменная +1 mov dword ptr [ebx + 4*esi], eax .endif ; Увеличить значение счетчика. inc edi .endw ; Увеличить значение счетчика. inc esi .endw ret bubble_sort endp ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ end start но в итоге мне выдает что "переменная" = 0…если искать положительные элементы, то выдает переменную равную 45… .while edi < arr_len mov eax, dword ptr [ebx + 4*esi] .if eax > 0 inc peremennaya ; переменная +1 mov dword ptr [ebx + 4*esi], eax .endif
|
|
|
RE: Задача на Masm32 - 2010-06-18 23:50:35.746666
|
|
|
rgo
Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
|
А почему ты делаешь это внутре баблсорта? Я ж говорю: не трогай рабочие процедуры. Кроме того, этот .if у тебя оказывается вложенным в два цикла. Зачем?
|
|
|
RE: Задача на Masm32 - 2010-06-19 00:23:49.420000
|
|
|
Basher2008
Сообщений: 148
Оценки: 0
Присоединился: 2008-01-27 17:28:11.896666
|
хорошо. переделал…не трогаю рабочие процедуры. quote:
Кроме того, этот .if у тебя оказывается вложенным в два цикла. Зачем? незнаю…так препод сделал… в общем учёл всё, переделал…в итоге переменная всё равно равна 0…[:(] ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ include \masm32\include\masm32rt.inc includelib \masm32\lib\masm32.lib ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ comment * ——————————————— Build this console app with "MAKEIT.BAT" on the PROJECT menu. ——————————————— * .data? value dd ? ; Задать размер массива. array_length = 10 ; Выделить область памяти под массив. array dd array_length dup (?) peremennaya dd ? .data item dd 0 ; Начальное значение генератора случайных чисел. seed dd 24052010 ; Параметры генератора случайных чисел. IA = 16807 IM = 2147483647 IQ = 12773 IR = 2836 RANDOM_MASK = 123459876 ; Минимальное значение случайного числа. MIN_RANDOM = -100 ; Максимальное значение случайного числа. MAX_RANDOM = 100 ; Интервал значений случайных чисел. INT_RANDOM = MAX_RANDOM - MIN_RANDOM .code start: ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ call main inkey exit ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ ; Прототипы процедур. random proto random_array proto :dword,:dword print_array proto :dword,:dword,:dword bubble_sort proto :dword,:dword ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ main proc cls ; Заполнить массив случайными числами. invoke random_array,array_length,addr array ; Вывести сообщение. print "Before sorting:",10,13,10,13,0 ; Вывести элементы массива. fn print_array,"unsorted",array_length,addr array ; Вывести сообщение. print " ",10,13,0 print "After sorting:",10,13,10,13,0 ; Выполнить сортировку массива. invoke bubble_sort,array_length,addr array ; Вывести элементы массива. fn print_array,"sorted",array_length,addr array print "min elem:",10,13,10,13,0 print str$(peremennaya),13,10 ; вывод количества элементов < 0 ret main endp ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ random proc uses ebx edx xor dword ptr seed, RANDOM_MASK xor edx, edx ; EDX <- 0 mov eax, seed ; EDX:EAX <- seed mov ebx, IQ ; EBX <- IQ idiv ebx ; EAX <- seed div IQ push eax ; Сохранить значение EAX. imul ebx ; EDX:EAX <- IQ * EAX mov edx, seed ; EDX <- seed sub edx, eax ; EDX <- seed - EAX mov eax, edx ; EAX <- EDX mov ebx, IA ; EBX <- IA imul ebx ; EDX:EAX <- EAX * IA mov edx, eax ; EDX <- EAX pop eax ; Восстановить значение EAX. push edx ; Сохранить значение EDX. mov ebx, IR ; EBX <- IR imul ebx ; EDX:EAX <- EAX * IR pop edx ; Восстановить значение EDX. sub edx, eax ; EDX <- EDX - EAX jge seed_ge_zero ; ZF сформирован командой SUB. add edx, IM seed_ge_zero: mov eax, edx ; EAX <- EDX mov seed, eax ; seed <- EAX xor dword ptr seed, RANDOM_MASK xor edx, edx ; EDX <- 0 mov ebx, INT_RANDOM ; EBX <- интервал значений. idiv ebx ; EDX <- число в интервале. mov eax, edx ; EAX <- EDX add eax, MIN_RANDOM ; EAX <- случайное число. ret random endp ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ random_array proc arr_len: dword, arr_ref: dword mov ecx, arr_len ; ECX <- размер массива. mov ebx, arr_ref ; EBX <- адрес начала массива. xor edi, edi ; EDI <- 0 (индекс массива). ; Пропустить цикл, если ECX = 0. .if ecx != 0 .repeat ; Сохранить случайное число ; в элементе массива. mov dword ptr [ebx + 4*edi], rv(random) ; Увеличить индекс. inc edi .untilcxz .endif ret random_array endp ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ print_array proc arr_name: dword, arr_len: dword, arr_ref: dword ; Инициализировать счетчик. xor esi, esi ; ESI <- 0 .while esi < arr_len push esi ; Сохранить ESI в стеке. ; Вывести имя массива. print arr_name print "[",0 ; Вывести индекс элемента. pop esi ; Восстановить ESI из стека. mov eax, esi ; EAX <- ESI push esi ; Сохранить ESI в стеке. print sstr$(eax),0 print "] = ",0 ; Получить элемент массива. pop esi ; Восстановить ESI из стека. mov ebx, arr_ref ; EBX <- Начало массива. mov eax, dword ptr [ebx + 4*esi] push esi ; Сохранить ESI в стек. ; Вывести элемент массива. print sstr$(eax),10,13,0 pop esi ; Восстановить ESI из стека. ; Перейти к следующему элементу массива. inc esi .endw ret print_array endp ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ bubble_sort proc arr_len: dword, arr_ref: dword ; Задать адрес начала массива. mov ebx, arr_ref ; Инициализировать счетчик. xor esi, esi ; ESI <- 0 .while esi < arr_len ; Инициализировать счетчик. mov edi, esi ; EDI <- ESI inc edi ; EDI <- ESI + 1 .while edi < arr_len ; Получить значения элементов. mov eax, dword ptr [ebx + 4*esi] ; Выполнить сравнение. .if eax > sdword ptr [ebx + 4*edi] ; Обменять значения. xchg eax, dword ptr [ebx + 4*edi] mov dword ptr [ebx + 4*esi], eax .endif ; Увеличить значение счетчика. inc edi .endw ; Увеличить значение счетчика. inc esi .endw ret bubble_sort endp ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ min_elem proc arr_len: dword, arr_ref: dword ; Задать адрес начала массива. mov ebx, arr_ref ; Инициализировать счетчик. xor esi, esi ; ESI <- 0 .while esi < arr_len mov eax, dword ptr [ebx + 4*esi] .if eax > 0 inc peremennaya .endif ; Увеличить значение счетчика. inc esi .endw ret min_elem endp end start
|
|
|
RE: Задача на Masm32 - 2010-06-19 11:27:11.360000
|
|
|
Basher2008
Сообщений: 148
Оценки: 0
Присоединился: 2008-01-27 17:28:11.896666
|
Вот есть рабочий кусок кода, вычисляющий максимальный элемент массива: ;—–максимальный по модулю элемент массива.—— poisk proc arr_len: dword, arr_ref: dword, min:dword, max:dword mov ebx, min mov ecx, max push ebx push ecx mov ebx, arr_ref mov ecx, arr_len cmp ecx, 0 je no_min_max xor esi, esi xor edi, edi mov eax, dword ptr[ebx]; минимум mov edx, dword ptr[ebx]; максимум inc esi dec ecx start_cicl: mov edi, dword ptr[ebx+4*esi] cmp eax, edi jl ne_min mov eax, edi ne_min: cmp edx, edi jg ne_max mov edx, edi ne_max: inc esi loop start_cicl ;mov ebx, min ;mov ecx, max pop ecx pop ebx mov dword ptr[ebx], eax mov dword ptr[ecx], edx no_min_max: ret poisk endp его надо модифицировать под мою задачу…но мне в нём многое непонятно. например mov eax, dword ptr[ebx]; минимум mov edx, dword ptr[ebx]; максимум вроде как значения в регистрах eax и edx будут равны после этого действия, но тут пишется что eax минимум а edx максимум…непоняятно
|
|
|
RE: Задача на Masm32 - 2010-06-21 22:52:22.426666
|
|
|
Basher2008
Сообщений: 148
Оценки: 0
Присоединился: 2008-01-27 17:28:11.896666
|
Вот, вроде всё написал, но неработает(( print_array в первый раз не срабатывает…сумма не ищется.хотя если убрать процедуры summa и otric то print_array срабатывает как положено 2 раза, замена элементов происходит, сортировка тоже.. т.е. проблема вычислить: - количество отрицательных элементов массива; - сумму модулей элементов массива, расположенных после мини- мального по модулю элемента. Помогите пожплуйста…я уже просто иссяк( ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ include \masm32\include\masm32rt.inc includelib \masm32\lib\masm32.lib ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ comment * ——————————————— Build this console app with "MAKEIT.BAT" on the PROJECT menu. ——————————————— * .data? value dd ? ; Задать размер массива. array_length = 10 ; Выделить область памяти под массив. array dd array_length dup (?) peremennaya dd ? .data item dd 0 ; Начальное значение генератора случайных чисел. seed dd 23091991 ; Параметры генератора случайных чисел. IA = 16807 IM = 2147483647 IQ = 12773 IR = 2836 RANDOM_MASK = 123459876 ; Минимальное значение случайного числа. MIN_RANDOM = -1000 ; Максимальное значение случайного числа. MAX_RANDOM = 1000 ; Интервал значений случайных чисел. INT_RANDOM = MAX_RANDOM - MIN_RANDOM .code start: ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ call main inkey exit ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ ; Прототипы процедур. random proto random_array proto :dword,:dword print_array proto :dword,:dword,:dword otric proto :dword,:dword summa proto :dword,:dword zamena proto :dword,:dword bubble_sort proto :dword,:dword ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ main proc cls ; Заполнить массив случайными числами. invoke random_array,array_length,addr array ; Вывести сообщение. print "Before sorting:",10,13,10,13,0 ; Вывести элементы массива. fn print_array,"unsorted",array_length,addr array ; Вывести сообщение. print " ",10,13,0 print "After sorting:",10,13,10,13,0 invoke otric,array_length,addr array invoke summa,array_length,addr array ;выполнить замену отрицательных элементов их квадратами invoke zamena,array_length,addr array ; Выполнить сортировку массива. invoke bubble_sort,array_length,addr array ; Вывести элементы массива. fn print_array,"sorted",array_length,addr array ret main endp ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ random proc uses ebx edx xor dword ptr seed, RANDOM_MASK xor edx, edx ; EDX <- 0 mov eax, seed ; EDX:EAX <- seed mov ebx, IQ ; EBX <- IQ idiv ebx ; EAX <- seed div IQ push eax ; Сохранить значение EAX. imul ebx ; EDX:EAX <- IQ * EAX mov edx, seed ; EDX <- seed sub edx, eax ; EDX <- seed - EAX mov eax, edx ; EAX <- EDX mov ebx, IA ; EBX <- IA imul ebx ; EDX:EAX <- EAX * IA mov edx, eax ; EDX <- EAX pop eax ; Восстановить значение EAX. push edx ; Сохранить значение EDX. mov ebx, IR ; EBX <- IR imul ebx ; EDX:EAX <- EAX * IR pop edx ; Восстановить значение EDX. sub edx, eax ; EDX <- EDX - EAX jge seed_ge_zero ; ZF сформирован командой SUB. add edx, IM seed_ge_zero: mov eax, edx ; EAX <- EDX mov seed, eax ; seed <- EAX xor dword ptr seed, RANDOM_MASK xor edx, edx ; EDX <- 0 mov ebx, INT_RANDOM ; EBX <- интервал значений. idiv ebx ; EDX <- число в интервале. mov eax, edx ; EAX <- EDX add eax, MIN_RANDOM ; EAX <- случайное число. ret random endp ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ random_array proc arr_len: dword, arr_ref: dword mov ecx, arr_len ; ECX <- размер массива. mov ebx, arr_ref ; EBX <- адрес начала массива. xor edi, edi ; EDI <- 0 (индекс массива). ; Пропустить цикл, если ECX = 0. .if ecx != 0 .repeat ; Сохранить случайное число ; в элементе массива. mov dword ptr [ebx + 4*edi], rv(random) ; Увеличить индекс. inc edi .untilcxz .endif ret random_array endp ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ print_array proc arr_name: dword, arr_len: dword, arr_ref: dword ; Инициализировать счетчик. xor esi, esi ; ESI <- 0 .while esi < arr_len push esi ; Сохранить ESI в стеке. ; Вывести имя массива. print arr_name print "[",0 ; Вывести индекс элемента. pop esi ; Восстановить ESI из стека. mov eax, esi ; EAX <- ESI push esi ; Сохранить ESI в стеке. print sstr$(eax),0 print "] = ",0 ; Получить элемент массива. pop esi ; Восстановить ESI из стека. mov ebx, arr_ref ; EBX <- Начало массива. mov eax, dword ptr [ebx + 4*esi] push esi ; Сохранить ESI в стек. ; Вывести элемент массива. print sstr$(eax),10,13,0 pop esi ; Восстановить ESI из стека. ; Перейти к следующему элементу массива. inc esi .endw ret print_array endp ;—————————————- ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ otric proc arr_len: dword, arr_ref :dword cls mov peremennaya, 0 mov ecx, array_length mov esi, -1 ; ESI <- -1 jecxz skip_loop ; Защита от нуля в ECX. main_loop: inc esi cmp dword ptr array[4*esi], 0 jl bolshe_nulya inc peremennaya cmp esi, ecx je main_loop jmp zero_found bolshe_nulya: cmp esi, ecx je main_loop jmp zero_found skip_loop: ret zero_found: print "kolichestvo otricatelnyh elementov = ",0 print sstr$(peremennaya),10,13,0 ret otric endp ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ ;—————————————– summa proc arr_len: dword, arr_ref :dword cls mov ecx, array_length mov esi, -1 ; ESI <- -1 jecxz skip_loop ; Защита от нуля в ECX. main_loop: inc esi cmp dword ptr array[4*esi], 0 jl bolshe_nulya jmp menshe bolshe_nulya: cmp esi, ecx je main_loop jmp zero_found menshe: mov eax, dword ptr array[4*esi] inc esi sub eax, dword ptr array[4*esi] cmp esi, ecx je menshe jmp zero_found skip_loop: ret zero_found: print "summa = ",0 print sstr$(eax),10,13,0 ret summa endp ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ zamena proc arr_len: dword, arr_ref: dword ; Задать адрес начала массива. mov ebx, arr_ref ; Инициализировать счетчик. xor esi, esi ; ESI <- 0 .while esi < arr_len ; Инициализировать счетчик. ; Получить значения элементов. mov eax, dword ptr [ebx + 4*esi] ; Выполнить сравнение. .if eax < sdword ptr [ebx + 4*edi] mul eax mov dword ptr [ebx + 4*esi], eax .endif ; Увеличить значение счетчика. inc esi .endw ret zamena endp ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ bubble_sort proc arr_len: dword, arr_ref: dword ; Задать адрес начала массива. mov ebx, arr_ref xor esi, esi ; ESI <- 0 .while esi < arr_len mov edi, esi ; EDI <- ESI inc edi ; EDI <- ESI + 1 .while edi < arr_len ; Получить значения элементов. mov eax, dword ptr [ebx + 4*esi] ; Выполнить сравнение. .if eax > sdword ptr [ebx + 4*edi] ; Обменять значения. xchg eax, dword ptr [ebx + 4*edi] mov dword ptr [ebx + 4*esi], eax .endif ; Увеличить значение счетчика. inc edi .endw ; Увеличить значение счетчика. inc esi .endw ret bubble_sort endp end start
|
|
|
RE: Задача на Masm32 - 2010-09-25 02:11:35.883333
|
|
|
Ramzec
Сообщений: 11
Оценки: 0
Присоединился: 2010-07-17 14:32:25.600000
|
хм…
|
|
|
|
|