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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.07.2009, 08:38   #1
dron-k
 
Регистрация: 22.06.2009
Сообщений: 6
Вопрос Массив на ассемблере

Не сочтите за сложность помочь с такой задачей.

Найти минимальное из чисел, встречающихся в целочисленном
массиве X=(x1,x2,...,xn) ровно два раза.

Исходный код предоставлю ниже.

Код:
Sseg segment para stack 'Stack'
db 64 dup(0)
Sseg ends
Dseg segment
n dw 11
x db 8,9,1,4,2,16,1,21,34,13,2
x1 db ?
nx1 dw ?
k10 dw 10
mes1 db 13,10,'Љ®«ЁзҐбвў® Ґ«Ґ¬Ґ*в®ў Њ*ббЁў*  - $',13,10
mes2 db 13,10,'ќ«Ґ¬Ґ*вл Њ*ббЁў* X: $',13,10
mes3 db 13,10,'‚ ¬*ббЁўҐ *Ґв 2-е ¬Ё*Ё¬*«м*ле н««Ґ¬Ґ*в®ў! $',13,10 
mes4 db 13,10,'Њ*ббЁў *Ґ ўўҐ¤с*, Ё«Ё ўўҐ¤с* *ҐЇа*ўЁ«м*®!$',13,10
mes7 db 13,10,' $',13,10 
mes8 db 13,10,'2 ¬Ё*Ё¬*«м*ле н««Ґ¬Ґ*в* - $',13,10   
mes9 db 13,10,'н«Ґ¬Ґ*вл *Ґ **©¤Ґ*л$',13,10   

Dseg ends
Cseg segment
assume cs:cseg, ss:sseg, ds:dseg;
Start:
; Ё*ЁжЁ*«Ё§Ёа㥬бп
	push	ds
	sub	ax, ax
	push	ax
	mov	bx, dseg
	mov	ds, bx
; ўў®¤ ¬*ббЁў*
;	call	InputArr
;	test	ax, ax
;	jz	the_end

; ўлў®¤ ¬*ббЁў*
	call	OutputArr

;------------------------------------------------------------------------------
	mov dh, 0
	mov dl ,255
	xor	ax, ax

	mov si, -1 
mc:
	inc si 
	mov al, x[si]
	mov di, si
m1:
	cmp al, x[di]
	jne m2
	inc ah
m2:
	cmp ah, 2
	jne m3
	cmp al, dl
	jge m3
	mov dl, al
	mov dh, 1
m3:
	inc di
	mov ah, 0
	cmp si, n
	jl mc
	jge me
me: 
; ®вўҐв ў dl, Ґб«Ё *Ґв в*ЄЁе н«Ґ¬Ґ*в®ў в® ў dh 0, Ё**зҐ 1
;-------------------------------------------------

	cmp	dh, 0
	jz	not_found
	mov	dx, offset mes8
	call	WriteStr
	xor	ax, ax
	mov	al, dl
	call	WriteInt
	jmp	found
not_found:
	mov	dx, offset mes9
	call	WriteStr
found:

; §*ўҐаиЁвм Їа®Ја*¬¬г
the_end:
	call	ReadChar	; we are waiting for...
	xor	ax, ax
	mov	ah, 4Ch
	int	21h
	ret

;------------------------------------------------------------------------------
; ўў®¤ ®¤*®Ј® бЁ¬ў®«*
ReadChar proc
	mov	ah, 1
	int	21h
	xor	ah, ah
	ret
ReadChar endp

;----------------------
; ўлў®¤ ¬*ббЁў*
OutputArr proc
	push	ax
	push	si

	mov	dx, offset mes2
	call	WriteStr

	xor	ax, ax
	mov	si, ax
out_loop:
	mov	al, x[si]
	call	WriteInt
	mov	al, ' '		; ўлў®¤Ё¬ Їа®ЎҐ« ¬Ґ¦¤г зЁб«*¬Ё
	call	WriteChar
	inc	si
	cmp	si, n
	jl	out_loop
	jmp	norm_out
norm_out:
	pop	si
	pop	ax
	ret
OutputArr endp

;--------------------------------------------------------
; ўлў®¤ 10-®Ј® зЁб«*
; AX = зЁб«®
WriteInt proc
	push	ax
	push	cx
	push	bx
	push	dx
	xor	cx, cx
	mov	bx, 10

; зЁб«® ®ваЁж*⥫м*®Ґ?  
	cmp	al, 0
	jge	count_digits	; *Ґв

; ўлўҐбвЁ ¬Ё*гб Ё Ї®¬Ґ*пвм §**Є
	push	ax
	mov	dl, '-'
	mov	ah, 2
	int	21h
	pop	ax
	neg	al

; Ї®«гзЁвм 10-*лҐ жЁдал Ё Ї®¬ҐбвЁвм Ёе ў б⥪,
; ў cx - Є®«ЁзҐбвў® Ї®«гзҐ**ле жЁда
count_digits:
	xor	dx, dx
	idiv	bx
	push	dx
	inc	cx
	cmp	al, 0
	jg	count_digits

; ¤®бв*вм Ё§ б⥪*, ЇҐаҐўҐбвЁ ў Є®¤ ASCII Ё ўлўҐбвЁ
print_loop:
	pop	ax
	add	al, '0'

	call	WriteChar
	loop	print_loop

	pop	dx
	pop	bx
	pop	cx
	pop	ax
	ret
WriteInt endp

;--------------------------------------------------------
; ўлў®¤ ®¤*®Ј® бЁ¬ў®«*
; AX = char
WriteChar proc
	push	ax
	push	dx
	mov	dl, al
	mov	ah, 2
	int	21h
	pop	dx
	pop	ax
	ret
WriteChar endp

;------------------------------------------------------------------------------
; ўлў®¤ бва®ЄЁ
; DX = offset of string
WriteStr proc
	mov	ah, 09h
	int	21h
	ret
WriteStr endp

;------------------------------------------------------------------------------
; ўлў®¤ ЇҐаҐ*®б* бва®ЄЁ
WriteCRLF proc
	mov	al, 13
	call	WriteChar
	mov	al, 10
	call	WriteChar
	ret
WriteCRLF endp
;---------------------------------------------------
cseg ends
end Start
Дело в том что она не выводит минимальное число. Помогите, пожалуйста, разобраться.

Это и в правду очень важно.

Последний раз редактировалось Stilet; 28.07.2009 в 08:47.
dron-k вне форума Ответить с цитированием
Старый 28.07.2009, 08:57   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Если проблема с поиском минимума то могу предложить такой вариант:
Код:
.data
;_______________
 arr dw 1,2,3,4,2,34,21,4,5
 min dw 0
;_______________
.code
start:
 mov ecx,9
 mov esi, offset arr
 xor ebx,ebx
 mov bx, word ptr [esi]
aga:
 mov ax,word ptr [esi]
 cmp ax,bx
 jge ku
 xchg ax,bx
ku:
 add esi,2
 loop aga
 mov [min],bx
ret
end start
В min запишется минимальный элемент.
I'm learning to live...

Последний раз редактировалось Stilet; 28.07.2009 в 09:03.
Stilet вне форума Ответить с цитированием
Старый 28.07.2009, 09:11   #3
dron-k
 
Регистрация: 22.06.2009
Сообщений: 6
По умолчанию

А что такое ecx, esi, ebx?

Подскажите, пожалуйста
dron-k вне форума Ответить с цитированием
Старый 28.07.2009, 09:31   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
dron-k
Вообще то это расширение регистров... Что методички уже не в моде?
Можеш заменить их на cx,si,bx если ты на Турбо Ассемблере пишешь.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.07.2009, 09:33   #5
dron-k
 
Регистрация: 22.06.2009
Сообщений: 6
По умолчанию

нет, я на Tasm пишу, Turbo Debugger.
И он написал неизвестный символ.
dron-k вне форума Ответить с цитированием
Старый 28.07.2009, 09:36   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
dron-k
А тебе идею подал, а как ты напишешь ее это уж тебе решать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Упорядочить массив в порядке возрастания и напечатать входной и исходный массив. TheVenny Помощь студентам 3 26.11.2008 15:06