《汇编语言》第13章 int指令
中断信息可以来自 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 0code 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)=3456int 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,0mov es,ax mov di,200h ;设置ds:si指向目的地址mov cx,offset sqrend - offset sqr ;设置cx为传输长度cld ;设置传输方向为正rep movsb mov ax,0mov es,ax mov word ptr es:[7ch*4],200h mov word ptr es:[7ch*4+2],0mov ax,4c00hint 21hsqr: 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,0int 7chmov ax,4c00hint 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,0mov es,ax mov di,200h ;把中断处理程序安装到0: 200位置mov cx,offset capitalend-offset capital cld rep movsb ;设置向量表mov ax,0mov es,ax mov word ptr es:[7ch*4],200hmov word ptr es:[7ch*4+2],0mov ax,4c00hint 21h capital: push cx push si change: mov cl,[si]mov ch,0jcxz ok and byte ptr [si],11011111b ;小写转大写inc si jmp short changeok: 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: 0000mov es,ax ;076A: 0003mov di,160*12 ;076A: 0005;设置从标号se到标号s的转移位移mov bx,offset s - offset se ;076A: 0008 bx=000E-0017=FFF7mov cx,20 ;076A: 000Bs: mov byte ptr es:[di],'!' ;076A: 000E s标号的偏移地址;076A: 000Fadd di,2 ;076A: 0012int 7ch ;076A: 0015 如果(cx)≠0,转移到标号s处;push psw, push cs, push ip se: nop ;076A: 0017 se标号的偏移地址mov ax,4c00h ;076A: 0018int 21h ;076A: 001Bcode 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,csmov ds,ax mov si,offset lpmov ax,0mov es,ax mov di,200h ;把中断处理程序安装到0: 200位置mov cx,offset lpend-offset lpcld rep movsb ;设置向量表mov ax,0mov es,ax mov word ptr es:[7ch*4],200h mov word ptr es:[7ch*4+2],0mov ax,4c00h int 21h ;中断程序lp: push bp mov bp,sp dec cx jcxz lpret add ss:[bp+2],bxlpret: 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.1assume cs:code
data segment db 'conversation',0
data ends
code segment
start: mov ax,data mov ds,ax mov si,0mov ax,0b800hmov es,ax mov di,12*160s: cmp byte ptr ds:[si],0je ok ;如果是0跳出循环mov al,ds:[si]mov es:[di],al mov al,02hmov es:[di+1],al ;设置颜色inc si add di,2mov 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,csmov ds,ax mov si,offset lp mov ax,0mov es,ax mov di,200h ;把中断处理程序安装到0: 200h位置mov cx,offset lpend - offset lp cld rep movsb ;设置向量表mov ax,0mov es,ax mov word ptr es:[7ch*4],200h mov word ptr es:[7ch*4+2],0mov ax,4c00h int 21h lp: push bp mov bp,sp add ss:[bp+2],bxpop 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 10hmov ah,9 ;在光标位置显示字符mov al,'a' ;字符mov bl,11001010b ;颜色属性mov bh,0 ;第0页mov cx,3 ;字符重复个数int 10hmov 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:0mov ah,9int 21h mov ax,4c00h int 21h
code ends
end start
运行结果:
上述程序在屏幕的5行12列显示字符串“Welcome to masm!”,直到遇见“$”(“$”本身并不显示,只起到边界的作用)。
如果字符串比较长,遇到行尾,程序会自动转到下一行开头处继续显示;如果到了最后一行,还能自动上卷一行。
DOS 为程序员提供了许多可以调用的子程序,都包含在int 21h中断例程中。我们这里只对原理进行了讲解,对于DOS提供的所有可调用子程序的情况,读者可以参考相关的书籍。
相关文章:

《汇编语言》第13章 int指令
中断信息可以来自 CPU 的内部和外部,当 CPU 的内部有需要处理的事情发生的时候,将产生需要马上处理的中断信息,引发中断过程。在第12章中,我们讲解了中断过程和两种内中断的处理。 这一章中,我们讲解另一种重要的内中断…...

Redis实战-基于redis和lua脚本实现分布式锁以及Redission源码解析【万字长文】
前言: 在上篇博客中,我们探讨了单机模式下如何通过悲观锁(synchronized)实现"一人一单"功能。然而,在分布式系统或集群环境下,单纯依赖JVM级别的锁机制会出现线程并发安全问题,因为这…...
Ubuntu崩溃修复方案
当Ubuntu系统崩溃时,可依据崩溃类型(启动失败、运行时崩溃、完全无响应)选择以下修复方案。以下方法综合了官方推荐和社区实践,按操作风险由低到高排序: 一、恢复模式(Recovery Mode) 适用场景:系统启动卡顿、登录后黑屏、软件包损坏等。 操作步骤: …...

计算机网络 : 应用层自定义协议与序列化
计算机网络 : 应用层自定义协议与序列化 目录 计算机网络 : 应用层自定义协议与序列化引言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)处…...
从零搭建到 App Store 上架:跨平台开发者使用 Appuploader与其他工具的实战经验
对于很多独立开发者或小型团队来说,开发一个 iOS 应用并不难,真正的挑战在于最后一步:将应用成功上架到 App Store。尤其是当你主要在 Windows 或 Linux 系统上开发,缺乏苹果设备和 macOS 环境时,上架流程往往变得繁琐…...
Spring Cloud 2025 正式发布啦
文章目录 一、版本兼容性二、Spring Cloud Gateway 重大更新1、新增功能1.1 Function & Stream 处理器集成1.2 Bucket4j 限流器支持 2、重要弃用2.1. WebClientRouting 基础设施2.2. 模块和启动器重命名 3、破坏性变更3.1 X-Forwarded-* 头部默认禁用3.2 配置受信任代理:3.…...

一文速通Python并行计算:12 Python多进程编程-进程池Pool
一文速通 Python 并行计算:12 Python 多进程编程-进程池 Pool 摘要: 在Python多进程编程中,Pool类用于创建进程池,可并行执行多个任务。通过map、apply等方法,将函数和参数分发到子进程,提高CPU利用率&…...
相机Camera日志分析之二十五:高通相机Camx 基于预览1帧的process_capture_request四级日志分析详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:相机Camera日志分析之二十四:高通相机Camx 基于预览1帧的process_capture_request三级日志分析详解 ok 这一篇我们开始讲: 相机Camera日志分析之二十五:高通相机Camx 基于预览1帧的process_capture_…...
React从基础入门到高级实战:React 实战项目 - 项目一:在线待办事项应用
React 实战项目:在线待办事项应用 欢迎来到本 React 开发教程专栏的第 26 篇!在之前的 25 篇文章中,我们从 React 的基础概念逐步深入到高级技巧,涵盖了组件、状态、路由和性能优化等核心知识。这一次,我们将通过一个…...
云部署实战:基于AWS EC2/Aliyun ECS与GitHub Actions的CI/CD全流程指南
在当今快速迭代的软件开发环境中,云部署与持续集成/持续交付(CI/CD)已成为现代开发团队的标配。本文将详细介绍如何利用AWS EC2或阿里云ECS结合GitHub Actions构建高效的CI/CD流水线,从零开始实现自动化部署的全过程。 最近挖到一个宝藏级人工智能学习网…...
golang 如何定义一种能够与自身类型值进行比较的Interface
定义一种具有比较能力的类型是一种常见需求,比如对一组相同类型的值进行排序,就需要进行两两比较,那么在Go语言中有没有办法定义一种具有比较能力的Interface,实现该接口的类型都具备比较能力呢,最常见最容易的办法是定…...

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 文件:通…...
C/C++ 面试复习笔记(2)
C语言如何实现快速排序算法? 答案:快排是一种分治算法,选择一个基准元素,将数据划分成两部分,然后递归排序 补充: void quick_sort(int arr[], int start, int end) {//判断是否需要排序if (start > …...
宝马集团推进数字化转型:强化生产物流与财务流程,全面引入SAP现代架构
2025年6月,宝马集团宣布在生产物流与财务流程领域取得重大数字化成果。这些进展标志着集团全球范围内采用基于云的新型SAP架构进入关键阶段,旨在提升运营效率、透明度和AI能力,为未来工业发展奠定技术基础。 一、生产物流全球数字化部署 宝…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 时间事件处理部分)
揭秘高效存储模型与数据结构底层实现 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 时间事件:serverCron函数更新服务器时间缓存更新LRU时钟-lruclock更新服务器每秒执行命令次…...

【DAY40】训练和测试的规范写法
内容来自浙大疏锦行python打卡训练营 浙大疏锦行 知识点: 彩色和灰度图片测试和训练的规范写法:封装在函数中展平操作:除第一个维度batchsize外全部展平dropout操作:训练阶段随机丢弃神经元,测试阶段eval模式关闭drop…...
C语言 标准I/O函数全面指南
C标准I/O函数全面指南 本指南详细介绍了C语言中用于文件操作的标准输入/输出函数,包括单字符I/O、字符串I/O、格式化I/O、块I/O以及文件光标操作。每个部分包含函数定义、使用说明和实用示例,适合学习、复习以及博客发布。内容采用清晰的Markdown格式&a…...

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

Langchaine4j 流式输出 (6)
Langchaine4j 流式输出 大模型的流式输出是指大模型在生成文本或其他类型的数据时,不是等到整个生成过程完成后再一次性 返回所有内容,而是生成一部分就立即发送一部分给用户或下游系统,以逐步、逐块的方式返回结果。 这样,用户…...
Jenkins:自动化流水线的基石,开启 DevOps 新时代
从持续集成到持续交付的全流程自动化工具 一、什么是 Jenkins? Jenkins 是一款开源的 自动化服务器,专注于持续集成(CI)和持续交付(CD)。它通过插件化的架构支持几乎所有的开发、运维和测试工具ÿ…...

学习经验分享【40】目标检测热力图制作
目标检测热力图在学术论文(尤其是计算机视觉、深度学习领域)中是重要的可视化分析工具和论证辅助手段,可以给论文加分不少。主要作用一是增强论文的可解释性与说服力:论文中常需解释模型 “如何” 或 “为何” 检测到目标…...

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,想在windows平台,和linux rk3588 (香橙派,ubuntu2404,debian)上获取深度信息,之前的驱动下载已经不好用了,参考如下 Astra 3D相机选型建议 - 知乎https://zhuanlan.zhihu.com/p/594485674 …...

Unity VR/MR开发-VR设备与适用场景分析
视频讲解链接:【XR马斯维】VR/MR设备与适用场景分析?【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一共有两套:一套是UDP协议使用的API;另一套是TCP协议使用的API。这篇文章我们先来介绍UDP版本的API,并尝试来写一个回显服务器(接收到的请求是什么,返回的响应就是什么)。 UDP数据报套…...