如何实现BSR SUBR并定义代码中的SUBR部分?附程序功能要求
实现BSR调用SUBR的汇编程序(满足指定功能)
以下是基于68000架构的汇编实现,通过BSR调用子程序(SUBR)完成所有功能要求:
数据段定义
DATA DC.W $1,$2,$3,$4,$5,$6,$7,$8,$9,$A,$B,$C ; 12个目标数据项 SUM1 DS.W 1 ; 前6项求和结果存储区 MUL8 DS.W 1 ; SUM1乘8结果存储区 SUM2 DS.W 1 ; 后6项求和结果存储区 DIV4 DS.W 1 ; SUM2除以4结果存储区
主程序流程
START: ; 计算DATA前6项和,存入SUM1 LEA DATA, A0 ; A0指向DATA起始地址 MOVE.W #6, D1 ; D1设置为计数6 BSR SUM_SUB ; 调用求和子程序 MOVE.W D0, SUM1 ; 结果存入SUM1 ; SUM1乘8,存入MUL8 MOVE.W SUM1, D0 ; 取SUM1的值到D0 BSR MUL8_SUB ; 调用循环乘8子程序 MOVE.W D0, MUL8 ; 结果存入MUL8 ; 计算DATA后6项和,存入SUM2 LEA DATA+12, A0 ; A0指向第7个数据(每个数据占2字节,6个共12字节) MOVE.W #6, D1 ; D1设置为计数6 BSR SUM_SUB ; 调用求和子程序 MOVE.W D0, SUM2 ; 结果存入SUM2 ; SUM2除以4,存入DIV4 MOVE.W SUM2, D0 ; 取SUM2的值到D0 BSR DIV4_SUB ; 调用除以4子程序 MOVE.W D0, DIV4 ; 结果存入DIV4 STOP #$2700 ; 程序终止
子程序(SUBR)定义
求和子程序 SUM_SUB
功能:计算A0指向的连续D1个16位数据的和,结果存入D0
SUM_SUB: MOVE.W #0, D0 ; 初始化累加器D0为0 SUM_LOOP: ADD.W (A0)+, D0 ; 取A0指向的数据加到D0,A0自增指向下一个数据 SUBQ.W #1, D1 ; 计数减1 BNE SUM_LOOP ; 计数不为0则继续循环 RTS ; 返回主程序
循环乘8子程序 MUL8_SUB
功能:将D0中的值通过循环累加实现乘以8,结果存入D0
MUL8_SUB: MOVE.W D0, D2 ; 保存原始值到D2 MOVE.W #0, D0 ; 初始化结果寄存器为0 MOVE.W #8, D1 ; 设置循环次数为8 MUL_LOOP: ADD.W D2, D0 ; 累加原始值 SUBQ.W #1, D1 ; 循环次数减1 BNE MUL_LOOP ; 未完成则继续 RTS ; 返回主程序
除以4子程序 DIV4_SUB
功能:将D0中的16位无符号数除以4,结果存入D0(若处理有符号数,可替换为ASR.W #2, D0)
DIV4_SUB: LSR.W #2, D0 ; 逻辑右移2位,等价于无符号数除以4 RTS ; 返回主程序
内容的提问来源于stack exchange,提问作者thxr
相关产品推荐
相关产品推荐

