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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.01.2011, 16:11   #1
Настя22
 
Регистрация: 21.01.2011
Сообщений: 6
По умолчанию Деление числа в ассемблере

Нужно описать процедуру поиска отрицательного числа в массиве и его деления на два.
Подскажите что не так в коде
Код:
num proc far	
mov di,0
mov bx,0
m1: 
mov ax,bx[di]
jg next                  
cwd     
next: add di,2  
loop m1
mov ax,di
mov dx,0
mov bx,2
div bx
ret
num endp
pech proc near
print_number
ret
pech endp

Последний раз редактировалось Stilet; 22.01.2011 в 15:13.
Настя22 вне форума Ответить с цитированием
Старый 21.01.2011, 18:52   #2
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Если отрицательное число в массиве одно, я бы так написал:

Код:
lea si,mass ; адрес начала массива в si

met:
lodsw ; загрузим в ах элемент массива
cmp ax,0 ; неотрицательный - возврат на метку, загрузка следующего элемента
jns met
vadimych вне форума Ответить с цитированием
Старый 22.01.2011, 15:10   #3
wanes101
Форумчанин
 
Регистрация: 04.06.2010
Сообщений: 212
По умолчанию

Я программист любитель может, по этому, что и не понял в вашем коде.

На мой взгляд у вас синтаксические ошибки. Я да же пробовал ваш код компилировать, но, как следствие вылетела ошибка.
Во вторых при использование команды loop нужно в cx записать сколько нужно сделать циклов.
Не понятно по какому условию возникает условный переход по команде jg.

Поясню в чём синтаксическая ошибка:

Цитата:
num proc far
mov di,0
mov bx,0
m1:
mov ax,bx[di]
ошибка в последней КОП. Я думаю вы наверно хотели сделать "Косвенная адресация со смещением" т.е. адрес операнда 2 опр. bx+di, тогда это будет верно так mov ax,[bx][di].

Если я правильно понял, могу привести к примеру свой код.
wanes101 вне форума Ответить с цитированием
Старый 22.01.2011, 17:59   #4
Настя22
 
Регистрация: 21.01.2011
Сообщений: 6
По умолчанию

wanes101, вот полностью код программы в общем нужно в массиве найти отрицательный элемент и разделить на два, все уже перепробовала ничего не получается(((

Код:
%nolist
Include	mac.lib
%list
;ђ*§¤Ґ«Ёвм ®ваЁж*⥫м*л© н«Ґ¬Ґ*в ¬*ббЁў* ** ¤ў*
a_data	segment	para
a	dw	10 dup(0); ¬*ббЁў Ђ
b	dw	10 dup(?); ¬*ббЁў ‚
n	dw	?; Є®«ЁзҐбвў® н«Ґ¬Ґ*в®ў ў ¬*ббЁўҐ Ђ
mes1	db	10,13,'Џ*«мўЁ*бЄ*п Ђ.Ђ. ќ‚Њ§г-07 ‚*аЁ**в-8 $'
mes2	db	10,13,'‚ўҐ¤ЁвҐ Є®«ЁзҐбвў® н«Ґ¬Ґ*в®ў ў ¬*ббЁўҐ Ђ = $'
mes3 	db	10,13,'‚ўҐ¤ЁвҐ зЁб«® $'
mes4 	db	10,13,'ЋваЁж*⥫м*лҐ зЁб«* а*§¤Ґ«Ґ*л ** 2 ў ¬*ббЁўҐ Ђ: = $'
a_data ends

a_stack segment stack
db 128 dup(?)
a_stack ends
a_code segment para
assume ds:a_data, ss:a_stack, cs:a_code

about proc near	
message mes1
ret
about endp

vvod1 proc	
message mes3
key_$2bin
ret
vvod1 endp

vvod proc far	
mov	di,0
cikl:
call vvod1
	mov   [BX][DI],AX
	ADD	di,2
	loop cikl	
ret
vvod endp


num proc far	
mov di,0
mov bx,0
m1: 
mov ax,bx[di]
jg next                  
cwd     
next: add di,2  
loop m1
mov ax,di
mov dx,0
mov bx,2
div bx
ret
num endp
pech proc near
print_number
ret
pech endp

vuvod proc near
mov DI,0
cikl2:
mov ax,bx[DI]
call pech
ADD DI,2
loop cikl2
ret
vuvod endp

start:
mov ax,a_data
mov ds,ax

call about	

message mes2	
key_$2bin
mov n,ax	
mov cx,n
lea bx,a        
call vvod       

message mes4
mov ax,a
mov cx,n
lea bx,a
call vuvod                

print_number

mov ah, 4ch
int 21h
a_code ends
end start

Последний раз редактировалось Stilet; 22.01.2011 в 18:07.
Настя22 вне форума Ответить с цитированием
Старый 22.01.2011, 19:33   #5
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Предыдущий код разбирать желания не имею, тем более что в нем макросы используются, которых нет
Но по вопросу, я бы сделал так...
Код:
	mov di, offset mass ; указатель на массив
	mov ax,0
	mov cx,masslen ; длина массива
l1:
	scasw ; сравниваем число в массиве с нулем
	jg negative ; переход если отрицательное

	loop l1 ; повторяем если неотрицательное

	jmp no_negative ; переход если не найдено отрицательное число

negative:
	mov ax,[di-2]
	sar ax,1 ; делим число на 2
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4

Последний раз редактировалось Goodwin98; 22.01.2011 в 19:35.
Goodwin98 вне форума Ответить с цитированием
Старый 22.01.2011, 20:06   #6
wanes101
Форумчанин
 
Регистрация: 04.06.2010
Сообщений: 212
Лампочка

Альтруистического настроения не имею по этому не охото изучать твой код, но могу подсказать и привести свой код. Учти, что в моём коде массив начинается с нулевого смещения относительно начала сегмента data по этому если у тебя он начинается не с 0, то нужно к bx + смещение начала массива относительно начала сегмента data.

Код:
data segment

		db	1,2,3,4,-2,5,6
data ends

code segment
assume cs:code,ds : data
start:

mov ax,seg data
mov ds,ax
xor bx,bx ;обнуляем bx и в нём дальше будет находится смещение относительно начала массива отрицательного числа

;отрицательные числа имеют старший бит =1
;цикл проверяет старший бит 
   ;если он 1 то переход на minus
   ;если 0, то если cx =1, то конец выполнения программы, если cx>1, то увеличением bx на 1 т.е. ;переходим к следующему байту и повторяем заново 
mov cx,8 ;размер массива + 1
cycl:
test byte ptr ds:[bx],10000000b ;проверка старшего бита
jnz minus
inc bx	;переход к следующему байту
loop cycl
	
jmp Finish

minus:
mov al,[bx] ; по адресу bx находится отрицательный байт
cbw	;преобразуем в слово 
mov bh,2
idiv bh ;!!!! деление с учётом знака

Finish:
mov ah,4ch
int 21h
code ends
end start

Последний раз редактировалось Stilet; 22.01.2011 в 21:16.
wanes101 вне форума Ответить с цитированием
Старый 23.01.2011, 06:46   #7
Настя22
 
Регистрация: 21.01.2011
Сообщений: 6
По умолчанию

Ребята посмотрите как в моем коде все же это реализовать, за вознаграждение конечно же
Настя22 вне форума Ответить с цитированием
Старый 23.01.2011, 12:45   #8
x128
Форумчанин
 
Регистрация: 03.02.2010
Сообщений: 178
По умолчанию

Настя22, у тебя деление беззнаковое (DIV), а делить пытаешься отрицательное число, нужно (IDIV) либо используй битовый сдвиг (SAR) т.к. деление на 2.
x128 вне форума Ответить с цитированием
Старый 23.01.2011, 13:04   #9
Настя22
 
Регистрация: 21.01.2011
Сообщений: 6
По умолчанию

x128, да уже и IDIV пробовала все равно не делит(
Настя22 вне форума Ответить с цитированием
Старый 23.01.2011, 13:12   #10
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Может не очень внимательно посмотрел, но что-то вообще не вижу, где вызывается ваша процедура. Ну и про ошибке в ней вам уже говорили.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4

Последний раз редактировалось Goodwin98; 23.01.2011 в 13:18.
Goodwin98 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Деление длинных чисел на длинные числа Dr. Feelgood Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 05.06.2010 12:05
Переполнение и перенос числа в ассемблере =Apple= Помощь студентам 2 03.06.2009 18:11
Деление числа на 20 с помощью сдвигов... maLoy*508 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 01.04.2008 02:36