8086汇编(16位汇编)学习笔记05.asm基础语法和串操作
8086汇编(16位汇编)学习笔记05.asm基础语法和串操作-C/C++基础-断点社区-专业的老牌游戏安全技术交流社区 - BpSend.net
asm基础语法
1. 环境配置
xp环境配置
1.拷贝masm615到指定目录
2.将masm615目录添加进环境变量
3.在cmd中输入ml,可以识别即配置成功
dosbox环境配置
1.拷贝masm611到指定目录
2.将masm611所在目录添挂载进dosbox
3.将masm611目录在dosbox中添加进环境变量
4.在cmd中输入ml,可以识别即配置成功
window10 环境配置
masm615 是 32位程序的(可以在xp系统上用) 因此要用 masm611
1.把文件复制到 dosbox-x 挂载的文件目录下
这样比较麻烦,所以可以把路径放入环境变量,在放入配置文件 set path=%path%;c:\masm611\
2. 入口和段
入口
CODE segment START: mov ax, ax CODE ends //表示标号 START 的第一行代码就是程序起点 end START
段
- 一个程序必须至少有一个段
- 一个程序中可以定义多个段
- 段不能嵌套
- 段可以重名,重名的段会被编译到同一块内存中
- 一般代码和数据是放在不同段内,一般有个代码段,一个数据段,一个栈段
格式:
段名 segment
ends 段名
TEST0 segmentmov cx, cx
TEST0 endsCODE segmentmov dx, dx
CODE endsCODE segmentmov bx, bx
CODE endsCODE segmentSTART:mov ax, ax
CODE endsend START
注释
汇编中使用分号( ; )来标注行注释,只有行注释,没有块注释
;这里是注释mov ax, bx ;这里是注释
常量
整数
1.整数可以支持多个进制
2.数值必须以数字开头,如果非数字,前面必须加0 (如 abcH 必须写成 0abcH)
3.负数前面可以加减号(-)
字符
- 字符可以用单引号(‘)或双引号(””)
mov byte ptr [bx], '$'
5. 变量
整形
1.整数可以支持多个类型
2.整数可以有多个初值,未初始化的值用问号(?)表示
3.变量一般定义在一个单独的段中
变量名 类型 初始值
val dd 5566h
字符串
1.字符串都可以用单引号(‘)或双引号(””),单引号和双引号作用一样
2.字符串一般以美元符$结尾
g_sz db "hello world$"; 16位汇编中以美元符结尾
数组
;这里是数据
data segment ;变量不允许重名 g_ary dw 12,13,14,15,16,17 ;长度等于你定义的个数g_ary1 dw 16 dup(55h) ;表示定义了一个长度16,初始值都是55的数组 g_ary2 dw 66h,4 dup(8888h),9999h,3 dup(7777h)g_bt db 12H ;一个字节g_w dw ? ;未初始化g_w1 dw 1213h ;双字g_w2 dw ? ;未初始化g_dd1 dd 1234h ;四个字节g_sz db "hello world $" ;汇编不会自动帮你加'\0'data ends;这里是代码
code segment ;段开始START: ;标号assume ds:data ;指定data段 作为 ds 段mov ax,data ;先把data的偏移值给axmov ds,ax ;ax再把data的偏移值给ds;不直接给是因为没有立即数到段寄存器mov al,g_bt ;将变量 g_bt 的值给almov ax,g_w1 ;将变量 g_w1 的值给bxmov g_w,1234h ;给未初数化变量 g_w 赋值mov g_w2,bx ;将bx的值,赋值给 g_w2code ends ;段结束end START ;代表从该标号第一行代码作为运行起点
格式:
名字 类型 值1[,值2][,值2][,值2][,值2]
名字 类型 数量 dup (初值)[,数量 dup (初值)][,值]
示例
g_db db 78h, 96h, 43h;后面跟初始化的值
g_ary db 256 dup(0), 128 dup(11h);重复256个0,再跟重复128个1
dup中如果不想给初值,可以直接写 ?
赋值
g_ary dw 12 dup(0) ;给数组元素赋值
lea bx , g_ary ;获取 g_ary 的偏移地址,即第一个元素的地址
mov word ptr [bx + 2 * 2],10h ; word是数组元素类型 2*2 是 元素下标 * 元素大小 ; 计算元素偏移值 , 10H 是要赋值的值
取值
g_ary dw 12 dup(0) ;取出数组指定元素的值
lea bx , g_ary ;获取 g_ary 的偏移地址,即第一个元素的地址
mov ax,word ptr [bx + 2 * 2] ; word是数组元素类型 2 * 2 是 元素下标 * 元素大小 ; 计算元素偏移值
属性
masm提供了很多伪指令,可以获取变量的大小和地址,称之为变量的属性。
;这里是数据
data segment ;变量不允许重名 g_ary dw 12 dup(0) ; 如果 g_ary dw 888h,12 dup(0) 那么属性就是以g_ary dw 888h来算g_bt db 11hdata ends;这里是代码
code segment ;段开始START: ;标号assume ds:data ;指定data段 作为 ds 段mov ax,data ;先把data的偏移值给axmov ds,ax ;ax再把data的偏移值给ds;不直接给是因为没有立即数到段寄存器mov ax, set g_bt ;把变量g_bt的段基址给 axmov ax, size g_bt ;将变量g_bt的大小给 axmov ax, type g_bt ;将变量g_bt的元素类型大小给 axmov ax, length g_bt ;将变量g_bt的元素个数给 axmov ax, size g_ary ;将变量g_ary的大小给 axmov ax, type g_ary ;将变量g_ary的元素类型大小给 axmov ax, length g_ary ;将变量g_ary的元素个数给 ax;给数组元素赋值lea bx , g_ary ;获取 g_ary 的偏移地址,即第一个元素的地址mov word ptr [bx + 2 * 2],10h ; word是数组元素类型 2*2 是 元素下标 * 元素大小 ; 计算元素偏移值 , 10H 是要赋值的值code ends ;段结束end START ;代表从该标号第一行代码作为运行起点
堆栈
stack关键字让程序在被加载的时候指定ss、bp和sp 。
使用数组为栈设置大小
;栈段
stack segment stack ; segment 后面跟关键字 stack ,说明这是一个栈段db 256 dup(1)
stack ends;这里是数据
data segment ;变量不允许重名 g_ary dw 12 dup(0)g_bt db 11hdata ends;这里是代码
code segment ;段开始START: ;标号assume ds:data ;指定data段 作为 ds 段mov ax,data ;先把data的偏移值给axmov ds,ax ;ax再把data的偏移值给ds;不直接给是因为没有立即数到段寄存器mov ax, seg g_bt ;把变量g_bt的段基址给 axmov ax, size g_bt ;将变量g_bt的大小给 axmov ax, type g_bt ;将变量g_bt的元素类型大小给 axmov ax, length g_bt ;将变量g_bt的元素个数给 axmov ax, size g_ary ;将变量g_ary的大小给 axmov ax, type g_ary ;将变量g_ary的元素类型大小给 axmov ax, length g_ary ;将变量g_ary的元素个数给 axcode ends ;段结束end START ;代表从该标号第一行代码作为运行起点
6. 调用dos功能号
功能号
1.dos系统提供的功能(API),通过21号中断来调用
2.每个功能都有一个编号,通过AH指定功能号
3.每个功能的参数查看手册
📎指令字典2005II.zip
用的最多的是21号 中断
程序结束
使用方法: 将功能编号 给 al 在 调用 int 21
;mov ah,4CH ;程序结束;mov al,00 ;返回值 类似于 return 0 mov ax,4C00H ; 上面2条指令合成一条 int 21h ;使用21号中断
6输出一个字符串
DS:减一串地址
显示字符串
60
$'结束字符串
;栈段
stack segment stack ; segment 后面跟关键字 stack ,说明这是一个栈段db 256 dup(1)
stack ends;这里是数据
data segment ;变量不允许重名 g_sz db "hello world",0dh,0ah,"$" ;用于输出的字符串 0dh \r 0ah \n
data ends;这里是代码
code segment ;段开始START: ;标号assume ds:data ;指定data段 作为 ds 段mov ax,data ;先把data的偏移值给axmov ds,ax ;ax再把data的偏移值给ds;不直接给是因为没有立即数到段寄存器lea dx,g_sz ;获取字符串 g_sz 的首地址;mov dx, offset g_sz ;获取字符串 g_sz 的段偏移值,即首地址跟上面效果一样mov ah,9 ; 将功能编号给ahint 21H ;调用21号中断;mov ah,4CH ;程序结束;mov al,00 ;返回值 类似于 return 0 mov ax,4C00H ; 上面2条指令合成一条 int 21h ;使用21号中断code ends ;段结束end START ;代表从该标号第一行代码作为运行起点
输入字符串
;栈段
stack segment stack ; segment 后面跟关键字 stack ,说明这是一个栈段db 256 dup(1)
stack ends;这里是数据
data segment ;变量不允许重名 g_sz db 32 dup(0) ;用于输入的字符串
data ends;这里是代码
code segment ;段开始START: ;标号assume ds:data ;指定data段 作为 ds 段mov ax,data ;先把data的偏移值给axmov ds,ax ;ax再把data的偏移值给ds;不直接给是因为没有立即数到段寄存器lea dx,g_sz ;获取字符串 g_sz 的首地址;mov dx, offset g_sz ;获取字符串 g_sz 的段偏移值,即首地址跟上面效果一样mov byte ptr [bx],size g_sz ;把字符串大小给 byte ptr [bx]mov dx,bx ;把地址给 dx mov ah,0aH ; 将功能编号给ahint 21H ;调用21号中断;mov ah,4CH ;程序结束;mov al,00 ;返回值 类似于 return 0 mov ax,4C00H ; 上面2条指令合成一条 int 21h ;使用21号中断code ends ;段结束end START ;代表从该标号第一行代码作为运行起点
中断
1.中断是由cpu提供的流程跳转指令,类似函数调用
2.在00:00位置存储着一个双字数组,大小为256,称作中断向量表
3.数组元素为逻辑地址**段基址****:**段偏移
4.int n的意思是从第n个元素获取地址,然后跳转执行
总结
每一个文件 以 end 作结尾,每个文件至少有一个段,程序的入口点用标号 ,标号名放在end后面.多个文件只能有一个标号放在end后面,一个段里面可以定义变量,可以写代码,但是一般我们会把,代码,数据,栈分开,放在不同段里面
示例:
code segment ;段开始START: ;标号mov ax,ax mov ax,ax mov ax,ax code ends ;段结束end START ;代表从标号 START 的第一行代码作为运行起点
注意文件要放在挂在的文件中
编译
链接
调试
编译链接脚本
● 编译+调试 脚本ml/c %1.asmlink %1.objdebug %1.exe文件后缀要改成 .bat ,而且要跟文件同目录
串操作
• 串传送MOVS(move string)
• 串存储STOS(store string)
• 串读取LODS(load string)
• 串比较CMPS
• 串扫描SCAS(scan string)
串传送MOVS(move string)
把字节或字操作数从主存的源地址传送至目的地址
(1)MOVSB
作用:字节 串传送:ES:[DI]←DS:[SI] ( SI←SI±1,DI←DI±1 )
从 DS:[SI] 取一个字节 存到 ES:[DI]
(2)MOVSW
作用:字 串传送:ES:[DI]←DS:[SI](SI←SI±2,DI←DI±2)
从 DS:[SI] 取一个字 存到 ES:[DI]
(3)MOVSD
作用:双字串 传送:ES:[EDI]←DS:[ESI](SI←SI±4,DI←DI±4)
从 DS:[SI] 取一个双字 存到 ES:[DI]
举例:
memcpy
;栈段
stack segment stack ; segment 后面跟关键字 stack ,说明这是一个栈段db 256 dup(1)
stack ends;这里是数据
data segment ;变量不允许重名 g_sz db "hello world",0dh,0ah,"$" g_sz1 db 32 dup(0) ;用于输入的字符串
data ends;这里是代码
code segment ;段开始START: ;标号assume ds:data ;指定data段 作为 ds 段mov ax,data ;先把data的偏移值给axmov ds,ax ;ax再把data的偏移值给ds;不直接给是因为没有立即数到段寄存器lea si,g_sz ;获取字符串 g_sz 的首地址lea di,g_sz1 ;获取字符串 g_sz1 的首地址mov ax,ds ;因为是从 ES:[DI]←DS:[SI],所以把 es 设成ds mov es,axmovsb ;从DS:[SI]拷贝一个字节数据到ES:[DI]movsb ;从DS:[SI]拷贝一个字节数据到ES:[DI]movsb ;从DS:[SI]拷贝一个字节数据到ES:[DI]movsbmovsbmovsb;mov ah,4CH ;程序结束;mov al,00 ;返回值 类似于 return 0 mov ax,4C00H ; 上面2条指令合成一条 int 21h ;使用21号中断code ends ;段结束end START ;代表从该标号第一行代码作为运行起点
串存储STOS(store string)
把AL或AX数据传送至目的地址
(1)STOSB
作用:字节串存储 ES:[DI]←AL DI←DI±1
把Al中的值给 ES:[DI]
(2)STOSW
作用:字串存储:ES:[DI]←AX DI←DI±2
把AX 中的值给 ES:[DI]
(3) STOSD
作用:双字串存储:ES:[EDI]←EAX DI←DI±4
把 EAX 中的值给 ES:[EDI]
举例:
memset
;栈段
stack segment stack ; segment 后面跟关键字 stack ,说明这是一个栈段db 256 dup(1)
stack ends;这里是数据
data segment ;变量不允许重名 g_sz db "hello world",0dh,0ah,"$" g_sz1 db 32 dup(0) ;用于输入的字符串
data ends;这里是代码
code segment ;段开始START: ;标号assume ds:data ;指定data段 作为 ds 段mov ax,data ;先把data的偏移值给axmov ds,ax ;ax再把data的偏移值给ds;不直接给是因为没有立即数到段寄存器mov ax,ds mov es,axmov al,66hlea di,g_sz1 ;获取字符串 g_sz 的首地址stosb ;将 al (66H),依次赋值给 g_sz1 开始的 各个字节 stosb stosbstosb;mov ah,4CH ;程序结束;mov al,00 ;返回值 类似于 return 0 mov ax,4C00H ; 上面2条指令合成一条 int 21h ;使用21号中断code ends ;段结束end START ;代表从该标号第一行代码作为运行起点
串读取LODS(load string)
把指定主存单元的数据传送给AL或AX
(1)LODSB
作用:字节串读取 AL←DS:[SI](SI←SI±1)
从 DS:[SI] 读取一个字节 给 al
(2)LODSW
作用:字串读取 AX←DS:[SI] (SI←SI±2)
(3)LODSD
作用:双字串读取 EAX← DS:[ESI] (SI←SI±4)
;栈段
stack segment stack ; segment 后面跟关键字 stack ,说明这是一个栈段db 256 dup(1)
stack ends;这里是数据
data segment ;变量不允许重名 g_sz db "hello world",0dh,0ah,"$" g_sz1 db 32 dup(0) ;用于输入的字符串g_sz2 db "hi$"
data ends;这里是代码
code segment ;段开始START: ;标号assume ds:data ;指定data段 作为 ds 段mov ax,data ;先把data的偏移值给axmov ds,ax ;ax再把data的偏移值给ds;不直接给是因为没有立即数到段寄存器mov ax,ds mov es,axmov al,0lea si,g_sz ;获取字符串 g_sz 的首地址lodsblodsblodsbmov ax,4C00H ; 上面2条指令合成一条 int 21h ;使用21号中断code ends ;段结束
end START ;代表从该标号第一行代码作为运行起点
串比较CMPS
将主存中的源操作数减去至目的操作数,以便设置标志,进而比较两操作数之间的关系
(1)CMPSB
作用:字节串比较:DS:[SI]-ES:[DI]( SI←SI±1,DI←DI±1 )
(2)CMPSW
作用:字串比较:DS:[SI]-ES:[DI](SI←SI±2,DI←DI±2)
(3)CMPSD
作用:双字串比较:DS:[ESI]-ES:[EDI] ( SI←SI±4,DI←DI±4 )
举例:
strstr
;栈段
stack segment stack ; segment 后面跟关键字 stack ,说明这是一个栈段db 256 dup(1)
stack ends;这里是数据
data segment ;变量不允许重名 g_sz db "hello world",0dh,0ah,"$" g_sz1 db 32 dup(0) ;用于输入的字符串g_sz2 db "hi$"
data ends;这里是代码
code segment ;段开始START: ;标号assume ds:data ;指定data段 作为 ds 段mov ax,data ;先把data的偏移值给axmov ds,ax ;ax再把data的偏移值给ds;不直接给是因为没有立即数到段寄存器mov ax,ds mov es,axlea si,g_sz ;获取字符串 g_sz 的首地址lea di,g_sz2 ;获取字符串 g_sz2 的首地址cmpsbcmpsbmov ax,4C00H ; 上面2条指令合成一条 int 21h ;使用21号中断code ends ;段结束end START ;代表从该标号第一行代码作为运行起点
串扫描SCAS(scan string)
•作用:将AL/AX减去至目的操作数,以便设置标志,进而比较AL/AX与操作数之间的关系
一般用来找某个字符,确定字符串长度 ,例如 16asm 字符串以 "
结束那我们从字符串开始到找到"结束,那我们从字符串开始,到找到′'
Di 的 值 ,就是字符串长度, 或者判断字符串中是否有某个字符,或者字符串中某个字符的下标
(1)SCASB
作用:字节串扫描:AL-ES:[DI](DI←DI±1)
(2)SCASW
作用:字串扫描:AX-ES:[DI](DI←DI±2)
(3) SCASD
作用:字串扫描:EAX-ES:[EDI](DI←DI±4)
举例:strlen
;栈段
stack segment stack ; segment 后面跟关键字 stack ,说明这是一个栈段db 256 dup(1)
stack ends;这里是数据
data segment ;变量不允许重名 g_sz db "hello world",0dh,0ah,"$" g_sz1 db 32 dup(0) ;用于输入的字符串g_sz2 db "hi$"
data ends;这里是代码
code segment ;段开始START: ;标号assume ds:data ;指定data段 作为 ds 段mov ax,data ;先把data的偏移值给axmov ds,ax ;ax再把data的偏移值给ds;不直接给是因为没有立即数到段寄存器mov ax,ds mov es,axmov al,'l'lea di,g_sz ;获取字符串 g_sz 的首地址scasbscasbscasbscasbmov ax,4C00H ; 上面2条指令合成一条 int 21h ;使用21号中断code ends ;段结束
end START ;代表从该标号第一行代码作为运行起点
重复前缀指令
只能用于串操作指令
串操作指令执行一次,仅对数据串中的一个字节或字进行操作。
串操作指令前,都可以加一个重复前缀,实现串操作的重复执行。重复次数隐含在CX寄存器中。
重复前缀分2类,3条指令:
配合不影响标志的 MOVS、STOS(和LODS)指令的 REP 前缀
配合影响标志的 CMPS 和 SCAS 指令的 REPZ 和 REPNZ 前缀
无条件重复前缀指令REP
每执行一次串指令,CX减1,直到CX=0,重复执行结束。
理解为:当数据串没有结束(CX≠0),则继续传送。
举例:
REP LODS/LODSB/LODSW/LODSD
REP STOS/STOSB/STOSW/STOSD
REP MOVS/MOVSB/MOVSW/MOVSD
;栈段
stack segment stack ; segment 后面跟关键字 stack ,说明这是一个栈段db 256 dup(1)
stack ends;这里是数据
data segment ;变量不允许重名 g_sz db "hello world",0dh,0ah,"$" g_sz1 db 32 dup(0) ;用于输入的字符串g_sz2 db "hi$"
data ends;这里是代码
code segment ;段开始START: ;标号assume ds:data ;指定data段 作为 ds 段mov ax,data ;先把data的偏移值给axmov ds,ax ;ax再把data的偏移值给ds;不直接给是因为没有立即数到段寄存器mov ax,ds mov es,axlea si,g_sz ;获取字符串 g_sz 的首地址lea di,g_sz1 ;获取字符串 g_sz1 的首地址mov cx, offset g_sz1 - offset g_sz ;计算字符串 g_sz 长度rep movsb ;将 字符串g_sz的内容 全部拷贝到 g_sz1 , cx等于 g_sz 长度mov ax,4C00H ; 上面2条指令合成一条 int 21h ;使用21号中断code ends ;段结束
end START ;代表从该标号第一行代码作为运行起点
条件重复前缀指令REPZ
每执行一次串指令,CX减1。
并判断ZF是否为0。
只要CX=0或ZF=0,重复执行结束。
•理解:当数据串没有结束(CX≠0),并且串相等(ZF=1),则继续比较。
•举例:
REPE/REPZ SCAS/SCASB/SCASW/SCASD
REPE/REPZ CMPS/CMPSB/CMPSW/CMPSD
作用: 比较2个字符串是否一样 ,如果CF 等于0 就代表一样
;栈段
stack segment stack ; segment 后面跟关键字 stack ,说明这是一个栈段db 256 dup(1)
stack ends;这里是数据
data segment ;变量不允许重名 g_sz db "hello world",0dh,0ah,"$" g_sz1 db 32 dup(0) ;用于输入的字符串g_sz2 db "hello$" g_sz3 db "hello world",0dh,0ah,"$"
data ends;这里是代码
code segment ;段开始START: ;标号assume ds:data ;指定data段 作为 ds 段mov ax,data ;先把data的偏移值给axmov ds,ax ;ax再把data的偏移值给ds;不直接给是因为没有立即数到段寄存器mov ax,ds mov es,axlea si,g_sz ;获取字符串 g_sz 的首地址lea di,g_sz2 ;获取字符串 g_sz2 的首地址mov cx, offset g_sz1 - offset g_sz ;计算字符串 g_sz 长度repz cmpsb ;ZF位是0 或者 CX = 0 结束 lea si,g_sz ;获取字符串 g_sz 的首地址lea di,g_sz3 ;获取字符串 g_sz2 的首地址mov cx, offset g_sz1 - offset g_sz ;计算字符串 g_sz 长度repz cmpsb ;ZF位是0 或者 CX = 0 结束 mov ax,4C00H ; 上面2条指令合成一条 int 21h ;使用21号中断code ends ;段结束
end START ;代表从该标号第一行代码作为运行起点
条件重复前缀指令REPNZ
每执行一次串指令,CX减1。
并判断ZF是否为1。
只要CX=0 或 ZF=1,重复执行结束。
•理解:当数据串没有结束(CX≠0),并且串不相等(ZF=0),则继续比较。
•举例:
REPNE/REPNZ SCAS/SCASB/SCASW/SCASD
REPNE/REPNZ CMPS/CMPSB/CMPSW/CMPSD
相关文章:
8086汇编(16位汇编)学习笔记05.asm基础语法和串操作
8086汇编(16位汇编)学习笔记05.asm基础语法和串操作-C/C基础-断点社区-专业的老牌游戏安全技术交流社区 - BpSend.net asm基础语法 1. 环境配置 xp环境配置 1.拷贝masm615到指定目录 2.将masm615目录添加进环境变量 3.在cmd中输入ml,可以识别即配置成功 dosbox…...
【漏洞复现】BIG-IP Next Central Manager OData 注入漏洞(CVE-2024-21793)
免责声明 请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。工具来自网络,安全性自测,如有侵权请联系删除。本次测试仅供学习使用,如若非法他用,与平台和本文作…...
Go语言及MongoDB数据库安装配置详解!
Go语言安装 首先讲一下go语言的安装,这部分可直接从官网下载,基本上一键配置的: 官网地址:All releases - The Go Programming Language 选择自己对应系统的安装包,这里官网提供了5种不同的包可自行下载 之后便是默认…...
数据库管理-第275期 Oracle 23ai:画了两张架构图(20241225)
数据库管理275期 2024-12-25 数据库管理-第275期 Oracle 23ai:画了两张架构图(20241225)1 系统管理分片2 用户定义分片总结 数据库管理-第275期 Oracle 23ai:画了两张架构图(20241225) 作者:胖…...
HTML速查
HTML 基本文档 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>文档标题</title></head><body>可见文本...</body> </html>基本标签(Basic Tags) <h1>最大的…...
系统分析师第二版口诀
【绪 数 计 网 库】、【信 工 项 安 规 】、【需 架 设 测 运】、【We 嵌 移 大 微 物 论】(第1章 绪论、第2章 数学与工程基础、第3章 计算机系统、第4章 计算机网络与分布式系统、第5章 数据库系统、第6章 企业信息化、第7章 软件工程、第8章 项目管理、第9章 信息…...
E-commerce .net+React(一)——项目初始化
文章目录 项目地址一、创建.Net环境1.1环境配置1.1.1 使用vscode创建webapi1.1.2 Clean architecture结构创建1.1.3 将创建好结构的项目添加到git里1.1.4 EF Core配置1. 在infrastructure里安装EF所需环境2. 创建Product数据模型3. 创建EF Core的DbContext 数据库上下文4. 创建…...
15 break和continue
while True: content input("请输入你要喷的内容") print("发送给下路",content) #上述的程序如果没有外力干扰:程序会一直进行输入下去 #break:就能让当前这个循环立即进行停止 while True: content input("请输入…...
SwiftUI 入门趣谈:在文本框(TextField)内限制数字的输入
概述 虽然 SwiftUI 本身提供了海量内置的原生视图供我们使用,但对于某些情况我们还需要根据实际需求“量体裁衣、专属定制”。 在日常的撸码场景中,我们有时需要限制文本框(TextField)中数字内容的输入,如何又简单又快…...
JOGL 从入门到精通:开启 Java 3D 图形编程之旅
一、引言 Java 作为一门广泛应用的编程语言,在图形编程领域也有着强大的工具和库。JOGL(Java OpenGL)便是其中之一,它为 Java 开发者提供了访问 OpenGL(Open Graphics Library)功能的接口,使得…...
scrollIntoView() 滚动到元素顶部和底部
scrollIntoView() 是一个 DOM 方法,通常用于将某个元素滚动到视口内(可视区域)。这个方法能够使目标元素在页面上可见,尤其是在有滚动条的容器中。当你调用 scrollIntoView() 时,浏览器会自动滚动页面,直到…...
数据预处理
数据预处理科普指南 一、数据预处理:开启数据价值之门的钥匙 在当今数字化浪潮中,数据被视作蕴含无尽宝藏的富矿。然而,原始数据就如同刚从矿山采出的原石,虽内藏珍贵信息,却混杂着诸多瑕疵,如噪声、缺失…...
关于分布式数据库需要了解的相关知识!!!
成长路上不孤单😊😊😊😊😊😊 【14后😊///计算机爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于关于分布式数据库方面的相关内容&a…...
IP代理测试要测试哪些方面?
在数据采集的征途上,IP代理是我们的得力助手,它不仅帮助我们高效地收集信息,还能在保护数据安全方面发挥重要作用。但面对众多的IP代理服务,如何知道哪一个才是最适合我们的呢?这就需要我们进行一系列的测试。 速度与…...
【前沿 热点 顶会】AAAI 2025中与目标检测有关的论文
CP-DETR: Concept Prompt Guide DETR Toward Stronger Universal Object Detection(AAAI 2025) 最近关于通用物体检测的研究旨在将语言引入最先进的闭集检测器,然后通过构建大规模(文本区域)数据集进行训练࿰…...
【Unity3D】Jobs、Burst并行计算裁剪Texture3D物体
版本:Unity2019.4.0f1 PackageManager下载Burst插件(1.2.3版本) 利用如下代码,生成一个Texture3D资源,它只能脚本生成,是一个32*32*32的立方体,导出路径记得改下,不然报错。 using UnityEditor; using Uni…...
HTML与数据抓取:GET与POST请求处理流程
请求数据最重要的三个要点 1. 请求URL 请求URL是客户端向服务器发出请求的目标地址。它指定了要访问的资源位置,并且可以包含路径和查询参数。URL不仅决定了请求的目标,还可以传递必要的信息给服务器; 格式:http(s)://域名/路径…...
TCP客户端模拟链接websocket服务端发送消息(二)
兄弟们,我来填坑了,o(╥﹏╥)o o(╥﹏╥)o o(╥﹏╥)o o(╥﹏╥)o o(╥﹏╥)o o(╥﹏╥)o,前几天写了个tcp模拟websocket客户端的以为完成,后面需要发送消息给服务端,以为简单不就是一个发送消息么,这不是一…...
使用Quick 录屏为视频生成二维码
Quick 可以将 录屏视频、截图、录音等生成二维码或链接分享给任何人,通过设置访问权限,仅对允许的访客开放。 首先下载安装Quick客户端,安装完成后打开界面如下 点击 选区录制 ,按住鼠标左键拖动选区待录制区域 释放鼠标左键&…...
harmony数据保存-数据持久化
preference的介绍 preference的使用 数据库 sqlite的使用 可以写sql语句用executsql进行增删改查. 也可以使用提供的接口(insert,delete,update,query)进行增删改查。...
【Spring AI】Spring AI Alibaba的简单使用
提示:文章最后有详细的参考文档。 前提条件 SpringBoot版本为3.x以上JDK为17以上申请api-key,地址:百炼平台 引入依赖 说明:我的springboot版本为3.2.4,spring-ai-alibaba-starter版本为1.0.0-M2.1(对应spring-ai版本…...
redhawk如何看高toggle rate instance
我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 redhaw...
C语言学习笔记(2)
在学习前,需要有一定的C语言基础。不必很深入,只需要知道函数,头文件,指针,数组等的概念就可以,但并非0基础笔记。 由于写到后面,不好编辑了,决定分成多篇写,请按编号学…...
macos 隐藏、加密磁盘、文件
磁盘加密 打开磁盘工具 点击添加 设置加密参数 设置密码 查看文件 不用的时候右键卸载即可使用的时候装载磁盘,并输入密码即可 修改密码 解密 加密,输入密码即可 禁止开机自动挂载此加密磁盘 如果不禁止自动挂载磁盘,开机后会弹出输入…...
机器学习(二)-简单线性回归
文章目录 1. 简单线性回归理论2. python通过简单线性回归预测房价2.1 预测数据2.2导入标准库2.3 导入数据2.4 划分数据集2.5 导入线性回归模块2.6 对测试集进行预测2.7 计算均方误差 J2.8 计算参数 w0、w12.9 可视化训练集拟合结果2.10 可视化测试集拟合结果2.11 保存模型2.12 …...
TP5 动态渲染多个Layui表格并批量打印所有表格
记录: TP5 动态渲染多个Layui表格每个表格设置有2行表头,并且第一行表头在页面完成后动态渲染显示内容每个表格下面显示统计信息可点击字段排序一次打印页面上的所有表格打印页面上多个table时,让每个table单独一页 后端代码示例: /*** Nod…...
Random模拟概率问题
问题背景: 使用 random.nextInt(100) < 10 这段代码来模拟 10% 的概率,其中: random.nextInt(100) 会生成一个 0 到 99 之间的整数。 如果结果小于 10,则表示触发事件,概率为 10/100 10%。 核心问题:…...
适用于Synology NAS的在线办公套件:ONLYOFFICE安装指南
使用 Synology NAS 上的 ONLYOFFICE 文档,您能在私有云中直接编辑文本文档、电子表格、演示文稿和 PDF,确保工作流程既安全又高效。本指南将分步介绍如何在 Synology 上安装 ONLYOFFICE 文档。 关于 Synology Synology NAS(网络附加存储&…...
Go的defer原理
Go 语言中的 defer 语句用于延迟执行一个函数,直到包含该 defer 语句的函数执行完毕时才执行。defer 主要用于资源清理、文件关闭、解锁互斥锁等操作,以确保这些操作在函数返回前被执行,无论函数是正常返回还是由于错误提前返回。 以下是 de…...
达梦数据库迁移到MySQL字段注释缺失问题处理
目录 1、环境信息 2、问题详情 3、处理方案 3.1、提取备用库字段注释 3.2、生成正式库字段注释 1、环境信息 达梦数据库版本:v8 MySQL数据库版本:5.7.11 正式库:通过DTS迁移后的MySQL数据库 备用库:表结构与正式库一致&#…...
IntelliJ Idea常用快捷键详解
文章目录 IntelliJ Idea常用快捷键详解一、引言二、文本编辑与导航1、文本编辑2、代码折叠与展开 三、运行和调试四、代码编辑1、代码补全 五、重构与优化1、重构 六、使用示例代码注释示例代码补全示例 七、总结 IntelliJ Idea常用快捷键详解 一、引言 在Java开发中ÿ…...
Java操作Xml
一、数据准备 1、文件头实体类 package com.xiaobai.xmlpractice;import lombok.AllArgsConstructor; import lombok.Data;/*** Author 王天文* Date 2024/12/18 21:46* Description: xml头*/ AllArgsConstructor Data public class Head {private String desc;private Strin…...
CI/CD是什么?
CI/CD 定义 CI/CD 代表持续集成和持续部署(或持续交付)。它是一套实践和工具,旨在通过自动化构建、测试和部署来改进软件开发流程,使您能够更快、更可靠地交付代码更改。 持续集成 (CI):在共享存储库中自动构建、测试…...
某些iphone手机录音获取流stream延迟问题 以及 录音一次第二次不录音问题
一些型号的iphone手机录音获取流stream延迟问题 以及 录音一次第二次不录音问题 延迟问题 navigator.mediaDevices.getUserMedia({ audio: true }) .then((stream) > {console.log(stream) })从开始到获取stream会有将近2s的延迟 导致按下按钮开始录音 会有前…...
基础优化方法
梯度下降 学习率代表每一次沿着这个方向走多远, batchsize的概念 梯度下降通过不断沿着反梯度方向更新参数求解 两个重要的超参数是 batchsize 和 学习率...
linux系统上SQLPLUS的重“大”发现
SQL plus版本: [oraclepg-xc2 ~]$ sqlplus -v SQL*Plus: Release 19.0.0.0.0 - Production Version 19.3.0.0.0 操作系统:CentOS Linux 7 (Core) 数据库:Oracle 19c Version 19.3.0.0.0 同样的SQL脚本在windos CMD sqlplus 执行没问题。…...
【0x001F】HCI_Read_Clock_Offset命令详解
目录 一、命令概述 二、命令格式及参数说明 2.1. HCI_Read_Clock_Offset 命令格式 2.2. Connection_Handle 三、生成事件 3.1. HCI_Command_Status 事件 3.2. HCI_Read_Clock_Offset_Complete 事件 四、命令执行流程 4.1. 命令发送阶段 4.2. 命令接收与初步反馈阶段 …...
UML(统一建模语言)及其图例使用指南
UML(统一建模语言)及其图例使用指南 一、UML 介绍二、UML 图表1. 用例图(Use Case Diagram)2. 类图(Class Diagram)3. 对象图(Object Diagram)4. 序列图(Sequence Diagra…...
AI写标书工具:高效智能的标书撰写助手——标小兔
在现代商业竞争中,投标是许多企业获得项目的关键途径。而标书的质量直接影响中标的几率。传统的标书撰写过程繁琐,且容易出错,尤其是涉及到大量的数据整理、文字表达和排版工作,这些任务既费时又容易让人产生疲劳感。为了提升工作…...
计算机考研选西电还是成电?
谢邀~先来个总结:电子科技大学计算机综合实力优于西安电子科技大学,但是,二者计算机学硕考研难度没有太大差距,而且考试难度也同属于一个水平,成电性价比更高一些!推荐同学优先报考作为985的电子科技大学&a…...
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之循环结构(for循环语句)(一)
在C编程中,顺序结构和分支结构是两种基本的控制流结构,其中顺序结构是一种最简单、最基本的控制结构,即代码按照从上到下的顺序逐行执行,每个语句按照顺序执行,一条语句执行完再执行下一条语句,依次执行所有…...
【再谈设计模式】享元模式~对象共享的优化妙手
一、引言 在软件开发过程中,我们常常面临着创建大量细粒度对象的情况,这可能会导致内存占用过高、性能下降等问题。享元模式(Flyweight Pattern)就像是一位空间管理大师,它能够在不影响功能的前提下,有效地…...
NestJS中使用nestjs-plugin-module实现插件系统
1. 安装依赖 npm install brewww/nestjs-plugin-module2. 定义插件接口 首先,我们需要定义一个插件接口,这个接口定义了插件需要实现的方法。 hello/plugin.interface.ts export interface HelloServicePlugin {helloworld(): string;hello(name: st…...
jvm排查问题-实践追踪问题 与思路--堆内堆外内存泄漏排查方针
概述 排查问题的一般思路是:现象 ——> 直接原因 ——>根本原因。 从问题现象出发,可以分为 应用逻辑问题、资源使用问题、虚拟机异常: 应用逻辑可能导致报错增加、死锁、程序退出等;资源问题主要集中在CPU上升和内存上升(OOM Kill);虚拟机问题通常包括GC问题、进…...
Presence:Colyseus用于管理实时分布式数据的工具
Colyseus Presence 详细介绍 Presence 是 Colyseus 中用于管理实时分布式数据的一种工具。它主要用于在多房间、多服务器或分布式部署中实现玩家的实时在线状态、数据共享和通信。Presence 提供了一套简单的 API 来处理诸如在线玩家跟踪、分布式数据存储和发布/订阅模式等功能…...
梳理你的思路(从OOP到架构设计)_认识框架(Framework) 01
目录 1、 是框架的核心要素编辑&i> 范例1: 范例2: 范例3: 1、 <E&I>是框架的核心要素 在特定领域(Domain)里,将EIT造形的<E&I>部份有意义地组合起来,就成为框架(Framework)了。基本…...
【C++11】类型分类、引用折叠、完美转发
目录 一、类型分类 二、引用折叠 三、完美转发 一、类型分类 C11以后,进一步对类型进行了划分,右值被划分纯右值(pure value,简称prvalue)和将亡值 (expiring value,简称xvalue)。 纯右值是指那些字面值常量或求值结果相当于…...
字节跳动Java开发面试题及参考答案(数据结构算法-手撕面试题)
怎么判断两个链表是否相交?怎么优化? 判断两个链表是否相交可以采用多种方法。 一种方法是使用双指针。首先分别遍历两个链表,得到两个链表的长度。然后让长链表的指针先走两个链表长度差的步数。之后,同时移动两个链表的指针,每次比较两个指针是否指向相同的节点。如果指…...
科汛网校KesionEDU CheckOrder SQL注入漏洞复现
0x01 产品简介 科汛网校KesionEDU是KESION科汛开发的在线教育建站系统,支持在线直播教学、课程点播、录播授课等多种教学方式,满足不同场景下的教学需求。提供问答互动、学习点评、在线笔记等功能,增强学员与教师之间的互动交流。拥有在线考试系统,支持单选、多选、问答等…...
【ELK】ES单节点升级为集群模式--太细了!
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言准备工作1. 查看现状【单节点】2. 原节点改集群模式3. 改es配置文件,增加集群相关配置项4. *改docker映射的端口* 启动新节点5. docker-compose起一…...