代码改变世界

Freescale MC9S08AW60汇编学习笔记(三)

2015-04-30 17:21  赤骥~  阅读(248)  评论(0编辑  收藏  举报

  前面给出了一个实现加法的小程序,但是如果要求变得更复杂、步骤变得更繁琐,这时又该怎么办呢??我们可以使用子程序来解决这个问题,这里给个例子:若字变量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。