Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.02.2016, 11:56   #1
tane
Пользователь
 
Регистрация: 14.12.2013
Сообщений: 64
Восклицание Подсчитать количество максимальных элементов в массиве.

Здравствуйте, товарищи!
Помогите пожалуйста реализовать данное задание.
Программа находит максимальный элемент. Нужно дописать код на ассемблере, чтобы выводило максимальный элемент и количество повторов(например так, Max - 24 Count - 3 ).

Код:
 
 #include <iostream>
using namespace std;
 
 
int main()
{
    int max;
    int a[10] = { 6, 3, 24, -2, -14, -8, 24, 8, -2, 24 };
    _asm
    {
        ; max element

            lea esi, a //запись адреса массива в регистра ESI
            mov ebx, dword ptr[esi]  //читаем значение по адресу указываемому регистром ESI, в регистр EBX
            mov ecx, 10 //запись значение 10 (количество элементов массива) в регистр ECX
        M1:
        lodsd  //читаем значение по указываемому регистром ESI, в регистр EAX, и увеличиваем ESI на 4
            cmp eax, ebx  //сравниваем содержимое двух регистров
            jle M2  //условный переход: переходить если первый регистр (EAX) <= второму регистру (EBX)
            mov ebx, eax //сохраняем большее значение из регистра EAX в регистре EBX
        M2 :
        loop M1 //цикл: уменьшение ECX на 1, переход на метку M1 если ECX не равен нулю
            mov max, ebx //сохраняем найденный максимум в переменной max

 

    }
    cout << "Max : " << max << endl;
    
	
	system("pause");
	return 0;
}
tane вне форума Ответить с цитированием
Старый 04.02.2016, 17:09   #2
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Ассемблерный код (FASM) будет выглядеть примерно так (числа - двузначные)..
Вставку попробуй организовать сам:

Код:
ORG 100h
JMP start

mess   DB  13,10,'ARRAY..:  $'
maxi   DB  13,10,'MAX....:  $'
coun   DB  13,10,'COUNT..:  $'

array  DB  055,090,-44,021,090,-15,076,081
       DB  090,-30,090,052,068,003,-08,090
aSize  =   $ - array      ; длина массива

start:
   MOV   AH,9             ; мессага
   MOV   DX,mess          ;
   INT   21h              ;

;================ ВЫВОДИМ МАССИВ НА ЭКРАН ========================//
   MOV   SI,array         ; адрес,
   MOV   CX,aSize         ;   и длина массива
   PUSH  CX  SI           ; запомним их..
@print:                   ;
   LODSB                  ; берём байт в AL
   TEST  AL,AL            ;
   JNS   positive         ; проверка на знак!
   NEG   AL               ; перевод значения из минус, в плюс
   PUSH  AX               ;
   MOV   AL,'-'           ; выводим знак..
   INT   29h              ;
   POP   AX               ;
positive:                 ;
   AAM                    ; десятичная коррекция для BCD
   OR    AX,3030h         ; переводим число в символы
   XCHG  AH,AL            ;
   INT   29h              ;
   SHR   AX,8             ;
   INT   29h              ; вывоим число на экран
   MOV   AL,','           ; разделитель..
   INT   29h              ;
   LOOP  @print           ; и так - со всеми числами массива

;================ ПОИСК НАИБОЛЬШЕГО ЗНАЧЕНИЯ ======================//
   MOV   AH,9             ;
   MOV   DX,maxi          ;
   INT   21h              ;
                          ;
   POP   SI  CX           ; адрес с длинной
   XOR   AX,AX            ; в AH будет макс.элемент
@max:                     ;
   LODSB                  ;
   OR    AL,AL            ;
   JNS   ok               ; проверка на знак!
   NEG   AL               ;
ok:                       ;
   CMP   AH,AL            ;
   JGE   next             ;
   MOV   AH,AL            ;
next:                     ;
   LOOP  @max             ; AH = макс.элемент массива

;================ ВЫВОДИМ ЕГО НА ЭКРАН ============================//
   SHR   AX,8             ; AX = макс.элемент массива
   PUSH  AX               ; сохраняем его для поиска дублей
   AAM                    ;
   ADD   AX,3030h         ;
   XCHG  AH,AL            ;
   INT   29h              ;
   SHR   AX,8             ;
   INT   29h              ;

;================ ИЩЕМ КОЛ-ВО ПОВТОРОВ МАКС.ЭЛЕМЕНТА ==============//
   MOV   AH,9             ;
   MOV   DX,coun          ;
   INT   21h              ;
                          ;
   POP   AX               ; AL = искомое значение
   XOR   BX,BX            ; счётчик найденых совпадений
   MOV   DI,array         ; адрес с длиной массива
   MOV   CX,aSize+1       ;
@find:                    ;
   REPNE SCASB            ; ищем значение в массиве
   INC   BX               ; элемент нашёлся! счётчик +1
   OR    CX,CX            ; это конец массива?
   JNZ   @find            ; нет - продолжаем поиск..

   MOV   AL,BL            ; выводим счётчик на экран ===========//
   DEC   AL               ;
   ADD   AL,30h           ;
   INT   29h              ;

exit:
   XOR   AX,AX
   INT   16h
   INT   20h
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 04.02.2016, 18:19   #3
tane
Пользователь
 
Регистрация: 14.12.2013
Сообщений: 64
По умолчанию

Цитата:
Сообщение от R71MT Посмотреть сообщение
Ассемблерный код (FASM) будет выглядеть примерно так (числа - двузначные)..
Вставку попробуй организовать сам:

Код:
ORG 100h
JMP start

mess   DB  13,10,'ARRAY..:  $'
maxi   DB  13,10,'MAX....:  $'
coun   DB  13,10,'COUNT..:  $'

array  DB  055,090,-44,021,090,-15,076,081
       DB  090,-30,090,052,068,003,-08,090
aSize  =   $ - array      ; длина массива

start:
   MOV   AH,9             ; мессага
   MOV   DX,mess          ;
   INT   21h              ;

;================ ВЫВОДИМ МАССИВ НА ЭКРАН ========================//
   MOV   SI,array         ; адрес,
   MOV   CX,aSize         ;   и длина массива
   PUSH  CX  SI           ; запомним их..
@print:                   ;
   LODSB                  ; берём байт в AL
   TEST  AL,AL            ;
   JNS   positive         ; проверка на знак!
   NEG   AL               ; перевод значения из минус, в плюс
   PUSH  AX               ;
   MOV   AL,'-'           ; выводим знак..
   INT   29h              ;
   POP   AX               ;
positive:                 ;
   AAM                    ; десятичная коррекция для BCD
   OR    AX,3030h         ; переводим число в символы
   XCHG  AH,AL            ;
   INT   29h              ;
   SHR   AX,8             ;
   INT   29h              ; вывоим число на экран
   MOV   AL,','           ; разделитель..
   INT   29h              ;
   LOOP  @print           ; и так - со всеми числами массива

;================ ПОИСК НАИБОЛЬШЕГО ЗНАЧЕНИЯ ======================//
   MOV   AH,9             ;
   MOV   DX,maxi          ;
   INT   21h              ;
                          ;
   POP   SI  CX           ; адрес с длинной
   XOR   AX,AX            ; в AH будет макс.элемент
@max:                     ;
   LODSB                  ;
   OR    AL,AL            ;
   JNS   ok               ; проверка на знак!
   NEG   AL               ;
ok:                       ;
   CMP   AH,AL            ;
   JGE   next             ;
   MOV   AH,AL            ;
next:                     ;
   LOOP  @max             ; AH = макс.элемент массива

;================ ВЫВОДИМ ЕГО НА ЭКРАН ============================//
   SHR   AX,8             ; AX = макс.элемент массива
   PUSH  AX               ; сохраняем его для поиска дублей
   AAM                    ;
   ADD   AX,3030h         ;
   XCHG  AH,AL            ;
   INT   29h              ;
   SHR   AX,8             ;
   INT   29h              ;

;================ ИЩЕМ КОЛ-ВО ПОВТОРОВ МАКС.ЭЛЕМЕНТА ==============//
   MOV   AH,9             ;
   MOV   DX,coun          ;
   INT   21h              ;
                          ;
   POP   AX               ; AL = искомое значение
   XOR   BX,BX            ; счётчик найденых совпадений
   MOV   DI,array         ; адрес с длиной массива
   MOV   CX,aSize+1       ;
@find:                    ;
   REPNE SCASB            ; ищем значение в массиве
   INC   BX               ; элемент нашёлся! счётчик +1
   OR    CX,CX            ; это конец массива?
   JNZ   @find            ; нет - продолжаем поиск..

   MOV   AL,BL            ; выводим счётчик на экран ===========//
   DEC   AL               ;
   ADD   AL,30h           ;
   INT   29h              ;

exit:
   XOR   AX,AX
   INT   16h
   INT   20h
Вот, у меня есть реализация. Но почему-то постоянно показывает Count =1, хотя макс элементов 4.
Код:
#include <iostream>
using namespace std;
 
 
int main()
{
    int max, count;
    int a[10] = { 24, 3, 24, -2, -14, -8, 24, 8, -2, 24 };
    _asm
    {
        ; max element

            lea esi, a  
            mov ebx, dword ptr[esi]   
            mov ecx, 10  
        M1:
        lodsd   
            cmp eax, ebx   
            jle M2  
            mov ebx, eax  
        M2 :
        loop M1 
            mov max, ebx  
			
			lea esi,a
			mov ebx,max
			mov ecx,10
		M3:
			lodsd
			cmp eax,ebx
			jle M4
			inc edx
		M4:
			loop M3
			mov count,edx  

    }
    cout << "Max : " << max << endl;
	cout << "Count : " << count << endl;
    
	
	system("pause");
	return 0;
}
tane вне форума Ответить с цитированием
Старый 04.02.2016, 21:42   #4
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
По умолчанию

Цитата:
Но почему-то постоянно показывает Count =1
Сомневаюсь

Пересмотрите ваш условный переход на метку M4.
И позаботьтесь о обнулении значения вашего счетчика в edx перед подсчетом.
Базиля вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа в tasm. подсчитать количество нечетных символов в массиве из 10 элементов Langel2214 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 18.12.2015 16:04
В массиве из n элементов подсчитать количество четырёд идущих подряд одинаковых элементов ( Delphi7 ) Анастасья Помощь студентам 1 31.03.2011 19:23
поиск максимальных элементов в массиве radiokarazinec Общие вопросы Delphi 1 26.12.2010 12:53
В массиве A, состоящем из 10 элементов, подсчитать количество положительных элементов Alex61 Помощь студентам 5 16.05.2009 23:06