前面给出了一个实现加法的小程序,但是如果要求变得更复杂、步骤变得更繁琐,这时又该怎么办呢??我们可以使用子程序来解决这个问题,这里给个例子:若字变量Data1和Data2分别存放着两个16位无符号数,编写求两个数之和的子程序,并将和存放到Sum字节存储空间中。代码如下:
org $0070
data1 ds.b 2
data2 ds.b 2
sum ds.b 3
org $1860
Add_Pro: clc ;清空进位标志位
clrx
clrh
clra
mov #$00,data1
mov #$04,data1+1
mov #$00,data2
mov #$28,data2+1
lda data1+1
add data2+1
sta sum+2
lda data1
adc data2
sta sum+1
rola ;得到第17为,主要操作是:将寄存器a中数据向做移一位并把进位标志位放入寄存器a中的第一位
and #01H
sta sum
rts ;子程序返回指令
main:
clra
clrx
bsr Add_Pro ;子程序调用,直接进入子程序中,执行子程序中的程序。
again:
nop
jmp again
org $fffe
dc.w main
分析:两个16位无符号数相加,和为17位,至少需要3B的存储空间。又因为MC9S08AW60的存储方式是大端方式:低地址存放最高有效字节。所以对两个数的低位数相加时是使用Data1+1、Data2+1。