【汇编语言】标志寄存器(二) —— 标志位驱动的计算:ADC、SBB 和 CMP 的巧妙应用
前言
📌
汇编语言是很多相关课程(如数据结构、操作系统、微机原理)的重要基础。但仅仅从课程的角度出发就太片面了,其实学习汇编语言可以深入理解计算机底层工作原理,提升代码效率,尤其在嵌入式系统和性能优化方面有重要作用。此外,它在逆向工程和安全领域不可或缺,帮助分析软件运行机制并增强漏洞修复能力。
本专栏的汇编语言学习章节主要是依据王爽老师的《汇编语言》来写的,和书中一样为了使学习的过程容易展开,我们采用以8086CPU为中央处理器的PC机来进行学习。
文章目录
- 前言
- 1. abc 指令
- 1.1 功能介绍
- 1.2 举例说明
- 1.3 为什么要提供这样的指令?
- 1.3.1 CF值的含义
- 1.3.2 示例演示
- 1.3.3 得出结论
- 1.4 例1——对大的数据进行相加
- 1.4.1 问题描述
- 1.4.2 问题的分析与解答
- 1.5 例2——对更大的数据进行相加
- 1.5.1 问题描述
- 1.5.2 问题的分析与解答
- 1.6 例3——对更大更大的数据进行相加
- 1.6.1 题目描述
- 1.6.2 问题的分析与解决
- 1.6.3 思考一个问题
- 2. sbb 指令
- 2.1 功能介绍
- 2.2 举例说明
- 3. cmp 指令
- 3.1 功能介绍
- 3.2 举例说明
- 3.3 不同比较的结果
- 3.3.1 正向来判断标志位
- 3.3.2 反向来判断两个值的大小
- 3.4 cmp 进行有符号数比较
- 3.4.1 相等与否的情况
- 3.4.2 探究小于的情况
- 3.4.2.1 常规情况
- 3.4.2.2 溢出时的情况
- 3.4.2.3 举例说明
- 3.5 举例与总结各种结果的判断
- 结语
1. abc 指令
1.1 功能介绍
adc是带进位加法指令 ,它利用了CF位上记录的进位值。
-
格式:adc 操作对象1,操作对象2
-
功能:操作对象1=操作对象1+操作对象2+CF
-
比如指令:
adc ax,bx
实现的功能是:(ax)=(ax)+(bx)+CF
1.2 举例说明
(1)
mov ax,2
mov bx,1
sub bx,ax ;发生了借位
adc ax,1
执行后,(ax)=4。
adc执行时,相当于计算: (ax)+1+CF=2+1+1=4。
(2)
mov ax,1
add ax,ax
adc ax,3
执行后,(ax)=5。
adc执行时,相当于计算: (ax)+3+CF=2+3+0=5。
(3)
mov al,98H
add al,al
adc al,3
执行后,(ax)=34H。
adc执行时,相当于计算: (ax)+3+CF=30H+3+1=34H。
可以看出,adc指令比add指令多加了一个CF位的值。
1.3 为什么要提供这样的指令?
为什么要加上CF 的值呢?CPU为什么要提供这样一条指令呢?
1.3.1 CF值的含义
先来看一下CF的值的含义。
在执行 adc 指令的时候加上的 CF 的值的含义,由 adc 指令前面的指令决定的,也就是说,关键在于所加上的CF值是被什么指令设置的。
显然,如果CF 的值是被sub指令设置的,那么它的含义就是借位值;如果是被add指令设置的,那么它的含义就是进位值。
1.3.2 示例演示
我们来看一下两个数据:0198H和0183H如何相加的:
可以看出,加法可以分两步来进行:
(1)低位相加;
(2)高位相加再加上低位相加产生的进位值。
下面的指令和add ax,bx具有相同的结果:
add al,bl
adc ah,bh
1.3.3 得出结论
看来CPU提供 adc 指令的目的,就是来进行加法的第二步运算的。
adc指令和add指令相配合就可以对更大的数据进行加法运算。
1.4 例1——对大的数据进行相加
1.4.1 问题描述
编程计算1EF000H+201000H,结果放在ax(高16位)和bx(低16位)中。
1.4.2 问题的分析与解答
因为两个数据的位数都大于16,用add指令无法进行计算。
我们将计算分两步进行,先将低16位相加,然后将高16位和进位值相加。
程序如下。
mov ax,001EH
mov bx,0F000H
add bx,1000H
adc ax,0020H
adc 指令执行后,也可能产生进位值,所以也会对CF位进行设置。由于有这样的功我们就可以对任意大的数据进行加法运算。
1.5 例2——对更大的数据进行相加
1.5.1 问题描述
编程计算1EF0001000H+2010001EF0H,结果放在ax(高16位),bx(次高16位),cx(低16位)中。
1.5.2 问题的分析与解答
计算分3步进行:
(1)先将低16位相加,完成后,CF中记录本次相加的进位值;
(2)再将次高16位和CF(来自低16位的进位值)相加,完成后,CF中记录本次相加的进位值;
(3)最后高16位和CF(来自次高16位的进位值)相加,完成后,CF 中记录本次相加的进位值。
程序如下。
mov ax,001EH
mov bx,0F000H
mov cx,1000H
add cx,1EF0H
adc bx,1000H
adc ax,0020H
1.6 例3——对更大更大的数据进行相加
1.6.1 题目描述
下面我们,编写一个子程序,对两个128位数据进行相加。
-
名称:add128
-
功能:两个128位数据进行相加
-
参数:ds:si指向存储第一个数的内存空间,因数据为128位,所以需要8个字单元,由低地址单元到高地址单元依次存放 128位数据由低到高的各个字。运算结果存储在第一个数的存储空间中。
-
ds:di指向存储第二个数的内存空间
1.6.2 问题的分析与解决
程序如下。
add128: push axpush cxpush sipush disub ax,ax ;将CF设置为0s: mov ax,[si]adc ax,[di]mov [si],axinc siinc siinc diinc diloop spop dipop sipop cxpop axret code ends
end start
1.6.3 思考一个问题
inc和loop指令不影响CF位,上面的程序中,能不能将4个inc指令,用
add si,2
add si,2
来取代?
这想都不用想,肯定是不能嘛。
如果用add来取代的画,改变了CF记录的进制位,会影响下一次更高位相加的结果。
2. sbb 指令
2.1 功能介绍
sbb是带借位减法指令,它利用了CF位上记录的借位值。
-
格式:sbb 操作对象1,操作对象2
-
功能:操作对象1=操作对象1–操作对象2–CF
-
比如:
sbb ax,bx
实现功能: (ax) = (ax) – (bx) – CF
sbb 指令执行后,将对CF进行设置。
利用 sbb 指令可以对任意大的数据进行减法运算。
2.2 举例说明
比如,计算003E1000H-00202000H,结果放在ax,bx中,程序如下:
mov bx,1000H
mov ax,003EH
sub bx,2000H
sub ax,0020H
sbb和adc是基于同样的思想设计的两条指令,在应用思路上和adc类似。在这里,我们就不再进行过多的讨论。
通过学习这两条指令,我们可以进一步领会一下标志寄存器CF位的作用和意义。
3. cmp 指令
3.1 功能介绍
cmp 是比较指令,功能相当于减法指令,只是不保存结果。
cmp 指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。
-
格式:cmp 操作对象1,操作对象2
-
功能:计算操作对象1–操作对象2。但并不保存结果,仅仅根据计算结果对标志寄存器进行设置。
-
比如:
cmp ax,ax
做(ax)–(ax)的运算,结果为0,但并不在ax中保存,仅影响flag的相关各位。指令执行后:ZF=1,PF=1,SF=0,CF=0,OF=0。
3.2 举例说明
下面的指令:
mov ax,8
mov bx,3
cmp ax,bx
执行后: (ax) = 8,ZF=0,PF=1,SF=0,CF=0,OF=0。
3.3 不同比较的结果
3.3.1 正向来判断标志位
我们通过cmp 指令执行后,相关标志位的值就可以看出比较的结果。
例如:cmp ax,bx
现在我们可以看出比较指令的设计思路
即:通过做减法运算,影响标志寄存器,标志寄存器的相关位记录了比较的结果。
3.3.2 反向来判断两个值的大小
反过来看上面的例子。
指令 cmp ax,bx
的逻辑含义是比较 ax和 bx 中的值,如果执行后:
3.4 cmp 进行有符号数比较
同 add、sub 指令一样,CPU 在执行cmp指令的时候,也包含两种含义:进行无符号数运算和进行有符号数运算。
所以利用cmp指令可以对无符号数进行比较,也可以对有符号数进行比较。
上面所讲的是用cmp进行无符号数比较时,相关标志位对比较结果的记录。
下面我们再来看一下如果用cmp来进行有符号数比较时,CPU用哪些标志位对比较结果进行记录。
3.4.1 相等与否的情况
我们以cmp ah,bh
为例进行说明:
所以,我们根据cmp指令执行后ZF的值,就可以知道两个数据是否相等。
3.4.2 探究小于的情况
我们继续看,如果(ah)<(bh)则可能发生什么情况呢?
3.4.2.1 常规情况
对于有符号数运算,在 (ah)<(bh) 情况下,(ah)-(bh)显然可能引起SF=1,即结果为负。
比如:
(ah) = 1,(bh) = 2:则(ah)-(bh)=0FFH,0FFH 为 -1 的补码,因为结果为负,所以SF=1。
(ah)=0FEH,(bx)=0FFH:则(ah)-(bh)=(-2)-(-1)=0FFH,因为结果为负,所以SF=1。
通过上面的例子,我们是不是可以得到这样的结论:cmp 操作对象1,操作对象2 指令执行后,SF=1,就说明操作对象1<操作对象2?
当然不是。
3.4.2.2 溢出时的情况
我们再来看两个例子。
(ah)=22H,(bh)=0A0H:则(ah)-(bh)=34-(-96)=130=82H,82H是-126的补码,所以SF=1。
这里虽然SF=1,但是并不能说明(ah)<(bh),因为显然34>-96。
两个有符号数A 和B 相减,得到的是负数,那么可以肯定A<B,这个思路没有错误;
关键在于我们根据什么来断定得到的是一个负数。CPU将 cmp 指令得到的结果记录在flag的相关标志位中。 我们可以根据指令执行后,相关标志位的值来判断比较的结果。
单纯地考察SF 的值不可能知道结果的正负。因为SF 记录的只是可以在计算机中存放的相应位数的结果的正负。
比如add ah, al
执行后,SF记录的是ah中的8位二进制信息所表示的数据的正负。
cmp ah,bh
执行后,sf记录的是(ah)-(bh)所得到的8位结果数据的正负,虽然这个结果没有在我们能够使用的寄存器或内存单元中保存,但是在指令执行的过程中,它暂存在CPU内部的暂存器中。
所得到的相应结果的正负,并不能说明,运算所应该得到的结果的正负。
这是因为在运算的过程中可能发生溢出。如果有这样的情况发生,那么,SF的值就不能说明任何问题。
3.4.2.3 举例说明
比如:
mov ah,22H
mov bh,0A0H
sub ah,bh
结果 sf=1,运算实际得到的结果是(ah)=82H,但是在逻辑上,运算所应该得到的结果是:34-(-96)=130。就是因为130这个结果作为一个有符号数超出了-128~127这个范围,在ah中不能表示,而ah中的结果被CPU当作有符号数解释为-126。
而sf被用来记录这个实际结果的正负,所以sf=1。但sf=1不能说明在逻辑上,运算所得的正确结果的正负。
又比如:
mov ah,08AH
mov bh,070h
cmp ah,bh
结果 sf=0,运算(ah)-(bh)实际得到的结果是1AH,但是在逻辑上,运算所应该得到的结果是:(-118)-112=-230。sf记录实际结果的正负,所以sf=0。但sf=0不能说明在逻辑上,运算所得的正确结果。
但是逻辑上的结果的正负,才是cmp指令所求的真正结果,因为我们就是要靠它得到两个操作对象的比较信息。所以cmp指令所作的比较结果,不是仅仅靠sf就能记录的,因为它只能记录实际结果的正负。
我们考虑一下,两种结果之间的关系,实际结果的正负,和逻辑上真正结果的正负,它们之间有多大的距离呢?从上面的分析中,我们知道,实际结果的正负,之所以不能说明逻辑上真正结果的正负,关键的原因在于发生了溢出。
如果没有溢出发生的话,那么实际结果的正负和逻辑上真正结果的正负就一致了。
所以,我们应该在考查SF(得知实际结果的正负)的同时考查OF(得知有没有溢出),就可以得知逻辑上真正结果的正负,同时就可以知道比较的结果。
3.5 举例与总结各种结果的判断
下面,我们以cmp ah,bh
为例,总结一下CPU执行cmp指令后,SF和OF的值是如何来说明比较的结果的。
(1)如果SF=1,而OF=0
OF=0,说明没有溢出,逻辑上真正结果的正负=实际结果的正负;
因SF=1,实际结果为负,所以逻辑上真正的结果为负,所以(ah)<(bh)。
(2)如果SF=1,而OF=1
OF=1,说明有溢出,逻辑上真正结果的正负≠实际结果的正负;
简单分析一下,就可以看出,如果因为溢出导致了实际结果为负,那么逻辑上真正的结果必然为正。这样,SF=1,OF = 1 ,说明了(ah)>(bh)。
(3)如果SF=0,而OF=1
OF=1 ,说明有溢出,逻辑上真正结果的正负≠实际结果的正负;
简单分析一下,就可以看出,如果因为溢出导致了实际结果为正,那么逻辑上真正的结果必然为负。这样,SF=0,OF = 1 ,说明了(ah)<(bh)。
(4)如果SF=0,而OF=0
OF=0,说明没有溢出,逻辑上真正结果的正负=实际结果的正负;
因SF=0,实际结果非负,所以逻辑上真正的结果必然非负。所以(ah)≥(bh)。
上面,我们深入讨论了cmp指令在进行有符号数和无符号数比较时,对flag 相关标志位的影响,和CPU如何通过相关的标志位来表示比较的结果。在学习中,要注意领会8086CPU这种工作机制的设计思想。实际上,这种设计思想对于各种处理机来说是普遍的。
结语
今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下。
也可以点点关注,避免以后找不到我哦!
Crossoads主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是作者前进的动力!
相关文章:
【汇编语言】标志寄存器(二) —— 标志位驱动的计算:ADC、SBB 和 CMP 的巧妙应用
前言 📌 汇编语言是很多相关课程(如数据结构、操作系统、微机原理)的重要基础。但仅仅从课程的角度出发就太片面了,其实学习汇编语言可以深入理解计算机底层工作原理,提升代码效率,尤其在嵌入式系统和性能优…...
Java刷题训练第一期
个人主页:手握风云 专栏:Java刷题训练营 1. 字符转ASCII码 问题描述:BoBo教KiKi字符常量或字符变量表示的字符在内存中以ASCII码形式存储。BoBo出了一个问题给KiKi,输入一个字符,输出该字符相应的ASCII码。 输入描述…...
【leetcode100】矩阵置零
1、题目描述 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用原地算法。 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]] 2、初始思路 2…...
【MySQL 进阶之路】SQL 优化
6.SQL 性能分析笔记 在现代数据库的高并发环境下,SQL 查询优化成为提升系统性能和响应速度的关键。本文将总结常见的 SQL 优化策略,包括插入优化、主键设计、排序优化、GROUP BY 优化等,帮助你在面对大规模数据时,做到高效查询和…...
本地部署开源趣味艺术画板Paint Board结合内网穿透跨网络多设备在线绘画
文章目录 前言1.关于Paint Board2.本地部署paint-board3.使用Paint Board4.cpolar内网穿透工具安装5.创建远程连接公网地址6.固定Paint Board公网地址 前言 大家好,是不是每次想要在电脑上画画时,都被那些笨重的专业绘图软件搞得头大如斗呢?…...
位图(bitmap)和布隆过滤器(bloom_filter)
1.位图-Bitmap 1.1问题引入 :给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中? 40亿个无符号整数大约16G的大小,用map或者set显然是无法支持海量数据的存储。那么我们能否不存储数…...
如何使用JDBC向数据库中插入日期数据???
在学习JDBC 的过程中很多小明有疑问在IDEA编辑器是如何插入一个日期类型的数据的,此篇一些方法希望可以帮助到你。 示例: import java.text.ParseException; import java.text.SimpleDateFormat; import java.sql.Date; import java.util.Scanner;publi…...
电子系统设计实验4 信号发生电路设计实验
一、实验目的 1. 掌握正弦信号发生器的设计方法。 2. 掌握方波发生器的设计方法。 二、实验内容及结果 1. 实验内容 设计一用于RFID读卡器测试的幅移键控发生器(ASK),其结构如图4-1所示。正弦振荡器输出频率为150kHz,幅度为3V…...
【Docker】Linux与Windows系统安装Docker+Docker上简单安装MySQL
一、Windows安装Docker 由于我在许多平台搜索Windows下安装Docker的方法,都提到了Win10家庭版无法直接安装Docker。个人电脑就是Win10家庭版,本着实践出真知的想法,个人在本机Win10家庭版实验结果为需要采用下述传统手动安装的办法ÿ…...
linux更新镜像源
镜像源地址 1 阿里云 http://mirrors.aliyun.com/ubuntu/ 2 网易源 http://mirrors.163.com/ubuntu/ 3 浙大源 http://mirrors.zju.edu.cn/ubuntu 4 中科大源 http://mirrors.ustc.edu.cn/ubuntu/ 5 清华源 http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ 更新镜像源 此处…...
HarmonyOS 5.0应用开发——UIAbility生命周期
【高心星出品】 文章目录 UIAbility组件创建AbilityUIAbility的生命周期Create状态WindowStageCreate状态Foreground和Background状态WindowStageWillDestroy状态Destroy状态 UIAbility组件 UIAbility组件是一种包含UI的应用组件,主要用于和用户交互。 UIAbility组…...
【Linux】C语言实现简易的Linux shell命令行解释器
我们要实现自己的简易的shel,先了解一下shell运行原理。 1. shell运行原理 shell从用户读入字符串"ls"。shell建立一个子进程,在子进程中运行ls程序并等待进程结束。 然后shell读取新的一行输入,建立一个新的子进程,在…...
构建个人大模型问答助手(基于Streamlit +gpt-4o/o1-mini):全面解析与实现
在当今人工智能迅猛发展的时代,构建一个个人化的大模型问答助手不仅能够提高工作效率,还能为日常生活带来便利。本篇博客将详细解析如何使用Python和Streamlit框架,结合OpenAI的API,搭建一个类似于ChatGPT的问答系统。我们将分步骤…...
10.请求拦截和响应拦截
文章目录 前言前景回顾拦截器应用请求拦截器响应拦截器测试响应拦截器原理 总结 前言 优秀的设计总是少不了丰富的扩展点, 比如spring可以自动装配, aop扩展, web模块也有拦截器, 甚至对servlet的过滤器都有封装; 再比如netty、doubbo等等都支持在数据流入流出都允许用户自定义…...
github使用SSH进行克隆仓库
SSH 密钥拉取git 查询密钥是否存在 s -al ~/.ssh这个文件夹下 known_hosts 就是存在的密钥文件 创建密钥文件 ssh-keygen -t rsa -b 4096 -C "testtt.com"-t rsa 是 rsa 算法加密 -b 是指定密钥的长度(以位为单位)。 -C 是用于给密钥添加注…...
如何成长为一名工程技术经理
https://medium.com/srivatsan-sridharan/how-to-grow-as-an-engineering-manager-687cad0bcac7 作为一名工程技术经理,你可能已经积累了丰富的团队管理经验,并展示了出色的项目管理、优先级管理和员工指导能力。然而,尽管如此,你…...
前端热门面试题目(四五六七)
1. 使用 import 时,Webpack 如何处理 node_modules 中的依赖? 依赖解析: Webpack 遇到 import 时,利用 resolve 配置查找依赖。如果是第三方依赖(node_modules),Webpack 会优先查找其主入口&…...
三、使用 Maven:命令行环境
文章目录 1. 第一节 实验一:根据坐标创建 Maven 工程1.1 Maven 核心概念:坐标1.2 实验操作1.3 Maven核心概念:POM1.4 Maven核心概念:约定的目录结构 2. 实验二:在 Maven 工程中编写代码2.1 主体程序2.2 测试程序 3. 执…...
深度学习在网络管理中的应用:智能化的新时代
网络管理在现代信息技术中占据着举足轻重的地位。随着网络规模的扩大和复杂性的增加,传统的网络管理手段已经无法满足日益增长的需求。深度学习作为人工智能的一个重要分支,通过其强大的数据处理和模式识别能力,为网络管理带来了新的契机。本…...
微信小程序日期格式化报错: iOS 下无法正常使用,iOS 只支持 “yyyy/MM/dd“、“yyyy/MM/dd HH:mm:ss“、“yyyy-
微信小程序日期格式化报错 报错内容解决办法 报错内容 at formatDate (http://127.0.0.1:10118/appservice-hotreload/pages/index/index.js?1;:103:18) new Date(“2024-11-27 15:05:23”) 在部分 iOS 下无法正常使用,iOS 只支持 “yyyy/MM/dd”、“yyyy/MM/dd H…...
第K大数求解方案
思想:利用快速排序的思想,从数组S中随机找出一个元素X,把数组分为两部分Sa和Sb。Sa中的元素大于等于X,Sb中元素小于X。这时有两种情况: 1. Sa中元素的个数小于k,则Sb中的第k-|Sa|个元素即为第k大数…...
【AI系统】MobileFormer
MobileFormer 在本文中,将介绍一种新的网络-MobileFormer,它实现了 Transformer 全局特征与 CNN 局部特征的融合,在较低的成本内,创造一个高效的网络。通过本节,让大家去了解如何将 CNN 与 Transformer 更好的结合起来…...
《重生之我学VTK》-- 基本介绍与相关概念
目录 简介 可视化模型 示例(圆锥体) VTK官方用户手册(中文C版)附末尾,有需要的直接划到末尾 简介 VTK(Visualization Toolkit)是一个开源的、跨平台的软件系统,主要用于三维计算机图…...
HTML笔记()蜘蛛纸牌之卡牌拖拽
效果 代码 <!DOCTYPE html> <html><head><style>body{display: flex;justify-content: center;align-items: center;height: 100vh;background-color: #2b2b2b;position: relative;}.card{/*设置卡牌的外观*/width: 150px;height: 200px;background-…...
记一次跑前端老项目的问题
记一次跑前端老项目的问题 一、前言二、过程1、下载依赖2、启动项目3、打包 一、前言 在一次跑前端老项目的时候,遇到了一些坑,这里记录一下。 二、过程 1、下载依赖 使用 npm install下载很久,然后给我报了个错 core-js2.6.12: core-js…...
041_Compare_Matrix_Squre_Sum_in_MATLAB中矩阵平方和的比较
矩阵平方和的计算 矩阵平方和的定义 矩阵平方和的定义是对矩阵中的每一个元素进行平方,然后求和。 对于一个矩阵 A A A,其平方和定义为: sum ∑ i 1 m ∑ j 1 n A ( i , j ) 2 \text{sum} \sum_{i1}^{m}\sum_{j1}^{n} A(i,j)^2 sumi1∑…...
vue3中 axios 发送请求 刷新token 封装axios
service.js 页面 import axios from axios // 创建axios实例 const instance axios.create({baseURL: http://gcm-test.jhzhkj.cn:8600/h5card/,timeout: 5000, // 请求超时时间headers: {get: {Content-Type: application/x-www-form-urlencoded},post: {Content-Type: appl…...
vue+mars3d叠加展示arcgis动态服务
数据格式:使用arcgis发布的动态服务 叠加和移除arcgis服务图层的方法 //加载arcgis地图服务function arcgisServer(i,d,m,p){i[d.data] new mars3d.layer.ArcGisLayer({name:d.label,url:p,flyTo: true})m.addLayer(i[d.data])}//移除arcgis服务范围线function rem…...
PostgreSQL 中进行数据导入和导出
在数据库管理中,数据的导入和导出是非常常见的操作。特别是在 PostgreSQL 中,提供了多种工具和方法来实现数据的有效管理。无论是备份数据,还是将数据迁移到其他数据库,或是进行数据分析,掌握数据导入和导出的技巧都是…...
Stable Audio Open模型部署教程:用AI打造独家节拍,让声音焕发新活力!
Stable Audio Open 是一个开源的文本到音频模型,允许用户从简单的文本提示中生成长达 47 秒的高质量音频数据。该模型非常适合创建鼓点、乐器即兴演奏、环境声音、拟音录音和其他用于音乐制作和声音设计的音频样本。用户还可以根据他们的自定义音频数据微调模型&…...
python更新程序并部署服务器服务
本地客户端程序 import json import hashlib import os import shutil import requests from pathlib import Pathclass AutoUpdater:def __init__(self, config_path"http://【XXXIP地址】/update_config"):self.config_path config_pathself.config Nonewith op…...
Nmap 扫描技巧:自定义端口、扫描速度与并行化设置
Nmap 扫描技巧:自定义端口、扫描速度与并行化设置 在进行网络安全扫描时,Nmap 是一个非常强大的工具。除了默认扫描 1000 个端口外,你还可以根据需要自定义扫描的端口、调整扫描速度以及优化扫描并行化。今天,我们就来介绍如何通…...
从 HTML 到 CSS:开启网页样式之旅(五)—— CSS盒子模型
从 HTML 到 CSS:开启网页样式之旅(五)—— CSS盒子模型 前言一、盒子模型的组成margin(外边距):border(边框):padding(内边距):conten…...
Linux命令行下载工具
1. curl 1.1. 介绍 curl是一个功能强大的命令行工具,用于在各种网络协议下传输数据。它支持多种协议,包括但不限于 HTTP、HTTPS、FTP、FTPS、SCP、SFTP、SMTP、POP3、IMAP 等,这使得它在网络数据交互场景中有广泛的应用。curl可以模拟浏览器…...
Navicat 连接 SQL Server 详尽指南
Navicat 是一款功能强大的数据库管理工具,它提供了直观的图形界面,使用户能够轻松地管理和操作各种类型的数据库,包括 SQL Server。本文将详尽介绍如何使用 Navicat 连接到 SQL Server 数据库,包括安装设置、连接配置、常见问题排…...
黑马JavaWeb-day06、07、08(SQL部分) _
文章目录 MYSQL概述数据模型SQL简介SQL分类 DDL数据库操作表操作 DML增(INSERT)改(UPDATE)删(DELETE) DQL基本查询条件查询(where)分组查询(group by)排序查询…...
Redis(1)
Redis是一个在内存中存储数据的中间件。 1.在内存中存储数据。 通过数据结构来存储,mysql通过表的方式存储数据,是关系型数据库,redis通过键值对存储,key的类型是string,value的类型是非关系型数据库。 2.可编程的 …...
工具类-列表请求工具 useList
useList 用于列表请求的基于 vue 3 的 hooks,接收请求函数、请求参数等数据,自动生成请求请求函数,分页信息等 本文有涉及到 http 请求工具和接口返回格式的内容: http 工具:一个基于 axios 封装的请求工具Response…...
5G终端自动拔号脚本
5G终端自动拔号脚本 5G终端自动拔号脚本 5G终端自动拔号脚本, 先进入飞行模式,再切出飞行模式, 最后 查询UE IP地址 5G终端自动拔号脚本 input$1 if [ "$input"x "1"x ]; then cmdatcfun1echo "start dialing &…...
3-1 C指针与数组
前言: 基于本人回顾与思考,仅供学习参考 1.0 数组名称的用途 注:可以用于求数组占用的内存空间:sizeof(arrName);此时数组名称代表整个数组 int32 t buffer[5] {1,2,3,4,5};int32 t size sizeof(buffer);printf("sizeof(buffer) %d.\…...
swift 屏幕录制
步骤 1:导入 ReplayKit import ReplayKit步骤 2:开始录屏 let screenRecorder RPScreenRecorder.shared() // 麦克风或系统音频 screenRecorder.isMicrophoneEnabled truefunc startRecording() {guard screenRecorder.isAvailable else {print(&quo…...
Graphviz 的详细介绍
Graphviz 的详细介绍 Graphviz 是一个开源的图形可视化软件,专门用于生成结构化图形。它特别适合用于表示关系图、流程图、依赖关系图和树状结构等类型的图表。Graphviz 使用一种名为 DOT 的脚本语言描述图形,通过解析 DOT 文件生成图像。 Graphviz 的特…...
前端工程化
文章目录 前端工程化模块化与组件化代码规范与风格统一自动化构建与部署性能优化版本控制与团队协作自动化测试 前端工程化 前端工程化是一种将软件工程的方法应用于前端开发的过程,旨在提高开发效率、降低维护成本、优化代码质量,并支持团队协作。以下…...
【LC】41. 缺失的第一个正数
题目描述: 给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 示例 1: 输入:nums [1,2,0] 输出:3 解释:范围…...
高频面试题(含笔试高频算法整理)基本总结回顾29
干货分享,感谢您的阅读! (暂存篇---后续会删除,完整版和持续更新见高频面试题基本总结回顾(含笔试高频算法整理)) 备注:引用请标注出处,同时存在的问题请在相关博客留言…...
Hive 的 Hook 机制 完全解析
Hive 的 Hook 是一种扩展机制,允许用户在执行查询时自定义行为,例如日志记录、审计或其他操作。Hook 通常在 Hive 的生命周期中某些关键节点被触发,开发者可以插入自定义代码执行特定任务。 一、Hook 的用途和核心概念 1. 用途 审计&#x…...
远程debug
这里写自定义目录标题 一、首先配置idea二、配置jvm1、将刚才idea生成的jvm指令复制下来,就是如下内容(注意要从你的idea中复制)2、在粘贴之前,要拼接上java-jar命令,还有servery,suspendy命令,最后拼接项目…...
一些常见网络安全术语
1、黑帽 为非法目的进行黑客攻击的人,通常是为了经济利益。他们进入安全网络以销毁,赎回,修改或窃取数据,或使网络无法用于授权用户。这个名字来源于这样一个事实:老式的黑白西部电影中的恶棍很容易被电影观众识别&…...
golang学习,小结
切片 切片,底层就是数组,len(切片的长度)和cap(容量,切片的空间) 从一个数组来得到切片,修改切片会修改原来的数组,数据会收到影响 我们可以通过内置的 append 函数对一…...
【C++ map和set】数据的吟游诗:Map与Set的双城记
公主请阅 set1.序列式容器和关联式容器2.set的介绍3.set的构造和迭代器部分set可以进行去重操作的,在去重的同时可以对插入进来的数字进行排序的操作4.set的增删查inserterasefindupper_bound和 lower_bound 5.multiset和set的差异6相关题目349.两个数组的交集142.环…...