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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.12.2010, 19:24   #1
imol
 
Регистрация: 04.12.2010
Сообщений: 4
По умолчанию Задача

Прошу помощи в решении задачи. Программирование процессора 8086.
Вроде бы не очень сложная, но пока разобраться не получается.


Входные параметры: BX – адрес массива, состоящего из 16-ти байт. Элементы массива могут содержать значения 1 или 2. Определить последний элемент, который содержит 2, начиная с конца массива. Вернуть порядковый номер (начиная с 0) этого элемента в AX или 255 если нет ни одного такого элемента.

Код:
org 100h

mov cx,14 ; 
mov dx,15

mov bx,offset states 
call lab_pr

hlt

lab_pr proc
       ; TODO: add your code here
       ; ...
       ; ...
       ; ...
       ret
lab_pr endp

states db 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255 
; numbers  0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15    
end
imol вне форума Ответить с цитированием
Старый 04.12.2010, 21:52   #2
Ant1971on
Пользователь
 
Регистрация: 20.07.2010
Сообщений: 52
По умолчанию

Непонятно, зачем у вас массив забит числом 255, если по условию, как я понял, это число является лишь признаком отсутствия в массиве двойки.
Вот мой вариант (результат смотрите в отладчике, на экран не стал выводить) :

Код:
CODE_SEG SEGMENT

ASSUME CS:CODE_SEG

	ORG 100h


START:
	
	MOV BX,OFFSET MASS
	MOV SI,15	
	
TEST_ELEMENT:

	MOV AL,[BX][SI]
	DEC AL
	JNZ WRITE_SI
	DEC SI
	JS WRITE_255
	JMP TEST_ELEMENT

WRITE_SI:

	MOV AX,SI

EXIT:  

	INT 20h

WRITE_255:

	MOV AX,255
	JMP EXIT 
	

MASS DB 1,1,1,2,1,1,1,1,1,1,2,1,1,1,1,1

CODE_SEG ENDS

END START

Последний раз редактировалось Ant1971on; 04.12.2010 в 22:06.
Ant1971on вне форума Ответить с цитированием
Старый 04.12.2010, 23:52   #3
imol
 
Регистрация: 04.12.2010
Сообщений: 4
По умолчанию

Это я перепутал. Спасибо, Антон!
imol вне форума Ответить с цитированием
Старый 05.12.2010, 14:10   #4
Ant1971on
Пользователь
 
Регистрация: 20.07.2010
Сообщений: 52
По умолчанию

Рад был помочь Кстати, удалось немного упростить програмку:

Код:
CODE_SEG SEGMENT

ASSUME CS:CODE_SEG

	ORG 100h

START:
	
	MOV BX,OFFSET MASS
	MOV SI,15	
	
TEST_ELEMENT:

	MOV AL,[BX][SI]
	DEC AL
	JNZ WRITE_RESULT
	DEC SI
	JS WRITE_RESULT
	JMP TEST_ELEMENT

WRITE_RESULT:

	MOV AX,SI
	XOR AH,AH

	INT 20h

MASS DB 1,1,1,2,1,1,1,1,1,1,2,1,1,1,1,1

CODE_SEG ENDS

END START
Ant1971on вне форума Ответить с цитированием
Старый 22.12.2010, 19:22   #5
imol
 
Регистрация: 04.12.2010
Сообщений: 4
По умолчанию

Есть вот такая загвоздка. Программа, в принципе, работает, но находит первую двойку с конца, а не последнюю. Но не суть, я идеей воспользовался, за что спасибо, и написал немного по другому, пусть и получилось объёмно. Но и тут несостыковочка, если двойка в нулевом элементе, то выводится 255, т.к. условие стоит на проверку нуля в bp. Если у кого найдутся идеи, буду рад, если поделитесь. Код прилагается.
Код:
mov bx,offset states            
mov si,15
call lab_pr
hlt

lab_pr proc
proverka:
    mov al,[bx][si]
	dec al
	jnz nomer
	cmp si,0
	jz vyhod
	dec si
	jmp proverka
nomer:
	mov bp,si
	cmp si,0
	jz vyhod
	dec si
	jmp proverka    
vyhod:  
	cmp bp,0
	jz netu
	mov ax,bp
	ret
netu:
	mov ax,255
	ret 
	
lab_pr endp

states db 2,1,1,1,1,1,1,1,1,1,1,1,1,1,1 
; numbers 0 1 2 3 4 5 6 7 8 9 101112131415    
end
imol вне форума Ответить с цитированием
Старый 22.12.2010, 23:39   #6
Ant1971on
Пользователь
 
Регистрация: 20.07.2010
Сообщений: 52
По умолчанию

Виноват, невнимательно прочитал задачу. Почему-то решил, что раз с конца проверяем, то и находить надо первую попавшуюся двойку с конца.
Вот правильное решение:

Код:
CODE_SEG SEGMENT

	ORG 100h
	
START:

           XOR AX,AX
	MOV BX,OFFSET MASS
	MOV SI,LNT-1

TEST_ELEMENT:

	MOV DL,[BX][SI]
	DEC DL
	JNZ SAVE_NUMBER
	DEC SI
	JS TEST_AX
	JMP TEST_ELEMENT

SAVE_NUMBER:

	MOV AX,SI
	DEC SI
	JS DONE
	JMP TEST_ELEMENT

TEST_AX:

	CMP AX,0
	JNE DONE
	MOV AX,255	

DONE:

	INT 20h		 

;------------------------------------------------------------------------------

MASS DB 2,1,1,1,2,1,1,1,1,2,1,1
LNT=$-MASS

;------------------------------------------------------------------------------

CODE_SEG ENDS

END START
Ant1971on вне форума Ответить с цитированием
Старый 23.12.2010, 18:21   #7
imol
 
Регистрация: 04.12.2010
Сообщений: 4
По умолчанию

Мдя, оказалось всё совсем просто, но я не догадался. Ещё раз благодарю, Антон!
imol вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
задача Ainash Помощь студентам 13 04.11.2010 15:37
Задача по с ymanety Общие вопросы C/C++ 1 30.10.2010 21:28
Задача ksandrj Помощь студентам 0 23.09.2010 14:29