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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.04.2008, 18:53   #1
Almost_Famous
Пользователь
 
Регистрация: 28.02.2008
Сообщений: 13
По умолчанию Проблеммы с массивом

Есть задание:Найти максимальный элемент массива и записать его в Rg BH (формат элементов массива - байт).
Есть алгоритм:
Код:
.MODEL SMALL

;----------Сегмент стека------------
STACKSG SEGMENT PARA STACK 'stack'
        DB      256  DUP(?)  
STACKSG ENDS
;-----------------------------------

;----------Сегмент данных-----------
DATASG  SEGMENT PARA  'data'
KOL     DW    10
MASA    Dw    10,12,33,4,15,6,9,1000,30,8     
MAX     Dw    ?
DATASG ENDS
;----------------------------------

;----------Сегмент кода------------
CODESG  SEGMENT PARA 'Code'
        ASSUME  CS:CODESG, DS:DATASG, SS:STACKSG 
MAIN    PROC   FAR

	PUSH    DS          ; Подготовка к
	SUB     AX,AX	    ; возврату в
	PUSH    AX	    ; ОС

	MOV	AX, DATASG  ; Настраиваем DS на
	MOV	DS,AX	    ; сегмент данных

	MOV     Ax,MASA	; 
	MOV     MAX,Ax	; Помещаем в min первый элемент массива MasA

	MOV     CX,KOL	; Количество эл. массива в CX для цикла LOOP
	LEA     SI,MASA	; Загрущаем адрес MASA в регистр SI
	
For:    MOV     BX,[SI]	; Помещаем в BH элемент массива
	CMP	BX,MAX	; Сравниваем текущий эл. с максимальным Max
	JS      End_if	; Если BX < MAX то переходим к метке End_if
	MOV     MAX,BX	; Иначе MIN=BX
End_if: add     SI,2	; Переходим к след. элементу массива
	LOOP    For	; CX-=1, если CX!=0, то переходим к метке For
	
        
RET             ; Завершение работы
MAIN    ENDP
CODESG  ENDS
        END    MAIN
Скажите пожалуйста, все ли правильно и как сохранить элемент в BH, если сейчас запись в BX?Заранее спасибо!)
Almost_Famous вне форума Ответить с цитированием
Старый 21.04.2008, 20:37   #2
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

В принципе все правильно.

Одно но. В задании сказано - формат элементов массива - байт.
Нужно просто исправить

MASA DB
MAX DB

и соответственно подправить все регистры ниже в коде и тогда в конце можно смело делать

mov bh, max
alexBlack вне форума Ответить с цитированием
Старый 21.04.2008, 21:01   #3
Almost_Famous
Пользователь
 
Регистрация: 28.02.2008
Сообщений: 13
По умолчанию

спасибо,исправил, только теперь почему то, число перемещенное в BX вовсе не максимальное, подскажите пожалуйста, что нужно исправить
Код:
;----------Сегмент стека------------
STACKSG SEGMENT PARA STACK 'stack'
        DB      256  DUP(?)  
STACKSG ENDS
;-----------------------------------

;----------Сегмент данных-----------
DATASG  SEGMENT PARA  'data'
KOL     DW    10
MASA    Db    10,12,33,4,15,6,9,85,30,8     
MAX     Db    ?
DATASG ENDS
;----------------------------------

;----------Сегмент кода------------
CODESG  SEGMENT PARA 'Code'
        ASSUME  CS:CODESG, DS:DATASG, SS:STACKSG 
MAIN    PROC   FAR

	PUSH    DS          ; Подготовка к
	SUB     AX,AX	    ; возврату в
	PUSH    AX	    ; ОС

	MOV	AX, DATASG  ; Настраиваем DS на
	MOV	DS,AX	    ; сегмент данных

	MOV     Ah,MASA	; 
	MOV     MAX,Ah	; Помещаем в min первый элемент массива MasA

	MOV     CX,KOL	; Количество эл. массива в CX для цикла LOOP
	LEA     SI,MASA	; Загрущаем адрес MASA в регистр SI
	
For:    MOV     Bh,[SI]	; Помещаем в BH элемент массива
	CMP	Bh,MAX	; Сравниваем текущий эл. с максимальным Max
	JS      End_if	; Если BX < MAX то переходим к метке End_if
	MOV     MAX,Bh	; Иначе MIN=BX
End_if: add     SI,2	; Переходим к след. элементу массива
	LOOP    For    	; CX-=1, если CX!=0, то переходим к метке For
	
        mov bh,max       ;Перемещаем max в регистр bh 

RET             ; Завершение работы
MAIN    ENDP
CODESG  ENDS
        END    MAIN
Almost_Famous вне форума Ответить с цитированием
Старый 21.04.2008, 21:07   #4
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Вы забыли изменить (add si,2) на (add si, 1)
(или на inc si)
alexBlack вне форума Ответить с цитированием
Старый 21.04.2008, 21:25   #5
Almost_Famous
Пользователь
 
Регистрация: 28.02.2008
Сообщений: 13
По умолчанию

Все понял, спсибо большое!
Almost_Famous вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проблема с массивом kommunist Помощь студентам 6 14.11.2007 18:36
Проблеммы функции MessageDlg Snake_ua Общие вопросы Delphi 4 01.11.2007 08:08
Проблеммы с использованием функций работы со строками Copy и Pos Soso Общие вопросы Delphi 13 09.08.2007 16:01
Помогите с массивом mishel Общие вопросы Delphi 1 04.03.2007 00:15