《汇编语言》第13章 int指令

news2025/6/7 3:44:24

中断信息可以来自 CPU 的内部和外部,当 CPU 的内部有需要处理的事情发生的时候,将产生需要马上处理的中断信息,引发中断过程。在第12章中,我们讲解了中断过程和两种内中断的处理。

这一章中,我们讲解另一种重要的内中断,由int指令引发的中断。

13.1 int指令

int指令的格式为:int n,n为中断类型码,它的功能是引发中断过程。CPU执行int n指令,相当于引发一个n号中断的中断过程,执行过程如下。

(1)取中断类型码n;

(2)标志寄存器入栈,IF=0,TF=0;

(3)CS、IP入栈;

(4)(IP)=(n*4),(CS)=(n*4+2)。从此处转去执行n号中断的中断处理程序。

可以在程序中使用int指令调用任何一个中断的中断处理程序。例如,下面的程序:

;p12_1.asm    13.1 int指令
;调用0号中断指令测试

assume cs:code 
code segment 
start:	mov ax,0b800h 
			mov es,ax 
			mov byte ptr es:[12*160+40*2],'!'
			int 0

code ends
end start

运行调试

这个程序在Windows2000中的DOS方式下执行时,将在屏幕中间显示一个"!",然后显示“Divide overflow”后返回到系统中。“!”是我们编程显示的,而“Divide overflow"是哪里来的呢?我们的程序中又没有做除法,不可能产生除法溢出。

程序是没有做除法,但是在结尾使用了int0指令。CPU执行int0指令时,将引发中断过程,执行0号中断处理程序,而系统设置的0号中断处理程序的功能是显示"Divide overflow”,然后返回到系统。

可见,int指令的最终功能和call指令相似,都是调用一段程序。

一般情况下,系统将一些具有一定功能的子程序,以中断处理程序的方式提供给应用程序调用。我们在编程的时候,可以用 int 指令调用这些子程序。当然,也可以自己编写一些中断处理程序供别人使用。以后,我们可以将中断处理程序简称为中断例程。

13.2 编写供应用程序调用的中断例程

前面,我们已经编写过中断0的中断例程了,现在我们讨论可以供应用程序调用的中断例程的编写方法。下面通过两个问题来讨论。

问题一:编写、安装中断7ch的中断例程。

功能:求一word型数据的平方。

参数:(ax)=要计算的数据。

返回值:dx、ax中存放结果的高16位和低16位。

应用举例:求2*3456^2。

;p13_2.asm  
assume cs:code 
code segment 
start:	mov ax,3456				;(ax)=3456
			int 7ch						;调用中断7ch的中断例程,计算ax中的数据的平方
			add ax,ax 
			adc dx,dx 				;dx:ax存放结果,将结果乘以2 
			mov ax,4c00h 
			int 21h 

code ends 
end start 
 

分析一下,我们要做以下3部分工作。

(1)编写实现求平方功能的程序;

(2)安装程序,将其安装在0:200处;

(3)设置中断向量表,将程序的入口地址保存在7ch表项中,使其成为中断7ch的中断例程。

安装程序如下。

;p13_2i.asm  p13_2的中断程序
;安装程序如下。

assume cs:code 
code segment 
start:		mov ax,cs 
			mov ds,ax 
			mov si,offset sqr									;设置ds:si指向源地址
			mov ax,0
			mov es,ax 
			mov di,200h 										;设置ds:si指向目的地址
			mov cx,offset sqrend - offset sqr 			;设置cx为传输长度
			cld														;设置传输方向为正
			rep movsb 
				
			mov ax,0
			mov es,ax 
			mov word ptr es:[7ch*4],200h 
			mov word ptr es:[7ch*4+2],0
				
			mov ax,4c00h
			int 21h
				
sqr:		mul ax 
			iret 
				
sqrend:		nop 

code ends 
end start 


运行调试;

先执行p13_2i.exe中断程序,再执行debug p13_2.exe

执行主程程序的int 7c指令后,跳转到中断程序

注意,在中断例程 sqr 的最后,要使用 iret 指令。用汇编语法描述,iret 指令的功能为:

pop IP

pop cs

popf

CPU 执行 int 7ch 指令进入中断例程之前,标志寄存器、当前的 CS 和 IP 被压入栈中,在执行完中断例程后,应该用iret指令恢复int 7ch执行前的标志寄存器和CS、IP的值,从而接着执行应用程序。

int指令和iret指令的配合使用与call指令和ret指令的配合使用具有相似的思路。

问题二:编写、安装中断7ch的中断例程。

功能:将一个全是字母,以0结尾的字符串,转化为大写。

参数:ds:si指向字符串的首地址。

应用举例:将 data段中的字符串转化为大写。

;p13_3.asm  

assume cs:code 
data segment 
		db 'conversation',0
data ends 

code segment 
start:		mov ax,data 
				mov ds,ax 
				mov si,0
				int 7ch

				mov ax,4c00h
				int 21h 
				
code ends 
end start 
 

安装程序如下。

;p13_3i.asm  
;问题二的安装程序,先执行安装程序,再执行主程序

assume cs:code 
code segment 
				;安装程序
start:		mov ax,cs 
				mov ds,ax 
				mov si,offset capital 
				mov ax,0
				mov es,ax 
				mov di,200h										;把中断处理程序安装到0: 200位置
				mov cx,offset capitalend-offset capital 
				cld 
				rep movsb 
				;设置向量表
				mov ax,0
				mov es,ax 
				mov word ptr es:[7ch*4],200h
				mov word ptr es:[7ch*4+2],0
				mov ax,4c00h
				int 21h 
				
capital:		push cx 
				push si 
		
change:	mov cl,[si]
				mov ch,0
				jcxz ok 
				and byte ptr [si],11011111b				;小写转大写
				inc si 
				jmp short change
				
		ok:	pop si 
				pop cx 
				iret 
				
capitalend:	nop 

code ends 
end start 



 

运行调试:

先执行安装程序,再执行主程序:

执行int 7c指令,跳转到中断程序执行小写转大写功能

小写转大写

执行iret指令回到主程序

在中断例程capital中用到了寄存器si和cx,编写中断例程和编写子程序的时候具有同样的问题,就是要避免寄存器的冲突。应该注意例程中用到的寄存器的值的保存和恢复。

13.3 对 int、iret和栈的深入理解

问题:用7ch中断例程完成loop指令的功能。

loop s 的执行需要两个信息,循环次数和到 s 的位移,所以,7ch 中断例程要完成loop 指令的功能,也需要这两个信息作为参数。我们用 cx 存放循环次数,用 bx 存放位移。

应用举例:在屏幕中间显示80个'!'。

;p13_4.asm   

assume cs:code 
code segment 									;   CS:  IP的值
start:		mov ax,0b800h 						;076A: 0000
			mov es,ax 							;076A: 0003
			mov di,160*12						;076A: 0005
			;设置从标号se到标号s的转移位移
			mov bx,offset s - offset se 	    ;076A: 0008    bx=000E-0017=FFF7
			mov  cx,20							;076A: 000B
				
		s: mov byte ptr es:[di],'!'				;076A: 000E     s标号的偏移地址
												;076A: 000F
			add di,2							;076A: 0012
			int 7ch 							;076A: 0015     如果(cx)≠0,转移到标号s处
			;push psw, push cs, push ip 
		se:	nop 								;076A: 0017		se标号的偏移地址
	
			mov ax,4c00h 						;076A: 0018
			int 21h 							;076A: 001B
				
code ends 
end start
 

在上面的程序中,用int7ch调用7ch中断例程进行转移,用bx传递转移的位移。

分析:为了模拟loop指令,7ch中断例程应具备下面的功能。

(1) dec cx;

(2)如果(cx)≠0,转到标号s处执行,否则向下执行。

下面我们分析7ch中断例程如何实现到目的地址的转移。

(1)转到标号s显然应设(CS)=标号s的段地址,(IP)=标号s的偏移地址。

(2)那么,中断例程如何得到标号s的段地址和偏移地址呢?

int 7ch 引发中断过程后,进入 7ch中断例程,在中断过程中,当前的标志寄存器、CS和IP都要压栈,此时压入的CS和IP中的内容,分别是调用程序的段地址(可以认为是标号s的段地址)和int 7ch后一条指令的偏移地址(即标号se的偏移地址)。

可见,在中断例程中,可以从栈里取得标号s的段地址和标号se的偏移地址,而用标号se的偏移地址加上bx中存放的转移位移就可以得到标号s的偏移地址。

(3)现在知道,可以从栈中直接和间接地得到标号s的段地址和偏移地址,那么如何用它们设置CS:IP呢?

可以利用iret指令,我们将栈中的se的偏移地址加上bx中的转移位移,则栈中的se 的偏移地址就变为了s的偏移地址。我们再使用iret指令,用栈中的内容设置CS、IP,从而实现转移到标号s处。

7ch中断例程如下。

;p13_4i.asm  13.3 对 int、iret和栈的深入理解
;问题:用7ch中断例程完成loop指令的功能。
;;安装程序,先执行安装程序,再执行主程序

assume cs:code 
code segment 
			;安装程序
start:		mov ax,cs
			mov ds,ax 
			mov si,offset lp
			mov ax,0
			mov es,ax 
			mov di,200h 						;把中断处理程序安装到0: 200位置
			mov cx,offset lpend-offset lp
			cld 
			rep movsb 
			;设置向量表
			mov ax,0
			mov es,ax 
			mov word ptr es:[7ch*4],200h 
			mov word ptr es:[7ch*4+2],0
			mov ax,4c00h 
			int 21h 
			;中断程序
		lp:	push bp 
			mov bp,sp 
			dec cx 
			jcxz lpret 
			add ss:[bp+2],bx
				
lpret:		pop bp 
			iret 
				
lpend:		nop 

code ends
end start

运行调试,先执行中断程序 ,再调试主程序

执行int 7ch指令后,跳转到中断程序

此时的栈结构为

接着继续往下执行

当执行完add ss:[bp+2],bx,栈中的IP的值为000E,结构如下:

继续执行,iret指令执行完后,从栈中取相应的数据,然后跳转到s标号处理执行

然后继续循环执行,直到cx为0时,中止循环。

因为要访问栈,使用了bp,在程序开始处将 bp 入栈保存,结束时出栈恢复。当要修改栈中se的偏移地址的时候,栈中的情况为:栈顶处是bp原来的数值,下面是se的偏移地址,再下面是s的段地址,再下面是标志寄存器的值。而此时,bp中为栈顶的偏移地址,所以((ss)*16+(bp)+2)处为se的偏移地址,将它加上bx中的转移位移就变为s的偏移地址。最后用iret出栈返回,CS:IP即从标号s处开始执行指令。

如果(cx)=0,则不需要修改栈中 se 的偏移地址,直接返回即可。CPU 从标号 se 处向下执行指令。

检测点13.1

(1)在上面的内容中,我们用 7ch 中断例程实现 loop 的功能,则上面的 7ch 中断例程所能进行的最大转移位移是多少?    FFFF

(2)用7ch中断例程完成jmp near ptrs指令的功能,用bx向中断例程传送转移位移。

应用举例:在屏幕的第12行,显示data段中以0结尾的字符串。

;jc13_1.asm    检测点13.1

assume cs:code 
data segment 
	db 'conversation',0
data ends 
code segment 
start:	mov ax,data 
			mov ds,ax 
			mov si,0
			mov ax,0b800h
			mov es,ax 
			mov di,12*160
		s: cmp byte ptr ds:[si],0
			je ok 									;如果是0跳出循环
			mov al,ds:[si]
			mov es:[di],al 
			mov al,02h
			mov es:[di+1],al 					;设置颜色
			inc si 
			add di,2
			mov bx,offset s - offset ok		;设置从标号ok到标号s的转移位移
			int 7ch 									;转移到标号s处
	ok:	mov ax,4c00h 
			int 21h 

code ends 
end start 

中断程序代码:

;jc13_1i.asm    检测点13.1的中断程序

assume cs:code 
code segment 
			;安装程序
start:	mov ax,cs
			mov ds,ax 
			mov si,offset lp 
			mov ax,0
			mov es,ax 
			mov di,200h							;把中断处理程序安装到0: 200h位置
			mov cx,offset lpend - offset lp 
			cld 
			rep movsb 
			;设置向量表
			mov ax,0
			mov es,ax 
			mov word ptr es:[7ch*4],200h 
			mov word ptr es:[7ch*4+2],0
			mov ax,4c00h 
			int 21h 
			
	lp:	push bp 
			mov bp,sp 
			add ss:[bp+2],bx
			pop bp 
			iret 											;跳转到s标号处理
			
			mov ax,4c00h 
			int 21h 
			
lpend:	nop 
 
code ends 
end start 

编译运行:

13.4 BIOS和DOS所提供的中断例程

在系统板的ROM中存放着一套程序,称为BIOS(基本输入输出系统),BIOS中主要包含以下几部分内容。

(1)硬件系统的检测和初始化程序;

(2)外部中断(第15章中进行讲解)和内部中断的中断例程;

(3)用于对硬件设备进行I/O操作的中断例程;

(4)其他和硬件系统相关的中断例程。

操作系统 DOS 也提供了中断例程,从操作系统的角度来看,DOS 的中断例程就是操作系统向程序员提供的编程资源。

BIOS和DOS在所提供的中断例程中包含了许多子程序,这些子程序实现了程序员在编程的时候经常需要用到的功能。程序员在编程的时候,可以用 int 指令直接调用 BIOS 和DOS提供的中断例程,来完成某些工作。

和硬件设备相关的DOS中断例程中,一般都调用了BIOS的中断例程。

13.5 BIOS和DOS中断例程的安装过程

前面的课程中,我们都是自己编写中断例程,将它们放到安装程序中,然后运行安装程序,将它们安装到指定的内存区中。此后,别的应用程序才可以调用。

而 BIOS 和 DOS 提供的中断例程是如何安装到内存中的呢?我们下面讲解它们的安装过程。

(1)开机后,CPU一加电,初始化(CS)=0FFFH,(IP)=0,自动从FFF:0单元开始执行程序。FFF:0 处有一条转跳指令,CPU执行该指令后,转去执行 BIOS 中的硬件系统检测和初始化程序。

(2)初始化程序将建立 BIOS 所支持的中断向量,即将 BIOS 提供的中断例程的入口地址登记在中断向量表中。注意,对于BIOS所提供的中断例程,只需将入口地址登记在中断向量表中即可,因为它们是固化到ROM中的程序,一直在内存中存在。

(3)硬件系统检测和初始化完成后,调用 int 19h 进行操作系统的引导。从此将计算机交由操作系统控制。

(4)DOS 启动后,除完成其他工作外,还将它所提供的中断例程装入内存,并建立相应的中断向量。

检测点13.2

判断下面说法的正误:

(1)我们可以编程改变 FFFF:0处的指令,使得CPU不去执行BIOS中的硬件系统检测和初始化程序。

答:FFFF:0处的内容无法改变,他是ROM只读的。

(2)int 19h中断例程,可以由DOS提供。

答:错误,先调用 int 19h后启动DOS

13.6 BIOS中断例程应用

下面我们举几个例子,来看一下BIOS中断例程的应用。

int 10h 中断例程是 BIOS 提供的中断例程,其中包含了多个和屏幕输出相关的子程序。

一般来说,一个供程序员调用的中断例程中往往包括多个子程序,中断例程内部用传递进来的参数来决定执行哪一个子程序。BIOS和DOS提供的中断例程,都用ah来传递内部子程序的编号。

下面看一下int 10h中断例程的设置光标位置功能。

mov ah,2;置光标

mov bh,0;第0页

mov dh,5;dh中放行号

mov dl,12;d1中放列号

int 10h

(ah)=2表示调用第10h号中断例程的2号子程序,功能为设置光标位置,可以提供光标所在的行号(80*25 字符模式下:0~24)、列号(80*25 字符模式下:0~79),和页号作为参数。

(bh)=0,(dh)=5,(dl)=12,设置光标到第0页,第5行,第12列。

bh中页号的含义:内存地址空间中,B8000H~BFFFH共32kB的空间,为80*25彩色字符模式的显示缓冲区。一屏的内容在显示缓冲区中共占4000个字节。

显示缓冲区分为8页,每页 4KB(≈4000B),显示器可以显示任意一页的内容。一般情况下,显示第0页的内容。也就是说,通常情况下,B8000H~B8F9FH中的4000个字节的内容将出现在显示器上。

再看一下int 10h中断例程的在光标位置显示字符功能。

mov ah,9;在光标位置显示字符

mov al,'a';字符

mov bl,7;颜色属性

mov bh,0;第0页

mov cx,3;字符重复个数

int 10h

(ah)=9表示调用第10h号中断例程的9号子程序,功能为在光标位置显示字符,可以提供要显示的字符、颜色属性、页号、字符重复个数作为参数。

bl中的颜色属性的格式如下。

可以看出,和显存中的属性字节的格式相同。

编程:在屏幕的5行12列显示3个红底高亮闪烁绿色的'a'。

;p13_5.asm   13.6 BIOS中断例程应用
;编程:在屏幕的5行12列显示3个红底高亮闪烁绿色的'a'。

assume cs:code 
code segment 
start:	mov ah,2						;设置光标
		mov bh,0						;第0页
		mov dh,5						;dh中放行号
		mov dl,12						;dl中放列号
		int 10h
			
		mov ah,9						;在光标位置显示字符
		mov al,'a'						;字符
		mov bl,11001010b		        ;颜色属性
		mov bh,0						;第0页
		mov cx,3						;字符重复个数
		int 10h
			
		mov ax,4c00h 
		int 21h 
code ends 
end start 
 

注意,闪烁的效果必须在全屏DOS方式下才能看到。

13.7 DOS中断例程应用

int 2lh中断例程是DOS提供的中断例程,其中包含了DOS提供给程序员在编程时调用的子程序。

我们前面一直使用的是int 2lh中断例程的4ch号功能,即程序返回功能,如下:

mov ah,4ch;程序返回

mov al,0;返回值

int 21h

(ah)=4ch表示调用第21h号中断例程的4ch号子程序,功能为程序返回,可以提供返回值作为参数。

我们前面使用这个功能的时候经常写做:

mov ax,4c00h

int 21h

我们看一下int 2lh中断例程在光标位置显示字符串的功能:

ds:dx指向字符串;要显示的字符串需用"S"作为结束符

mov ah,9;功能号9,表示在光标位置显示字符串

int 21h

(ah)=9表示调用第21h号中断例程的9号子程序,功能为在光标位置显示字符串,可以提供要显示字符串的地址作为参数。

编程:在屏幕的5行12列显示字符串“Welcome to masm!”。

;p13_6.asm   13.7 DOS中断例程应用

assume cs:code 

data segment 
	db 'Welcome to masm','$'
data ends 

code segment 
start:	mov ah,2						;设置光标
		mov bh,0						;第0页
		mov dh,5						;dh中放行号
		mov dl,12 					    ;dl中放列号
		int 10h 
			
		mov ax,data 
		mov ds,ax 
		mov dx,0						;ds:dx指向字符串的首地址data:0
		mov ah,9
		int 21h 
			
		mov ax,4c00h 
		int 21h 
code ends 
end start 

运行结果:

上述程序在屏幕的5行12列显示字符串“Welcome to masm!”,直到遇见“$”(“$”本身并不显示,只起到边界的作用)。

如果字符串比较长,遇到行尾,程序会自动转到下一行开头处继续显示;如果到了最后一行,还能自动上卷一行。

DOS 为程序员提供了许多可以调用的子程序,都包含在int 21h中断例程中。我们这里只对原理进行了讲解,对于DOS提供的所有可调用子程序的情况,读者可以参考相关的书籍。

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

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

相关文章

Redis实战-基于redis和lua脚本实现分布式锁以及Redission源码解析【万字长文】

前言: 在上篇博客中,我们探讨了单机模式下如何通过悲观锁(synchronized)实现"一人一单"功能。然而,在分布式系统或集群环境下,单纯依赖JVM级别的锁机制会出现线程并发安全问题,因为这…

计算机网络 : 应用层自定义协议与序列化

计算机网络 : 应用层自定义协议与序列化 目录 计算机网络 : 应用层自定义协议与序列化引言1. 应用层协议1.1 再谈协议1.2 网络版计算器1.3 序列化与反序列化 2. 重新理解全双工3. socket和协议的封装4. 关于流失数据的处理5. Jsoncpp5.1 特性5.2 安装5.3…

Python Day42 学习(日志Day9复习)

补充:关于“箱线图”的阅读 以下图为例 浙大疏锦行 箱线图的基本组成 箱体(Box):中间的矩形,表示数据的中间50%(从下四分位数Q1到上四分位数Q3)。中位线(Median)&#…

CMake在VS中使用远程调试

选中CMakeLists.txt, 右键-添加调试配置-选中"C\C远程windows调试" 之后将 aunch.vs.json文件改为如下所示: CMake在VS中使用远程调试时,Launch.vs.json中远程调试设置 ,远程电脑开启VS专用的RemoteDebugger {"version": "0.2.1","defaul…

《图解技术体系》How Redis Architecture Evolves?

Redis架构的演进经历了多个关键阶段,从最初的内存数据库发展为支持分布式、多模型和持久化的高性能系统。以下为具体演进路径: 单线程模型与基础数据结构 Redis最初采用单线程架构,利用高效的I/O多路复用(如epoll)处…

一文速通Python并行计算:12 Python多进程编程-进程池Pool

一文速通 Python 并行计算:12 Python 多进程编程-进程池 Pool 摘要: 在Python多进程编程中,Pool类用于创建进程池,可并行执行多个任务。通过map、apply等方法,将函数和参数分发到子进程,提高CPU利用率&…

Web前端之原生表格动态复杂合并行、Vue

MENU 效果公共数据纯原生StyleJavaScript vue原生table 效果 原生的JavaScript原生table null 公共数据 const list [{id: "a1",title: "第一列",list: [{id: "a11",parentId: "a1",title: "第二列",list: [{ id: "…

『uniapp』把接口的内容下载为txt本地保存 / 读取本地保存的txt文件内容(详细图文注释)

目录 预览效果思路分析downloadTxt 方法readTxt 方法 完整代码总结 欢迎关注 『uniapp』 专栏,持续更新中 欢迎关注 『uniapp』 专栏,持续更新中 预览效果 思路分析 downloadTxt 方法 该方法主要完成两个任务: 下载 txt 文件:通…

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 时间事件处理部分)

揭秘高效存储模型与数据结构底层实现 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 时间事件:serverCron函数更新服务器时间缓存更新LRU时钟-lruclock更新服务器每秒执行命令次…

【DAY40】训练和测试的规范写法

内容来自浙大疏锦行python打卡训练营 浙大疏锦行 知识点: 彩色和灰度图片测试和训练的规范写法:封装在函数中展平操作:除第一个维度batchsize外全部展平dropout操作:训练阶段随机丢弃神经元,测试阶段eval模式关闭drop…

el-select 实现分页加载,切换也数滚回到顶部,自定义高度

el-select 实现分页加载&#xff0c;切换也数滚回到顶部&#xff0c;自定义高度 1.html <el-form-item label"俱乐部&#xff1a;" prop"club_id" label-width"120px"><el-select :disabled"Boolean(match_id)" style"w…

Langchaine4j 流式输出 (6)

Langchaine4j 流式输出 大模型的流式输出是指大模型在生成文本或其他类型的数据时&#xff0c;不是等到整个生成过程完成后再一次性 返回所有内容&#xff0c;而是生成一部分就立即发送一部分给用户或下游系统&#xff0c;以逐步、逐块的方式返回结果。 这样&#xff0c;用户…

学习经验分享【40】目标检测热力图制作

目标检测热力图在学术论文&#xff08;尤其是计算机视觉、深度学习领域&#xff09;中是重要的可视化分析工具和论证辅助手段&#xff0c;可以给论文加分不少。主要作用一是增强论文的可解释性与说服力&#xff1a;论文中常需解释模型 “如何” 或 “为何” 检测到目标&#xf…

C#里与嵌入式系统W5500网络通讯(3)

有与W5500通讯时,需要使用下面的寄存器: PHYCFGR (W5500 PHY Configuration Register) [R/W] [0x002E] [0b10111XXX] PHYCFGR configures PHY operation mode and resets PHY. In addition, PHYCFGR indicates the status of PHY such as duplex, Speed, Link. 这张表格详细…

用OpenNI2获取奥比中光Astra Pro输出的深度图(win,linux arm64 x64平台)

搞了一个奥比中光Astra Pro&#xff0c;想在windows平台&#xff0c;和linux rk3588 &#xff08;香橙派&#xff0c;ubuntu2404,debian)上获取深度信息&#xff0c;之前的驱动下载已经不好用了,参考如下 Astra 3D相机选型建议 - 知乎https://zhuanlan.zhihu.com/p/594485674 …

Unity VR/MR开发-VR设备与适用场景分析

视频讲解链接&#xff1a;【XR马斯维】VR/MR设备与适用场景分析&#xff1f;【UnityVR/MR开发教程--入门】_游戏热门视频

Linux: network: switch:arp cache更新规则 [chatGPT]

文章目录 介绍概念普通包带有不同的mac,是否更新arp cache?普通包带有相同的mac,是否刷新 aging timeswitch是否会主动学习介绍 关于arp cache在switch侧的行为。有很多问题需要理解。 概念 HP L3 - IP Services Configuration Guide 文档里有写:dynamic arp entry的解说…

Java网络编程API 1

Java中的网络编程API一共有两套&#xff1a;一套是UDP协议使用的API&#xff1b;另一套是TCP协议使用的API。这篇文章我们先来介绍UDP版本的API&#xff0c;并尝试来写一个回显服务器&#xff08;接收到的请求是什么&#xff0c;返回的响应就是什么&#xff09;。 UDP数据报套…

兰亭妙微 | 医疗软件的界面设计能有多专业?

从医疗影像系统到手术机器人控制界面&#xff0c;从便携式病原体检测设备到多平台协同操作系统&#xff0c;兰亭妙微为众多医疗设备研发企业&#xff0c;打造了兼具专业性与可用性的交互界面方案。 我们不仅做设计&#xff0c;更深入理解医疗场景的实际需求&#xff1a; 对精…

前端原生构建交互式进度步骤组件(Progress Steps)

在现代网页设计中&#xff0c;进度步骤&#xff08;Progress Steps&#xff09; 是一种常见的 UI 模式&#xff0c;常用于引导用户完成注册流程、多步表单、教程或任何需要分步骤操作的场景。本文将带你从零开始构建一个美观且功能完整的 “进度步骤”组件&#xff0c;并详细讲…