[lc3]汇编实现分段函数

Piecewise function

Purpose:用汇编语言实现分段函数(如下)的计算并保存结果

Program input: 60integers which are in [0, 100]. The input list is stored in 60 consecutivememory locations -- one score per location -- starting at address x3200. Thelast score is at location x323B.

Program output: The results of f(x) for all 60 x values. The resultsshould be stored in consecutive memory locations -- one result per location --starting at address x3300.

 

Principles:1.令输入的数据减去3或10,然后依靠BR指令实现比较分段的操作

2.函数部分的实现主要是x^3-x相对复杂,本实验采用的累加的方法加以实现,将x累加x次得到x^2,然后对x累加x^2-1次,其中迭代累加也是依赖BR指令得以实现

3.本次实验采用汇编语言,编写完成后生成.asm文件继而生成目标文件,在LC-3 simulator上运行验证

 

Procedure:

       代码分析

 

 

 

.ORIG x3000
		LD R2,INPUT		;R2指向待输入数据地址
		LD R3,OUTPUT	;R2指向数据输出地址
	
AGAIN	LD R5,FLAG		;load结束位置与R2比较,判断结束与否
		NOT R5,R5		;R5寄存器是临时数据的存储,其内容的变化在后面当关注
		ADD R5,R5,#1
		ADD R5,R2,R5
		BRz OVER		;跳转到程序over处
	
	
		LDR R4,R2,#0		;将输入数据存在R4中
		ADD R2,R2,#1	;R2指向下一个输入位置
	
		ADD R5,R4,#-3	
		BRzp TWO		;若R4内容小于3则跳转至函数分段2,否则继续执行

		AND R5,R5,#0
		ADD R5,R5,#2
		STR R5,R3,#0		
		ADD R3,R3,#1	;分段1的功能,结果为2,保存在R3所指,R3自增
		BRnzp AGAIN		;处理了一个输入,无条件跳转,实现循环

TWO	ADD R5,R4,#-10
		BRp THREE		;x>10则跳转至函数分段3,否则继续执行
	
		AND R6,R6,#0
		ADD R6,R4,#0
		AND R5,R5,#0	;清零操作,R6用作迭代计数,R5保存结果
AGAINSE ADD R5,R5,R4
		ADD R6,R6,#-1
		BRp AGAINSE		;循环结束后R5内容为x^2

		ADD R6,R5,#-1
		AND R5,R5,#0	
AGAINTH ADD R5,R5,R4
		ADD R6,R6,#-1
		BRp AGAINTH	;累加得到x^3-x
		STR R5,R3,#0
		ADD R3,R3,#1	;结果保存在R3所指,R3自增
		BRnzp AGAIN		;处理了一个输入,无条件跳转,实现循环

THREE	ADD R5,R4,#1	;分段3的功能
		STR R5,R3,#0
		ADD R3,R3,#1
		BRnzp AGAIN	

OVER	HALT

INPUT  .FILL X3200
OUTPUT .FILL X3300
FLAG   .FILL X323C
        .END

Result:

结果测试

输入数据如下,未显示部分均为x0000

得到结果如下(未显示部分均为x0002),检验可知与从分段函数预测的结果一致

 

由于共有60个数据输入,输出结果应存在x3300~x333B,下图为x333B的截图,发现输出确实在此位置停止

 

综上初步判断实验结果正确

 

 

 

 

 

 

 

 

 

生命游戏(Game of Life)是一种经典的细胞动机,可以用LC3汇编语言实现。下面是一个简单的生命游戏的LC3汇编代码示例: ``` .ORIG x3000 ; 定义常量 WIDTH .FILL 10 HEIGHT .FILL 10 ; 定义存储空间 .BLKW WIDTH*HEIGHT .BLKW WIDTH*HEIGHT ; 初始化细胞状态 INIT LEA R0, GRID LEA R1, GRID_COPY LD R2, WIDTH LD R3, HEIGHT INIT_LOOP LDR R4, R0, #0 STR R4, R1, #0 ADD R0, R0, #1 ADD R1, R1, #1 ADD R3, R3, #-1 BRp INIT_LOOP ; 游戏循环 GAME_LOOP LEA R0, GRID LEA R1, GRID_COPY LD R2, WIDTH LD R3, HEIGHT JSR UPDATE_GRID ; 显示当前细胞状态 JSR DISPLAY_GRID ; 复制GRID_COPY到GRID LEA R0, GRID_COPY LEA R1, GRID LD R2, WIDTH LD R3, HEIGHT JSR COPY_GRID BR GAME_LOOP ; 更新细胞状态 UPDATE_GRID LD R4, #0 ST R4, COUNT_ALIVE LEA R0, GRID LEA R1, GRID_COPY LD R2, WIDTH LD R3, HEIGHT UPDATE_LOOP LDR R4, R0, #0 JSR COUNT_NEIGHBORS JSR UPDATE_CELL ADD R0, R0, #1 ADD R1, R1, #1 ADD R3, R3, #-1 BRp UPDATE_LOOP RET ; 统计邻居细胞的数量 COUNT_NEIGHBORS ST R7, SAVE_R7 ADD R7, R7, #-1 ST R0, SAVE_R0 ST R1, SAVE_R1 ST R2, SAVE_R2 ST R3, SAVE_R3 AND R4, R4, #0 ADD R5, R0, #-1 ADD R6, R1, #-1 LD R0, WIDTH LD R1, HEIGHT ADD R2, R5, #2 ADD R3, R6, #2 JSR IS_VALID_CELL ADD R2, R5, #2 ADD R3, R6, #1 JSR IS_VALID_CELL ADD R2, R5, #2 ADD R3, R6, #0 JSR IS_VALID_CELL ADD R2, R5, #1 ADD R3, R6, #2 JSR IS_VALID_CELL ADD R2, R5, #1 ADD R3, R6, #0 JSR IS_VALID_CELL ADD R2, R5, #0 ADD R3, R6, #2 JSR IS_VALID_CELL ADD R2, R5, #0 ADD R3, R6, #1 JSR IS_VALID_CELL ADD R2, R5, #0 ADD R3, R6, #0 JSR IS_VALID_CELL LD R0, SAVE_R0 LD R1, SAVE_R1 LD R2, SAVE_R2 LD R3, SAVE_R3 LD R7, SAVE_R7 RET ; 判断细胞是否有效 IS_VALID_CELL ADD R4, R4, #1 BRn INVALID_CELL BRp VALID_CELL ; 细胞无效 INVALID_CELL RET ; 细胞有效 VALID_CELL LDR R5, R1, #0 ADD R5, R5, R4 STR R5, R1, #0 RET ; 更新细胞状态 UPDATE_CELL LDR R5, R1, #0 LDR R6, COUNT_ALIVE ADD R6, R6, #-1 ADD R7, R4, #-1 BRn CELL_DEAD ADD R7, R4, #-2 BRn CELL_DEAD ADD R7, R4, #-3 BRn CELL_DEAD ADD R7, R4, #-4 BRn CELL_DEAD ADD R7, R4, #-5 BRn CELL_DEAD ADD R7, R4, #-6 BRn CELL_DEAD ADD R7, R4, #-7 BRn CELL_DEAD ADD R7, R4, #-8 BRn CELL_DEAD CELL_ALIVE ADD R5, R5, #1 STR R5, R1, #0 ADD R6, R6, #1 STR R6, COUNT_ALIVE RET CELL_DEAD STR R5, R1, #0 RET ; 显示细胞状态 DISPLAY_GRID LEA R0, GRID LD R2, WIDTH LD R3, HEIGHT DISPLAY_LOOP LDR R4, R0, #0 OUT ADD R0, R0, #1 ADD R3, R3, #-1 BRp DISPLAY_LOOP RET ; 复制GRID_COPY到GRID COPY_GRID LEA R0, GRID_COPY LEA R1, GRID LD R2, WIDTH LD R3, HEIGHT COPY_LOOP LDR R4, R0, #0 STR R4, R1, #0 ADD R0, R0, #1 ADD R1, R1, #1 ADD R3, R3, #-1 BRp COPY_LOOP RET ; 存储空间 GRID .BLKW WIDTH*HEIGHT GRID_COPY .BLKW WIDTH*HEIGHT ; 寄存器保存 SAVE_R0 .BLKW 1 SAVE_R1 .BLKW 1 SAVE_R2 .BLKW 1 SAVE_R3 .BLKW 1 SAVE_R7 .BLKW 1 ; 统计存活细胞数量 COUNT_ALIVE .FILL 0 .END ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值