跟我一起写个虚拟机 .Net 7(三)- 安装LC-3 模拟器和编译器

news2024/11/20 13:40:20

LC-3(Little Computer 3) 是一门教学用的虚拟计算机模型,主要是为了方便学生了解简单化的计算机结构。

主要想学习《计算机系统概论》上的案例,基本都是通过LC-3 模拟器和LC-3编译器来的,所以,把安装的方式学习一下。

这两个软件偏向于在Unix中安装,我这边没有那个环境,所以,我会把编译器安装在Ubuntu中,模拟器采用windows版的安装到本地。

官网地址

https://highered.mheducation.com/sites/0072467509/student_view0/lc-3_simulator_lab_manual.html

下载 C 3 Simulator Windows Version 3.01 (385.0K)

这个主要是模拟器,windows直接运行

htps://highered.mheducation.com/sites/dl/free/0072467509/104652/LC301.exe

下载后,双击运行

进入到安装目录

Simulate.exe 模拟器


模拟器只能打开.obj目标文件

LC3Edit.exe 编译器

可以通过以下三种方式(二进制,16进制,汇编)写代码逻辑,输出目标文件等结构


用汇编来写还是相对来讲简单的,写完之后,点击3,汇编的箭头按钮,就会保存在一个文件里,输出以下文件,当然,报错的情况下,它会提示错误。

  1. 123.asm 它是汇编文件本身
  2. 123.bin 它是二进制文件
  3. 123.hex 它是十六进制的文件
  4. 123.lst 它是程序的列表文件
  5. 123.sym 它是创建汇编的符号表
  6. 123.obj 目标文件,需要Simulate.exe 模拟器打开

下载 C to LC-3 Compiler (369.0K)

https://highered.mheducation.com/sites/dl/free/0072467509/104652/lcc.zip

解压后如下:


大概有这些东西

根据README描述,需要gcc 和 wish 和 flex ,我这边直接安装flex就会安装gcc了。

然后在当前目录执行命令

chmod +x configure
sudo apt install flex 
./configure

然后,就会显示下边这个,就成功make了,然后,开始执行安装命令

make
make install

make 执行完

make install 执行完

这个时候就会在当前文件夹下,新增一个install的文件夹,其中 lcc就是编译器了

可以通过 lcc 直接执行来看看帮助信息

./lcc

可以看到命令还是挺全的

编译C语言文件

cd 到目标路径下

cd /root/lcc-1.3/install/

然后创建一个c语言的程序,如下

int main()
{
    int a=1;
    int b=2;
    int c=a+b;
    printf("data:%d",c);
    return 0;
}

执行编译命令,就会生成a.asm文件,竟然有4KB大小

lcc main.c

最后可以看到很长的lc3的汇编(a.asm)

.Orig x3000
INIT_CODE
LEA R6, #-1
ADD R5, R6, #0
ADD R6, R6, R6
ADD R6, R6, R6
ADD R6, R6, R5
ADD R6, R6, #-1
ADD R5, R5, R5
ADD R5, R6, #0
LD R4, GLOBAL_DATA_POINTER
LD R7, GLOBAL_MAIN_POINTER
jsrr R7
HALT

GLOBAL_DATA_POINTER .FILL GLOBAL_DATA_START
GLOBAL_MAIN_POINTER .FILL main
;;;;;;;;;;;;;;;;;;;;;;;;;;;;main;;;;;;;;;;;;;;;;;;;;;;;;;;;;
main
ADD R6, R6, #-2
STR R7, R6, #0
ADD R6, R6, #-1
STR R5, R6, #0
ADD R5, R6, #-1

ADD R6, R6, #-3
ADD R7, R4, #12
ldr R7, R7, #0
str R7, R5, #0
ADD R7, R4, #11
ldr R7, R7, #0
str R7, R5, #-1
ldr R7, R5, #0
ldr R3, R5, #-1
add R7, R7, R3
str R7, R5, #-2
ldr R7, R5, #-2
ADD R6, R6, #-1
STR R7, R6, #0
ADD R7, R4, #3
ADD R6, R6, #-1
STR R7, R6, #0
ADD R0, R4, #1
LDR R0, R0, #0
jsrr R0
LDR R7, R6, #0
ADD R6, R6, #1
ADD R7, R4, #2
ldr R7, R7, #0
lc3_L1_main
STR R7, R5, #3
ADD R6, R5, #1
LDR R5, R6, #0
ADD R6, R6, #1
LDR R7, R6, #0
ADD R6, R6, #1
RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;	void printf(const char *format, ...)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

PRINTF_PERCENT .FILL -37
PRINTF_C .FILL -99
PRINTF_D .FILL -100
PRINTF_S .FILL -115
PRINTF_B .FILL -98
PRINTF_O .FILL -111
PRINTF_X .FILL -120
PRINTF_ASCII .FILL 48 		;postive ascii value of '0'
.FILL 49
.FILL 50
.FILL 51
.FILL 52
.FILL 53
.FILL 54
.FILL 55
.FILL 56
.FILL 57
.FILL 65        ;A
.FILL 66
.FILL 67
.FILL 68
.FILL 69
.FILL 70
PRINTF_MINUS .FILL 45  
PRINTF_BUF .BLKW 18
 

lc3_printf
ADD R6, R6, #-2
STR R7, R6, #0		;return address
ADD R6, R6, #-1
STR R5, R6, #0
ADD R5, R6, #-1

ADD R6, R6, #-1
STR R4, R6, #0

ADD R5, R5, #4		;cheating with the bp (no longer bp)
LDR R4, R5, #0		;got addr of format string


PRINTF_LOOP	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

LDR R0, R4, #0

ADD R0, R0, #0		;End of string? (0x0000)
BRz PRINTF_DONE

ADD R2, R0, #0
LD R1, PRINTF_PERCENT
ADD R2, R2, R1
BRnp PRINTF_CHAR		

ADD R4, R4, #1
LDR R0, R4, #0
;is it %c?
ADD R2, R0, #0
LD R3, PRINTF_C
ADD R2, R2, R3
BRnp PRINTF_CHECKSTR
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;%c
ADD R5, R5, #1
LDR R0, R5, #0

PRINTF_CHAR
OUT

ADD R4, R4, #1
BRnzp PRINTF_LOOP

PRINTF_CHECKSTR
;is it %s?
ADD R2, R0, #0
LD R7, PRINTF_S
ADD R2, R2, R7
BRnp PRINTF_CHECKDEC		

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;%s

ADD R5, R5, #1
LDR R0, R5, #0
PUTS

ADD R4, R4, #1
BRnzp PRINTF_LOOP

PRINTF_CHECKDEC
;is it %d?
ADD R2, R0, #0
LD R7, PRINTF_D
ADD R2, R2, R7
;BRnp PRINTF_ERROR
BRnp PRINTF_CHECKHEX

AND R2, R2, #0
ADD R2, R2, #-10		;going to divide by 10 by using sub loop
BRnzp PRINTF_NUM

PRINTF_CHECKHEX

ADD R2, R0, #0
LD R7, PRINTF_X
ADD R2, R2, R7
BRnp PRINTF_CHECKOCT

AND R2, R2, #0
ADD R2, R2, #-16		;going to divide by 10 by using sub loop
BRnzp PRINTF_NUM

PRINTF_CHECKOCT

ADD R2, R0, #0
LD R7, PRINTF_O
ADD R2, R2, R7
BRnp PRINTF_CHECKBIN

AND R2, R2, #0
ADD R2, R2, #-8		;going to divide by 10 by using sub loop
BRnzp PRINTF_NUM

PRINTF_CHECKBIN

ADD R2, R0, #0
LD R7, PRINTF_B
ADD R2, R2, R7
BRnp PRINTF_ERROR

AND R2, R2, #0
ADD R2, R2, #-2		;going to divide by 10 by using sub loop
;BRnzp PRINTF_NUM



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;%d
PRINTF_NUM

LEA R7, PRINTF_BUF
ADD R7, R7, #15 
ADD R7, R7, #1 

;AND R2, R2, #0
;ADD R2, R2, #-10		;going to divide by 10 by using sub loop

ADD R5, R5, #1			;acquire the binary number
LDR R0, R5, #0

ADD R0, R0, #0
BRzp PRINTF_DECPOS 

NOT R0, R0				;make num positive for sub loop
ADD R0, R0, #1

PRINTF_DECPOS

AND R3, R3, #0
ADD R3, R3, #-1

PRINTF_DIVLOOP
ADD R3, R3, #1			;num/10 
ADD R0, R0, R2			;R0 = num % 10 - 10
BRzp PRINTF_DIVLOOP

ADD R3, R3, #0
BRz PRINTF_LASTDIGIT

;LD R1, PRINTF_ASCII
;ADD R1, R1, R0
;NOT R2, R2
;ADD R1, R1, R2 
;ADD R1, R1, #1
;NOT R2, R2
;;;;;ADD R1, R1, #10
;STR R1, R7, #0
;ADD R7, R7, #-1			;stored ascii value of one digit

LEA R1, PRINTF_ASCII
ADD R1, R1, R0
NOT R2, R2
ADD R1, R1, R2 
ADD R1, R1, #1
NOT R2, R2
LDR R1, R1, #0
STR R1, R7, #0
ADD R7, R7, #-1			;stored ascii value of one digit

ADD R0, R3, #0			;num/10

BRnzp PRINTF_DECPOS

PRINTF_LASTDIGIT

;LD R1, PRINTF_ASCII
;ADD R1, R1, R0
;ADD R1, R1, #10
;STR R1, R7, #0

LEA R1, PRINTF_ASCII
ADD R1, R1, R0
NOT R2, R2
ADD R1, R1, R2 
ADD R1, R1, #1
NOT R2, R2
LDR R1, R1, #0
STR R1, R7, #0			;stored ascii value of highest order digit

LDR R0, R5, #0
ADD R0, R0, #0
BRzp PRINTF_DECSTRING

LD R0, PRINTF_MINUS		;num was negative
ADD R7, R7, #-1
STR R0, R7, #0			;stored ascii value negative sign

PRINTF_DECSTRING		;print the calculated string
ADD R0, R7, #0
PUTS

ADD R4, R4, #1
BRnzp PRINTF_LOOP

PRINTF_ERROR
PRINTF_DONE

LDR R4, R6, #0		;restore R4
ADD R6, R6, #1

LDR R5, R6, #0		;restore bp
ADD R6, R6, #1

LDR R7, R6, #0		;restore ret addr
ADD R6, R6, #1

RET

GLOBAL_DATA_START
L1_main .FILL lc3_L1_main
printf .FILL lc3_printf
L5_main .FILL #0
L4_main .STRINGZ "data:%d"
L3_main .FILL #2
L2_main .FILL #1
.END

终于看到完整能输出lc3汇编的方式了。

错误情况处理

//Cannot locate make binary. 那就是缺少 make 库
sudo apt install make -y

直接通过LC-3编辑器执行这个 a.asm 文件,会发现有这样的错误


目前查找的资料是说它未发现这些符号。

可执行的汇编

.ORIG		X3000
		AND	R0,R0,#0;
		AND	R1,R1,#0;
		AND	R2,R2,#0;
		AND	R3,R3,#0;
		AND 	R4,R4,#0;
		AND 	R5,R5,#0;
		AND 	R6,R6,#0;
		AND	R7,R7,#0;初始化寄存器

		ADD	R5,R5,#15;
		ADD	R5,R5,#1;外层循环16次
		LD	R2,SCORE2;指向存成绩空间
OUTLOOP		ADD	R6,R6,#15;内层循环15次
		LD	R3,SCORE;指针指向成绩	
		LDR	R0,R3,#0;假设第一位为最大值,存入R0
		NOT	R0,R0;
		ADD	R0,R0,#1;R0最大值求补数
LOOP1		ADD	R3,R3,#1;指针指向下一个数字	
		LDR	R1,R3,#0;R1存入对比数字
		ADD	R4,R0,R1;R1>R0,将R0设为新的最大值R1,否则继续
		BRp	SWAP;将最大值设置为当前查询数
		ADD	R6,R6,#-1;
		BRz	GOOUT;内层循环结束,跳出二层循环
		BRnzp	LOOP1;
SWAP		AND	R0,R0,#0;
		NOT	R1,R1;
		ADD	R1,R1,#1;R1最大值求补数
		ADD	R0,R0,R1;	
		ADD	R6,R6,#-1;
		BRz	GOOUT;内层循环结束,跳出二层循环	
		BRnzp	LOOP1;
GOOUT		LD	R7,SCORE;遍历成绩表,与最大值相等的数据设置为-1。
LOOP2		LDR	R1,R7,#0;
		ADD	R1,R1,R0;
		BRz	SET;
		ADD	R7,R7,#1;
		ADD	R1,R1,#0;
		BRnp	LOOP2;
SET		LD	R1,MINUS1;删除当前轮最大值(设置为-1)
		STR	R1,R7,#0;
		NOT	R0,R0;
		ADD	R0,R0,#1;R0为当前轮最大值
		ADD	R2,R2,#1;
		STR	R0,R2,#0;
		ADD	R7,R7,#1;
		ADD	R5,R5,#-1;
		BRp	OUTLOOP;	
		BRZ	END;


END		AND	R0,R0,#0;
		AND	R1,R1,#0;
		AND	R2,R2,#0;
		AND	R3,R3,#0;
		AND 	R4,R4,#0;
		AND 	R5,R5,#0;
		AND 	R6,R6,#0;
		AND	R7,R7,#0;初始化寄存器


	
		ADD	R1,R1,#4;遍历1-4名成绩,判断是否为A
		LD	R2,SCORE2;将指针指向第一名成绩
		ADD	R2,R2,#1;
		LD	R6,EIGHTYFIVE;R6存储-85

LOOP		LDR	R0,R2,#0;R0存储当前查询成绩
		ADD	R4,R0,R6;检查当前成绩是否大于绝对分数85分,若大于R5=1,小于R5=0
		BRzp	OVERABSOLUTE;
		AND	R5,R5,#0;
		BRnzp	NEXT2;
OVERABSOLUTE	AND	R5,R5,#0;
		ADD	R5,R5,#1;
NEXT2		ADD	R5,R5,#-1;R5等于1,条件满足,为A,等于0,条件不满足,进行下一轮测试
		BRn	NO;
YES		ADD	R7,R7,#1;R7记录A等人数,加一
		ADD	R2,R2,#1;指针指向下一位成绩
		ADD	R1,R1,#-1;循环次数减一
		BRp	LOOP;
		BRz	END1;
NO		ADD	R2,R2,#1;指针指向下一位成绩
		ADD	R1,R1,#-1;循环次数减一
		BRp	LOOP;
		BRz	END1;
END1		STI	R7,GRADEA;将R7数据存入x4100



		LD	R2,SCORE2;
		ADD	R2,R2,#1;
		ADD	R2,R2,R7;将指针指向第N+1名成绩
		NOT	R7,R7;
		ADD	R7,R7,#1;
		ADD	R7,R7,#8;
		AND	R1,R1,#0;
		ADD	R1,R1,R7;遍历N+1-8名成绩,判断是否为B,循环次数8-n存入R1		
		AND	R6,R6,#0;
		LD	R6,SEVENTYFIVE;R6存储-75
		AND	R7,R7,#0;人数统计归零

LOOP0		LDR	R0,R2,#0;R0存储当前查询成绩
		ADD	R4,R0,R6;检查当前成绩是否大于绝对分数75分,若大于R5=1,小于R5=0
		BRzp	OVERABSOLUTE1;
		AND	R5,R5,#0;
		BRnzp	NO1;
OVERABSOLUTE1	AND	R5,R5,#0;
		ADD	R5,R5,#1;
NEXT4		ADD	R5,R5,#-1;R5等于1,条件满足,为B,等于0,条件不满足,默认为C
		BRn	NO1;
YES1		ADD	R7,R7,#1;R7记录A等人数,加一
		ADD	R2,R2,#1;指针指向下一位成绩
		ADD	R1,R1,#-1;循环次数减一
		BRp	LOOP0;
		BRz	END2;
NO1		ADD	R2,R2,#1;指针指向下一位成绩
		ADD	R1,R1,#-1;循环次数减一
		BRp	LOOP0;
		BRz	END2;
END2		STI	R7,GRADEB;将R7数据存入x4101
 
HALT;
SCORE		.fill	x3200;
SCORE2		.FILL	X3FFF;
GRADEA		.fill	x4100;
GRADEB		.fill	x4101;
EIGHTYFIVE	.fill	#-85;
SEVENTYFIVE	.fill	#-75;
MINUS1		.FILL	#-1;
.END;

可以先执行这个汇编和借用其中的方式方法。我大致看了,它没有使用直接编译的方式,而是直接手写汇编实现。

里面很多C语言里的函数都找不到标签,所以,相当于一些函数类的,无法搞定。对于学习也是够的了。

总结

至此 LC-3 模拟器和编辑器以及编译器都安装完了,还挺麻烦的,找了很多资料,相对而言,还是有点老了。

引用

参考了《深圳大学CS本科课程资源共享》,感谢大佬的作业。

https://github.com/Alex-Shen1121/SZU_Learning_Resource

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1111974.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring源码解析——事务的回滚和提交

正文 上一篇文章讲解了获取事务,并且通过获取的connection设置只读、隔离级别等,这篇文章讲解剩下的事务的回滚和提交。最全面的Java面试网站 回滚处理 之前已经完成了目标方法运行前的事务准备工作,而这些准备工作最大的目的无非是对于程…

【1024程序员节】代码写诗(C++版)

#include <bits/stdc.h> #include <sal.h> using namespace std;class Sky { //天上 public:_Success_(return false) bool Sea(_In_opt_ int* Run) { //不复回int sea *Run;return false;} private:str…

倒计时 2 天!本周六,Apache Doris 年度技术盛会相约北京!

峰会官网已上线&#xff0c;最新议程请关注&#xff1a;doris-summit.org.cn 即刻报名 Doris Summit 是 Apache Doris 社区一年一度的技术盛会&#xff0c;由飞轮科技联合 Apache Doris 社区的众多开发者、企业用户和合作伙伴共同发起&#xff0c;专注于传播推广开源 OLAP 与实…

简单了解一下:Node全局对象和事件监听和触发

Node的全局对象&#xff0c;就是整个应用都能引用的对象。Node本身内置了多个全局变量、全局对象和全局函数。 全局变量有两个&#xff1a;__filename和__dirname&#xff0c; __filename&#xff1a;表示当前正在执行的脚本文件名&#xff1b; __dirname&#xff1a;当前脚本…

【前端学习】—Promise基本知识(十六)

【前端学习】—Promise基本知识&#xff08;十六&#xff09; 一、class和function的区别 相同点&#xff1a;都可以用作构造函数不同点&#xff1a;class不可以使用call apply bind的方式来改变它的执行上下文 二、Promise 定义&#xff1a;Promise是异步编程的一种解决方案…

【OpenCV实现图片以及视频的读取、显示、保存以及绘图函数】

文章目录 图片视频从文件读取视频保存一个视频绘图函数 图片 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个广泛应用于计算机视觉和图像处理领域的开源库。它提供了丰富的图像处理工具和算法&#xff0c;使得开发者能够轻松实现各种图像处理任务。…

办鹿uniapp小程序(一)

一、项目初始化 1. appid 》 公司给你 wxc82730a0fc15e28a 2. 开发者身份 》 公司给你添加 小程序官网&#xff1a;小程序 管理》成员管理》项目成员 1、 uniapp ui组件 &#xff08;uView&#xff09; 如果采用npm安装方式在 小程序端不生效 1.1 采用插件的形式安装&#xf…

pycharm操作git、前后端项目上传到gitee

pycharm操作git 之前用命令做的所有操作&#xff0c;使用pychrm点点就可以完成 克隆代码 上方工具栏Git ⇢ \dashrightarrow ⇢ Clone ⇢ \dashrightarrow ⇢ 填写地址&#xff08;http、ssh&#xff09; 提交到暂存区&#xff0c;提交到版本库&#xff0c;推送到远程 直接…

Nmap端口服务 之 CentOS7 关于启动Apache(httpd)服务、telnet服务、smtp服务、ftp服务、sftp服务

Nmap端口服务 之 CentOS7 关于启动Apache(httpd)服务、telnet服务、smtp服务、ftp服务、sftp服务 一. CentOS7 安装配置SFTP服务器详解一、SFTP简介二、关闭防火墙三、安装SSH服务在CentOS7中,sftp只是ssh的一部分,所以采用yum来安装ssh服务即可1. 查看是否已经安装了ssh2.…

promise返回值多层嵌套

实际上打印的是promise的res不是api接口返回值 因为用apifox测试开发服务器的代理接口&#xff0c;和不加代理测试返回值相同&#xff1a; http://localhost:3030是vue开发代理。 "D:\code\jeecg\vue\job-app-master\manifest.json" "proxy" : {"/ap…

嵌入式实习难找怎么办?

今日话题&#xff0c;嵌入式实习难找怎么办&#xff1f;个人建议如果找不到实习机会&#xff0c;可以回归学习嵌入式所需的知识&#xff0c;积累项目经验或者回顾之前参与过的项目&#xff0c;将它们整理复盘。如果还有时间&#xff0c;可以再尝试找实习&#xff0c;如果找不到…

【CANoe】Canoe的 I/O功能-以VN1640A为例

文章目录 一、配置CH5 IO通道二、Trace窗口勾选系统变量三、实例1、数字量输入2、模拟量输入设置电压值的读取周期为100ms在Trace窗口中显示当前电压 3、控制电源是否输出电压到外部电路3.1CAPL脚本编写3.2实操3.3补充&#xff1a;数字输出功能DOUT(Output OD)的使用 四、CANoe…

【算法练习Day23】 复原 IP 地址子集子集 II

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 复原 IP 地址子集子集 II总…

Unity之ShaderGraph如何模拟水波实现顶点波动

前言 今天我们实现类似水波纹的顶点波动效果 如下所示&#xff1a; 主要节点 Tilling And Offset&#xff1a;分别通过输入Tiling和Offset平铺和偏移输入UV的值。这通常用于细节贴图和随时间滚动的纹理。 Gradient Noise&#xff1a;根据输入UV生成梯度或Perlin噪声。生成…

骰子涂色(Cube painting, UVa 253)rust解法

输入两个骰子&#xff0c;判断二者是否等价。每个骰子用6个字母表示&#xff0c;如图4-7所示。 例如rbgggr和rggbgr分别表示如图4-8所示的两个骰子。二者是等价的&#xff0c;因为图4-8&#xff08;a&#xff09;所示的骰子沿着竖直轴旋转90之后就可以得到图4-8&#xff08;b&a…

民宿管理系统应该怎么选择?民宿系统有哪些作用?

开民宿的朋友都知道&#xff0c;虽然民宿少则5-6间房&#xff0c;多则100-200间房&#xff0c;体量看起来不大&#xff0c;但是管理起来却需要费很多精力。房态最主要的有5种&#xff1a;在住、预定、待打扫、待入住、空房&#xff0c;假如是5间房&#xff0c;那就是25种房态&a…

Unity3D 拖拽赋值组件与通过Find赋值组件的优点与缺点详解

Unity3D是一款流行的游戏开发引擎&#xff0c;提供了丰富的功能和工具&#xff0c;使开发人员能够轻松创建高质量的游戏。在Unity3D中&#xff0c;我们经常需要通过拖拽赋值组件或通过Find赋值组件来实现不同对象之间的交互。本文将详细介绍这两种方法的优点和缺点&#xff0c;…

Systemverilog断言介绍(一)

3 Introduction to systemverilog assertions 为了利用形式验证&#xff08;FV&#xff09;的力量来证明设计的正确性&#xff0c;首先必须有一种表达您的设计是否正确的方式。最流行的方法是通过property来实现&#xff0c;使用SystemVerilog Assertions&#xff08;SVA&#…

Halcon 3D相关案例分享

文章目录 一、预处理1、平滑滤波算子说明平滑效果图 二、检测1、外观缺陷检测算子说明缺陷检测效果图 2、点云边界框算子说明边界框效果图 3、平面度检测算子说明平面度效果图 三、量测1、高度测量算子说明测量效果图 2、体积测量算子说明测量效果图 四、配准1、根据模型配准算…

【算法|动态规划No.23】leetcode376. 摆动序列

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…