Зеркальное отображение массива.
Необходимо зеркально отобразить массив из 256 байт. т.е. первый элемент меняется местами с последним, а второй с предпоследним и.т.д.
В других языках программирования это не составило бы особых проблем. Там как никак есть инструкции while, if, for. Но тут я попал в тупик, подскажите пожалуйста как проще это реализовать!?
тем же while,if(если masm), не?а так, смотри в сторону loop,jcxz,cmp инструкциий.
П.С. Сорри что забыл сразу об этом упомянуть!
Цитата: Nosaer
Это для прошивания в микроконтроллер. Боюсь что он эти команды не особо поддерживает.
П.С. Сорри что забыл сразу об этом упомянуть!
П.С. Сорри что забыл сразу об этом упомянуть!
А больше вы ничего "упомянуть" не забыли, целевую платформу например?...
Если вы имеете ввиду тип микроктонтроллера, то это особой разницы не имеет. Как нибудь да разберусь. А так Motorolla
Цитата: Nosaer
Если вы имеете ввиду тип микроктонтроллера, то это особой разницы не имеет. Как нибудь да разберусь. А так Motorolla
Тогда, разбирайтесь.
Код:
RomStart EQU $9000
RAMStart EQU $0040
VectorStart EQU $FFFE
ORG RomStart
main: lda #40
sta $110
lda #29
sta $111
lda #45
sta $112
lda #3D
sta $113
lda #19
sta $114
mov #5,$50
ldhx #$110
m1: lda ,x
sta $20,X
aix #1
dec $50
bne m1
mend: jmp mend
ORG VectorStart
DW main
End
RAMStart EQU $0040
VectorStart EQU $FFFE
ORG RomStart
main: lda #40
sta $110
lda #29
sta $111
lda #45
sta $112
lda #3D
sta $113
lda #19
sta $114
mov #5,$50
ldhx #$110
m1: lda ,x
sta $20,X
aix #1
dec $50
bne m1
mend: jmp mend
ORG VectorStart
DW main
End
Здесь тупо копируется массив данных. Из одного места в ОЗУ в другое.
Если следлвать моей идеи, то для реализации того что нужно, мне необходимо с каждым циклом уменьшать значение $20 на 2 в команде sta $20,X
то есть должно получится, что то вроде этого:
$110+$20 = $130
$111+$18 = $129
$112+$16 = $128
$113+$14 = $127
А как это сделать я не пойму... Подскажите пожалуйста.
Я так думаю, что обыденные в 8086 jmp, cmp, jz и mov и косвенную адресацию ваш ассемблер поддерживает (имеет соотв.аналоги)
P.S.: ещё раз повторюзь, что не программирую так-то на асме, потому могу ошибаться в корректности реализации.
Я пролистал большое количество книг, и ничего похожего на array <-> array[255-i] так и не встретил.
По сути задача вроде бы из простых, отнимать в кажом цикле из 20 два. Но толи я с синтаксисом где то промахиваюсь, либо еще что.
если бы вы сказали какой именно проц , а ещё лучше дали ссылку на описалово , то мы могли вам помочь . )
Вот методичка по лабам, там описание архитектуры, и основные команды.
Но написана не особо понятным мне языком все это.. =)
http://zalil.ru/30779700
если использовать H и X , то счётчик циклов не нужен . достаточно проверять после каждой итерации что H > X и если это не верно , то конец цикла .
Не совсем понял, можно более подробнее "на пальцах"!?
LDH $xx ; загружаем конечный адрес массива
L:
LDA X ;загружаем в А значение из начала массива
MOV H,X ; копируем значение из [X] в [H]
STA H ;загружаем из А значение в конец массива
INC X ;+1 в Х
DEC H ;-1 в Н
CMP X,H ;сравниваем Х и Н (не уверен что будет работать в таком виде , но думаю идея ясна)
BHI L ;если Х всё ещё больше Н , то цикл по метке L
Спасибо, идея бы замечательно сработала. Но вся проблема в том, что при программировании Motorola возможно использовать только LDA, LDX и LDHX. Про LDH я нигде ничего не видел =(
выше был код , поясняющий алгоритм . и не более того .
я же написал : "не уверен что будет работать в таком виде.."