assembly 如何执行BSR SUBR,以及定义代码的SUBR部分?

mtb9vblg  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(128)

Question
该程序应执行以下操作:
1.将存储在地址标签DATA中的前6个数据项($1至$6)相加。
1.将前6个数据项的总和存储到地址标签SUM 1。
1.将存储在地址标签SUM 1中的和乘以8,并将结果存储在地址标签MUL 8中。(先循环,然后相加)
1.将存储在地址标签DATA中的最后6个数据项($7至$C)相加。
1.将最后6个数据项的总和存储到地址标签SUM 2。
1.将存储在地址标签SUM 2的和除以4,并将结果存储在地址标签DIV 4。

hk8txs48

hk8txs481#

如何执行BSR SUBR,并定义代码的 SUBR 部分?
如果不咨询Programmer's Reference Manual,您将无法解决此任务
对于已经执行了“分支到子例程”(BSR)的BSR SUBR指令,实际上没有什么可做的。定义 SUBR 部分只需要写下将执行任务描述中概述的六个步骤的指令,然后执行“从子例程返回”(RTS)。
为了帮助您继续操作,以下是步骤1的详细说明
1.将存储在地址标签DATA中的前6个数据项($1至$6)相加。
为了对数组中的6个字节求和,我们可以将第一个字节加载到数据寄存器中,然后从循环中添加接下来的5个字节。

循环之前,我们:

  • DATA 标签的地址加载到地址寄存器(如A1)。movea.l #DATA, a1指令会执行此操作。
  • 加载循环计数为5的数据寄存器(如D1)。moveq.l #5, d1指令可执行此操作。要加载[-128,+127]范围内的小数字,始终首选moveq而不是move,因为它速度更快,编码更小。
  • 将数组中的第一个字节加载到另一个数据寄存器(如D 0)。move.b (a1)+, d0指令会执行此操作。由于此指令使用 * 后置增量 * 寻址模式,且大小属性为 * 字节 *,因此A1地址寄存器中保存的地址将自动递增1。这样,我们就可以单步执行数组。
    环路中,我们:
  • 将下一个字节添加到所选的D 0数据寄存器。add.b (a1)+, d0指令可执行此操作。
  • 递减D1数据寄存器中的循环计数。subq.l #1, d1指令会执行此操作。要减去[1,8]范围内的小数字,总是首选subq而不是sub/subi,因为它的编码更小,而且比subi快得多。
  • 仅当循环计数器得递减未产生0时,分支到循环得顶部. bne.s loop1指令执行此操作.
movea.l #DATA, a1
    moveq.l #5, d1
    move.b  (a1)+, d0
loop1:
    add.b   (a1)+, d0
    subq.l  #1, d1
    bne.s   loop1

我会加入下一步,因为它相当琐碎
1.将前6个数据项的总和存储到地址标签SUM 1。
第1步将总和留在D 0数据寄存器中。只需将其移动到 * SUM 1 * 变量中,但要确保使用正确的大小标签,即.b,与 * SUM 1 * 变量的定义一致:

move.b   d0, SUM1

祝您顺利完成第3步到第6步...

相关问题