我正在尝试学习HCS12汇编语言,但互联网上没有足够的例子。我试过写代码但是没有成功。我被卡住了。这不是绝对的功课。有人可以用HCS12汇编语言写评论吗?我想要代码,因为我真的想逐步阅读它。顺便说一下,有没有其他方法更简单的定义数组?
;The array arr will be located at $1500 and the contents {2, 5, 6, 16, 100, 29, 60}
sum = 0;
for i = 0 : 6
x = arr[i];
if( x < 50 )
sum = sum + x
end
我的尝试:
Entry:
;2,5,6,16,100,39,60
LDAA #2
STAA $1500
LDAA #5
STAA $1501
LDAA #6
STAA $1502
LDAA #16
STAA $1503
LDAA #100
STAA $1504
LDAA #39
STAA $1505
LDAA #60
STAA $1506
CLRA ; 0 in accumulator A
CLRB ; 0 in accumulator B
ADDB COUNT ; B accumulator has 6
loop:
;LDAA 1, X+ ; 1500 should be x because it should increase up to 0 from 6
; A accumulator has 2 now
BLO 50; number less than 50
;ADDA
DECB
BNE loop
答案 0 :(得分:3)
以下是实现特定FOR循环的一种可能方法。
主要用于HC11,它与HCS12的源级兼容,因此它也应该为HCS12正确组装。然而,HCS12具有一些额外的指令和寻址模式(例如,索引自动增量),这可以使代码更短并且甚至更可读。无论如何,我实际上没有尝试过,但它应该没问题。
顺便说一下,你的代码显示你对某些指令有一些基本的缺乏理解。例如,如果累加器低于50,BLO 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
以上假设您的数组是常量,因此它在汇编时放在ROM中的某个位置。如果您的阵列是动态的,它应该位于RAM中,您需要使用代码加载它(类似于您的方式)。但是,为了提高效率,通常在将多个值从一个位置加载(复制)到另一个位置时使用循环。在所需的代码存储器方面,这更具可读性和效率。
希望这有帮助。
已编辑:忘记将SUM
初始化为零。
已编辑:与HC08不同,HC11中的CLRA
会清除进位,因此序列CLRA
,ADCA
错误。替换为正确的:LDAA
,ADCA #0