Помогите дописать программу на ассемблере

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Родился
Сообщения: 2
Зарегистрирован: Вс фев 20, 2011 16:31:27

Сообщение PeeEll »

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

%nolist
Include mac.lib
%list
;ЇҐаҐЇЁб вм ¬ ббЁў ў ®Ўа в­®¬ Ї®ап¤ЄҐ ў ¤агЈ®© ¬ ббЁў
A_DATA segment para
a dw 10 dup(0) ; ¬ ббЁў Ђ
b dw 10 dup(?) ;¬ ббЁў Ѓ
n dw ? ;Є®«ЁзҐбвў® н«Ґ¬Ґ­в®ў ¬ ббЁў  Ђ
m dw ?
;r dw 1 dup<0>
mes1 db 10,13,'€Ј­ в祭Є® ђ.Ђ. ќ‚Њ§г-07 ‚ аЁ ­в-3 $'
mes2 db 10,13,'‚ўҐ¤ЁвҐ Є®«ЁзҐбвў® н«Ґ¬Ґ­в®ў ¬ ббЁў : $'
mes3 db 10,13,'ўўҐ¤ЁвҐ зЁб«®: $'
mes4 db 10,13,' $'
mes5 db 10,13,'¬ ббЁў Ђ: $'
mes6 db 10,13,'€§¬Ґ­с­­л© ¬ ббЁў: $'
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

msg proc ;Їа®жҐ¤га  ўў®¤  зЁб«  ¬ ббЁў 
message mes3
key_$2bin
ret
msg endp

vvod proc far Тут процедура ввода массива
mov di,0
;§ ­®бЁ¬ ў бзсвзЁЄ зЁб«® н«Ґ¬Ґ­в®ў ¬ ббЁў 
cikl:
call msg
mov bx[di],ax
add di,2
loop cikl
ret
vvod endp

pech proc near
print_number
ret
pech endp

pech1 proc near
print_number
ret
pech1 endp

vivod proc near а тут процедура выода массива она работает
mov di,0
cikl2:
mov ax,bx[di]
call pech
add di,2
loop cikl2
ret
vivod endp

vivodIZMmas proc near здесь я попытался описать процедуру вывода массива в обратном порядке, но она не работает
mov ax,n
mov bx,1
inc si
cikl3:
mov ax,n
call pech1
add si,2

loop cikl3
ret
vivodIZMmas endp

;obr proc far ;Їа®жҐ¤га  ЇҐаҐЇЁблў ой п ¤ ­­л© ¬ ббЁў ў ®Ўа в­®¬ Ї®ап¤ЄҐ
;mov di,0
;mov si,0
;mov r,0
;m1: mov

start:
mov ax,a_data
mov ds,ax

call about ;ўл§®ў дг­ЄжЁЁ about

message mes2
key_$2bin
mov n,ax ;ўў®¤ Є®«ЁзҐбвў  н«Ґ¬Ґ­в®ў ў ¬ ббЁўҐ Ђ
mov cx,n
lea bx,a ;§ ­®бЁ¬ ў ॣЁбва  ¤аҐб ­ з «  ¬ ббЁў 
call vvod ;ўл§®ў Їа®жҐ¤гал ўў®¤  ¬ бЁў 

message mes5
mov cx,n
lea bx,a
call vivod

message mes6
mov cx,n
lea bx,a
call vivodIZMmas

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

Подскажите пожалуйста как написать этот вывод массива, в процедуре ли его вообще описывать, я тут просто перепробовал много вариантов, но пока застопорился на этом :(
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

... так понимаю что это DOS? Для вывода массива в обратном порядке
1. Определите размер массива (сохраним в сх)
2. Установите указатель на его последний элемент.
mov bx,offset array
add bx,cx

3 повторяем cx-раз, не забывая уменьшать индекс bx
Реклама
Родился
Сообщения: 2
Зарегистрирован: Вс фев 20, 2011 16:31:27

Сообщение PeeEll »

погодите, размер массива мы задаём при вводе, при этом количеством элементов в массиве является n и оно записывается в cx
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

при этом количеством элементов в массиве является n и оно записывается в cx
... наверное - просто не смог "перевести"

Код: Выделить всё

n dw ? ;Є®«ЁзҐбвў® н«Ґ¬Ґ­в®ў ¬ ббЁў  Ђ
.. такую программу на ассемблере проще не дописать, а переписать
Реклама
Эиком - электронные компоненты и радиодетали
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»