Ниже один из возможных способов реализовать свой специфический цикл.
Это в основном для HC11, который является исходным уровнем, совместимым с HCS12, поэтому он также должен правильно собираться для HCS12. Однако HCS12 имеет некоторые дополнительные инструкции и режимы адресации (например, индексированный автоинкремент), которые могут сделать код немного короче и даже более читабельным. Во всяком случае, я на самом деле не пробовал это, но все должно быть в порядке.
BTW, ваш код показывает, что у вас есть фундаментальное непонимание определенных инструкций. Например, BLO 50
не означает ответвление, если сумма аккумулятора ниже 50. Это означает проверку соответствующих флагов CCR (регистр кода условий), которые должны быть уже установлены предыдущей инструкцией, и ответвление на адрес 50 (очевидно, не то, что вы намеревались), если значение меньше цели. Чтобы сравнить регистр со значением или некоторым местоположением памяти, вы должны использовать инструкции CMPx
(например, CMPA
).
;The array arr will be located at $1500 and the contents {2, 5, 6, 16, 100, 29, 60}
org $1500 ;(somewhere in ROM)
arr fcb 2,5,6,16,100,29,60 ;as bytes (use dw if words)
org $100 ;wherever your RAM is
;sum = 0;
sum rmb 2 ;16-bit sum
org $8000 ;wherever you ROM is
;for i = 0 : 6
clrb ;B is your loop counter (i)
stb sum ;initialize sum to zero (MSB)
stb sum+1 ; -//- (LSB)
ForLoop cmpb #6 ;compare against terminating value
bhi ForEnd ;if above, exit FOR loop
; x = arr[i];
ldx #arr ;register X now points to array
abx ;add offset to array element (byte size assumed)
ldaa ,x ;A is your target variable (x)
;;;;;;;;;;;;;;;;;;; ldaa b,x ;HCS12 only version (for the above two HC11-compatible lines)
inx ;X points to next value for next iteration
;;;;;;;;;;;;;;;;;;; ldaa 1,x+ ;HCS12 only version (for the above two HC11-compatible lines)
; if(x < 50)
cmpa #50
bhs EndIf
; sum = sum + x
adda sum+1
staa sum+1
ldaa sum
adca #0
staa sum
EndIf
incb ;(implied i = i + 1 at end of loop)
bra ForLoop
;end
ForEnd
Приведенное выше предполагает, что ваш массив постоянный, поэтому он помещается где-то в ПЗУ во время сборки. Если ваш массив динамический, он должен быть расположен в ОЗУ, и вам нужно будет использовать код для его загрузки (подобно тому, как вы это сделали). Однако для эффективности цикл обычно используется при загрузке (копировании) нескольких значений из одного места в другое. Это более читаемо и более эффективно с точки зрения необходимой памяти кода.
Надеюсь, это поможет.
Отредактировано: Не забудьте инициализировать SUM
до нуля.
Отредактировано: В отличие от HC08, CLRA
в HC11 очищает Carry, поэтому последовательность CLRA
, ADCA
неверна. Заменяется на правильное: , ADCA #0
_ «Может ли кто-нибудь записать его на языке сборки HCS12 с комментариями?» _ Это не то, для чего предназначен StackOverflow. _ «есть ли другой способ, более простой для определения массива?» _. Конечно, просто поместите байты в раздел данных вашей программы и обратитесь к ним по адресу первого байта. – Michael