Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > Одномерный массив


Автор: Анастасия17 19.1.2011, 01:28
было задание переписать подряд в массив Y положительные и в массив Z отрицательные элементы массива X массив X у меня равен: 1,4,2,-5,3,-1


.model small
.stack
.data

MAS dw 1,4,2,-5,3,-1; массив из 6 элементов
y dw 6
z dw 6
.code

mas proc
mov ax, 0
lea bx, MAS
lea si, y
lea di, z
mov cx, 6количество элементов в массиве Х
CYCL: lodsb; получили в АХ очередной элемент из массива Х
mov ax, '0'; сравнили содержимое АХ с нулем
js bm ; если АХ <0 перейдем на bm
mov ax, '0';сравнили содержимое АХ с нулем
jnl am; если АХ > 0 или АХ = 0 пересылаем содержимое АХ в массив Y
bm: mov[di],ax; ;пересылаем содержимое АХ в массив Z 
am: mov [si],ax ;пересылаем содержимое АХ в массив y
loop CYCL ; если проверили не все элементы перейти на начало цикла
ret
summas endp
begin:
mov ax, @data
mov ds, ax
xor ax, ax


call z ; вывод z
call y; вывод y 

mov ah, 4ch ; выходим из программы
int 21h
end begin 

помогите найти ошибку(

Автор: JAPH 19.1.2011, 02:03
"Не забывайте пользоваться кнопкой КОД." Большими красными буквами. Привыкаем smile
Код

.model small
.stack
.data

MAS dw 1,4,2,-5,3,-1
y dw 6 ; имелось в виду: y dw 6 dup (?)
z dw 6 ; а то объявляется не место для шести чисел, а одно число шесть
.code

mas proc ; не соответствует summas endp
mov ax, 0
lea bx, MAS
lea si, y
lea di, z
mov cx, 6количество элементов в массиве Х; точка с запятой съелась
CYCL: lodsb; в MAS элементы типа word, а lodsb загружает байт, причем по адресу si, а на MAS-то bx указывает.. нестыковочка
mov ax, '0'; сравнили - это CMP, с нулем как с числом - это без кавычек
js bm
mov ax, '0'; повторно сравнивать необязательно - с предыдущего сравнения флаги не менялись
jnl am
; а сюда (по смыслу) управление не попадет никогда.
; варианты:
; либо если число не должно попадать в Z, оно должно оказываться в Y,
;      и если переход на запись в Z не сработал - то можно сразу записывать в Y, ничего более не проверяя
; либо если число равно нулю, то оно не должно попадать ни в Y, ни в Z,
;      тогда нужен не jnl, а строгий jg, а здесь безусловный прыжок через запись в массивы,
;      или лучше перепрыгивать через запись по je (jz), а если прыжка не произошло - записывать в массив здесь
bm: mov[di],ax ; а передвинуть указатель? а то следующие элементы будут записываться поверх..
; вот записали в Z, а теперь.... записываем в Y? не хватает jmp
am: mov [si],ax ; аналогично - внимательно следить за указателем
loop CYCL
ret
summas endp
begin:
mov ax, @data
mov ds, ax
xor ax, ax ; зачем?
; а кто будет вызывать summas?

call z ; код этих процедур было бы неплохо включить в программу. и назвать как-нибудь отлично от метки массива
call y ; кстати, интересно, как они поймут, сколько элементов оказалось в y и z... и почему это вообще две процедуры, а не одна с параметром..

mov ah, 4ch
int 21h
end begin 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)