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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.01.2010, 11:41   #1
sirex
Пользователь
 
Регистрация: 27.01.2010
Сообщений: 11
По умолчанию Работа с массивом (assembler)

Дан массив из 6 элементов. Подсчитать сколько раз в нем встречается минимальное по величине число. пожалуйста помогите.
sirex вне форума Ответить с цитированием
Старый 27.01.2010, 11:48   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

алгоритм простейший - двухпроходный.
первый раз ищем минимальное число. запоминаем (хоть в переменную/память, хоть в регистре.
второй проход - считаем совпадаения чисел с найденным минимальным значением.

p.s. писать всё с нуля - лень да и времени нет.
поищите тут же, на форуме примеры, подправьте под себя.

или за деньги (очень небольшие) Вам легко помогут.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.01.2010, 12:40   #3
sirex
Пользователь
 
Регистрация: 27.01.2010
Сообщений: 11
По умолчанию

обыскал все, похожих не нашел
sirex вне форума Ответить с цитированием
Старый 27.01.2010, 13:12   #4
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

Вот так

Код:
;поиск min в массиве по базе со смещением
.model tiny
.code
org 100h
main:
	mov di,1
	xor ax,ax
	xor si,si
	mov bx,offset arr
	mov ax,word ptr [bx] ;занесли первый элеменент, на регистр, ax=min
	mov cx,5 ;так как первый элемент уже обработан количество повторений=n-1
cyc:
	add si,2 ;переходим на следующий эелемент
	cmp word ptr [bx+si],ax ;сравниваем текущее значение с min, word ptr используется так как нам нужен не 1 байт а 2
	jnl no ;если элемент >= min переходим на no
	mov ax,[bx+si]
no:
	loop cyc
	
	mov si,-2
	mov bx,offset arr
	mov cx,6 
cyc2:
	add si,2 ;переходим на следующий эелемент
	cmp word ptr [bx+si],ax ;сравниваем текущее значение с min, word ptr используется так как нам нужен не 1 байт а 2
	je yes ;если элемент >= min переходим на no
	
	loop cyc2
	jmp oi1
yes:
	inc di
	loop cyc2
	
	mov ax,di
;вывод результата
oi1:  
      xor     cx, cx
      mov     bx, 10

oi2:   
      cwd
      div     bx	;Делим число на десять. В остатке получается последняя цифра. Сразу выводить её нельзя, поэтому сохраним её в стэке.
      push    dx
      inc     cx

; А с частным повторяем то же самое, отделяя от него очередную
; цифру справа, пока не останется ноль, что значит, что дальше
; слева только нули.
	test    ax, ax
      jnz     oi2

; Теперь приступим к выводу.
	mov     ah, 02h
oi3:   
	pop     dx
	; Извлекаем очередную цифру, переводим её в символ и выводим.
      add     dl, 30h
      int     21h
; Повторим ровно столько раз, сколько цифр насчитали.
      loop    oi3
        
	int 20h
	ret

	arr dw 1,2,3,4,5,6
end main
Единственное, что ограничивает полет мысли программиста-компилятор

Последний раз редактировалось Sparky; 27.01.2010 в 13:23.
Sparky вне форума Ответить с цитированием
Старый 27.01.2010, 13:27   #5
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Можно и за 1 цикл...
Код:
  mov si,offset arr
  mov bx,[si]
  mov ax,1
  mov cx,5
  inc si
  inc si
cyc:
  cmp bx,[si]
  jbe no
  
  mov bx,[si]
  xor ax,ax

no:
  jne no2
  inc ax
no2:
  inc si
  inc si
  loop cyc
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 28.01.2010, 12:24   #6
sirex
Пользователь
 
Регистрация: 27.01.2010
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Sparky Посмотреть сообщение
Вот так

Код:
;поиск min в массиве по базе со смещением
.model tiny
.code
org 100h
main:
	mov di,1
	xor ax,ax
	xor si,si
	mov bx,offset arr
	mov ax,word ptr [bx] ;занесли первый элеменент, на регистр, ax=min
	mov cx,5 ;так как первый элемент уже обработан количество повторений=n-1
cyc:
	add si,2 ;переходим на следующий эелемент
	cmp word ptr [bx+si],ax ;сравниваем текущее значение с min, word ptr используется так как нам нужен не 1 байт а 2
	jnl no ;если элемент >= min переходим на no
	mov ax,[bx+si]
no:
	loop cyc
	
	mov si,-2
	mov bx,offset arr
	mov cx,6 
cyc2:
	add si,2 ;переходим на следующий эелемент
	cmp word ptr [bx+si],ax ;сравниваем текущее значение с min, word ptr используется так как нам нужен не 1 байт а 2
	je yes ;если элемент >= min переходим на no
	
	loop cyc2
	jmp oi1
yes:
	inc di
	loop cyc2
	
	mov ax,di
;вывод результата
oi1:  
      xor     cx, cx
      mov     bx, 10

oi2:   
      cwd
      div     bx	;Делим число на десять. В остатке получается последняя цифра. Сразу выводить её нельзя, поэтому сохраним её в стэке.
      push    dx
      inc     cx

; А с частным повторяем то же самое, отделяя от него очередную
; цифру справа, пока не останется ноль, что значит, что дальше
; слева только нули.
	test    ax, ax
      jnz     oi2

; Теперь приступим к выводу.
	mov     ah, 02h
oi3:   
	pop     dx
	; Извлекаем очередную цифру, переводим её в символ и выводим.
      add     dl, 30h
      int     21h
; Повторим ровно столько раз, сколько цифр насчитали.
      loop    oi3
        
	int 20h
	ret

	arr dw 1,2,3,4,5,6
end main
спасибо. но при компиляции выдает warning:no stack, пытался вставлять в конец программы не получается
sirex вне форума Ответить с цитированием
Старый 28.01.2010, 12:33   #7
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

sirex
warning не ошибка а предупреждение, если программа работает так как ожидалось, то можно не дергаться
по тексту: выход из COM-программы происходит или по команде RET или по команде INT 20h -- друг под другом их писать как в листинге Sparky ни к чему
Mikl___ вне форума Ответить с цитированием
Старый 28.01.2010, 12:57   #8
sirex
Пользователь
 
Регистрация: 27.01.2010
Сообщений: 11
Сообщение

а так одно без другого не работает, даже если переместить ret или удалить вовсе
sirex вне форума Ответить с цитированием
Старый 28.01.2010, 13:00   #9
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

sirex
С чего бы это? А как ты узнал что, не работает -- компьютер завис?
Mikl___ вне форума Ответить с цитированием
Старый 28.01.2010, 13:02   #10
sirex
Пользователь
 
Регистрация: 27.01.2010
Сообщений: 11
По умолчанию

asm зависает и выводит 2строчки errora и вылет
sirex вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с массивом program123 Помощь студентам 2 24.12.2009 17:20
работа с массивом s2dentishe Помощь студентам 2 12.12.2009 22:35
Работа с массивом GaSST Microsoft Office Excel 5 04.06.2009 07:57
Работа с массивом (Assembler) Siva Помощь студентам 2 27.03.2008 01:55