HNU 计算机系统 作业1

P33页,第3题

题目

在本章所设计的原型系统中,实现两个正整数相乘(假设乘积不超过127),并在虚拟程序中运行。

答案

汇编代码如下:

# 两个大于1的正数相乘
1 in R1			# 乘数a
2 movb R0,R1	# 乘数a存放到内存0000 0000
3 in R1			# 被乘数b
4 movi 1
5 movb R0,R1	# 被乘数b存放在内存0000 0001
		    	# 结果存放在内存 0000 0010
# 开始循环
6 movi 1		# R0中的值为1
7 movc R1,R0	# 从内存中取出值b
8 movi 1		# 设置R0中的值为1
9 sub R1,R0		# R1即b值减1,此时设置G值
10 movi 1
11 movb R0,R1	# b值需要保存回去
12 movi 0		# R0中设置为0,即内存地址0
13 movc R2,R0	# 取出a值
14 movi 2		# R0中设置为2,即内存地址0000 0010
15 movc R1,R0	# 取出结果
16 add R1,R2	# 做加法
17 movb R0,R1	# 将结果存回去
18 movd       	# 保存当前的PC值到R3
19 movi -12     # R0的值设置为-12
20 add R3,R0  	# R3的值加-12
21 jg         	# 如果第12行的减法设置G为1,就跳转
# 循环结束
22 movi 2		# R0中设置为2,即内存地址0000 0010
23 movc R1,R0	# 取出结果
24 out R1		# 打印结果
25 halt

在VSPM中运行情况如下:

P47页,第3题

题目

当我们调用汇编器的时候,下面代码中的每一行都会产生一个错误信息,请在机器上运行,阅读错误提示信息,并解释每一行是哪里出了错,如何修改。

movb $0xF,(%ebx)
movw %eax,(%esp)
movl (%eax),4(%esp)
movb %al,%sl
movl %eax,$0xFFFFFFFF
movw %eax,%bx
movb %si, 8(%esp)

答案

对于第一句movb $0xF,(ebx),汇编后无错误。

对于第二句movw %eax,(%esp),汇编后报错如下:

误原因是%eax是32位寄存器,而movw是16位的数据传送指令,二者不匹配。应将movw改为movl。

对于第三句movl (%eax),4(%esp),汇编后报错如下:

错误原因是mov指令不允许源操作数和目标操作数都是内存地址。应将(%eax)改为%eax。

对于第四句movb %al,%sl,汇编后报错如下:

错误原因是不存在%sl寄存器。应将%sl改为%bl

对于第五句movl %eax,$0xFFFFFFFF,汇编后报错如下:

错误原因是$0xFFFFFFFF是立即数,而mov指令的目标操作数不能是立即数。应将%eax与$0xFFFFFFFF位置互换。

对于第六句movw %eax,%bx,汇编后报错如下:

误原因是%eax是32位寄存器,而movw是16位的数据传送指令,二者不匹配。应将%eax改为%ax。

对于第七句movb %si, 8(%esp),汇编后报错如下:

误原因是%si是16位寄存器,而movb是8位的数据传送指令,二者不匹配。应将movb改为movw。

P48页,第6

题目

假设下面的值存放在指定的存储器地址和寄存器中:

地址

0x100

0xFF

0x104

0xAB

0x108

0x13

0x10C

0x11

寄存器

%eax

0x100

%ecx

0x1

%edx

0x3

填写下表,给出下面指令的效果,说明将被更新的寄存器或存储器位置,以及得到的值。

指令

目的

addl %ecx,(%eax)

subl %edx,4(%eax)

imull $16,(%eax,%edx,4)

incl 8(%eax)

decl %ecx

subl %edx,%eax

答案

指令

目的

addl %ecx,(%eax)

内存地址0x100

0x100

subl %edx,4(%eax)

内存地址0x104

0xA8

imull $16,(%eax,%edx,4)

内存地址0x10C

0x110

incl 8(%eax)

内存地址0x108

0x14

decl %ecx

寄存器%ecx

0x0

subl %edx,%eax

寄存器%eax

0xFD

P48页,第7

题目

我们经常可以看见以下形式的汇编代码行:

xorl %eax,%eax

但是在产生这段汇编代码的C语言代码块中,并没有出现EXCLUSIVE-OR操作。

(1)解释这条指令实现了什么操作。

(2)更直接表达这个操作的汇编代码是什么?

(3)比较同一个操作的两种不同实现的编码字节长度。

答案

(1)将%eax寄存器中的值和自己做异或,结果写回到%eax寄存器中。由于任何数与自身异或的结果为 0,故该指令的实际作用是将寄存器%eax的值清零

(2)

movl $0,%eax

(3)xorl %eax, %eax的编码:机器码为31 C0,长度为2字节。短小高效,适合频繁清零的场景(如循环或函数初始化)

movl $0, %eax的编码:机器码为B8 00 00 00 00,长度为5字节。需要编码一个 32位立即数$0,导致指令较长。

基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究(Matlab代码实现)内容概要:本文围绕“基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究”,介绍了利用Matlab代码实现配电网可靠性的仿真分析方法。重点采用序贯蒙特卡洛模拟法对配电网进行长时间段的状态抽样与统计,通过模拟系统元件的故障与修复过程,评估配电网的关键可靠性指标,如系统停电频率、停电持续时间、负荷点可靠性等。该方法能够有效处理复杂网络结构与设备时序特性,提升评估精度,适用于含分布式电源、电动汽车等新型负荷接入的现代配电网。文中提供了完整的Matlab实现代码与案例分析,便于复现和扩展应用。; 适合人群:具备电力系统基础知识和Matlab编程能力的高校研究生、科研人员及电力行业技术人员,尤其适合从事配电网规划、运行与可靠性分析相关工作的人员; 使用场景及目标:①掌握序贯蒙特卡洛模拟法在电力系统可靠性评估中的基本原理与实现流程;②学习如何通过Matlab构建配电网仿真模型并进行状态转移模拟;③应用于含新能源接入的复杂配电网可靠性定量评估与优化设计; 阅读建议:建议结合文中提供的Matlab代码逐段调试运行,理解状态抽样、故障判断、修复逻辑及指标统计的具体实现方式,同时可扩展至不同网络结构或加入更多不确定性因素进行深化研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值