Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Задача на Masm32

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Прочее] >> Задача на Masm32
Имя
Сообщение << Старые топики   Новые топики >>
Задача на 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 &lt; arr_len
mov eax, dword ptr [ebx + 4*esi]
.if eax &lt; 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 и так им является?…хз), ну и добавить ещё один цикл упорядочивающий элементы по возрастанию (взять наверн их часть кода).
помогите плз кто чем может…
Post #: 1
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 и так им является?…хз), ну и добавить ещё один цикл упорядочивающий элементы по возрастанию (взять наверн их часть кода).
помогите плз кто чем может…

Нельзя возводить в квадрат сортируя. Надо сначала возвести все элементы в квадрат, а потом сортировать. Иначе чёрт его знает что получится. Но ты пытаешься провернуть именно это. Вообще не трогай существующие процедуры из методички. Они работают? Вот и оставь их в покое, используй их такими какие они есть.

А вообще, сначала стоит найти количество отрицательных элементов и сумму модулей, иначе как ты их будешь искать после того, как возведёшь все элементы в квадрат?
Post #: 2
RE: Задача на Masm32 - 2010-06-18 21:38:13.810000   
Basher2008

Сообщений: 148
Оценки: 0
Присоединился: 2008-01-27 17:28:11.896666
quote:

Надо сначала возвести все элементы в квадрат, а потом сортировать
…так мне не надо возводить все элементы…а только орицательные.
quote:

Вообще не трогай существующие процедуры из методички. Они работают?
да, они работают.

quote:

А вообще, сначала стоит найти количество отрицательных элементов и сумму модулей, иначе как ты их будешь искать после того, как возведёшь все элементы в квадрат?
да, это верно… "найти сумму модулей элементов массива, расположенных после мини-
мального по модулю элемента." …это я вообще не представляю как сделать(
Post #: 3
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:

А вообще, сначала стоит найти количество отрицательных элементов и сумму модулей, иначе как ты их будешь искать после того, как возведёшь все элементы в квадрат?
да, это верно… "найти сумму модулей элементов массива, расположенных после мини-
мального по модулю элемента." …это я вообще не представляю как сделать(

Разбивай задачу на более мелкие. Сначала найди номер (индекс) минимального элемента. Классическая задачка программирования: найти минимальный элемент. Когда будешь знать номер, тебе останется просуммировать модули элементов начиная с этого номера и до конца массива.
Post #: 4
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 ; вывод количества элементов &lt; 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 &lt; arr_len
mov eax, dword ptr [ebx + 4*esi]
.if eax &lt; 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 &gt; 0
inc peremennaya ; переменная +1
mov dword ptr [ebx + 4*esi], eax
.endif
Post #: 5
RE: Задача на Masm32 - 2010-06-18 23:50:35.746666   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
А почему ты делаешь это внутре баблсорта? Я ж говорю: не трогай рабочие процедуры.
Кроме того, этот .if у тебя оказывается вложенным в два цикла. Зачем?
Post #: 6
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 &lt;- 0
.while esi &lt; arr_len
mov eax, dword ptr [ebx + 4*esi]
.if eax &gt; 0
inc peremennaya
.endif
; Увеличить значение счетчика.
inc esi
.endw
ret
min_elem endp




end start
Post #: 7
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 максимум…непоняятно
Post #: 8
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


Post #: 9
RE: Задача на Masm32 - 2010-09-25 02:11:35.883333   
Ramzec

Сообщений: 11
Оценки: 0
Присоединился: 2010-07-17 14:32:25.600000
хм…

Post #: 10
Страниц:  [1]
Все форумы >> [Прочее] >> Задача на Masm32







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.