8086汇编(16位汇编)学习笔记05.asm基础语法和串操作
https://bpsend.net/thread-121-1-2.html
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 segment
mov cx, cx
TEST0 ends
CODE segment
mov dx, dx
CODE ends
CODE segment
mov bx, bx
CODE ends
CODE segment
START:
mov ax, ax
CODE ends
end 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的偏移值给ax
mov ds,ax ;ax再把data的偏移值给ds
;不直接给是因为没有立即数到段寄存器
mov al,g_bt ;将变量 g_bt 的值给al
mov ax,g_w1 ;将变量 g_w1 的值给bx
mov g_w,1234h ;给未初数化变量 g_w 赋值
mov g_w2,bx ;将bx的值,赋值给 g_w2
code 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 11h
data ends
;这里是代码
code segment ;段开始
START: ;标号
assume ds:data ;指定data段 作为 ds 段
mov ax,data ;先把data的偏移值给ax
mov ds,ax ;ax再把data的偏移值给ds
;不直接给是因为没有立即数到段寄存器
mov ax, set g_bt ;把变量g_bt的段基址给 ax
mov ax, size g_bt ;将变量g_bt的大小给 ax
mov ax, type g_bt ;将变量g_bt的元素类型大小给 ax
mov ax, length g_bt ;将变量g_bt的元素个数给 ax
mov ax, size g_ary ;将变量g_ary的大小给 ax
mov ax, type g_ary ;将变量g_ary的元素类型大小给 ax
mov 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 11h
data ends
;这里是代码
code segment ;段开始
START: ;标号
assume ds:data ;指定data段 作为 ds 段
mov ax,data ;先把data的偏移值给ax
mov ds,ax ;ax再把data的偏移值给ds
;不直接给是因为没有立即数到段寄存器
mov ax, seg g_bt ;把变量g_bt的段基址给 ax
mov ax, size g_bt ;将变量g_bt的大小给 ax
mov ax, type g_bt ;将变量g_bt的元素类型大小给 ax
mov ax, length g_bt ;将变量g_bt的元素个数给 ax
mov ax, size g_ary ;将变量g_ary的大小给 ax
mov ax, type g_ary ;将变量g_ary的元素类型大小给 ax
mov ax, length g_ary ;将变量g_ary的元素个数给 ax
code ends ;段结束
end START ;代表从该标号第一行代码作为运行起点

6. 调用dos功能号
功能号
1.dos系统提供的功能(API),通过21号中断来调用
2.每个功能都有一个编号,通过AH指定功能号
3.每个功能的参数查看手册



用的最多的是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的偏移值给ax
mov ds,ax ;ax再把data的偏移值给ds
;不直接给是因为没有立即数到段寄存器
lea dx,g_sz ;获取字符串 g_sz 的首地址
;mov dx, offset g_sz ;获取字符串 g_sz 的段偏移值,即首地址跟上面效果一样
mov ah,9 ; 将功能编号给ah
int 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的偏移值给ax
mov 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 ; 将功能编号给ah
int 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.asm
link %1.obj
debug %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的偏移值给ax
mov 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,ax
movsb ;从DS:[SI]拷贝一个字节数据到ES:[DI]
movsb ;从DS:[SI]拷贝一个字节数据到ES:[DI]
movsb ;从DS:[SI]拷贝一个字节数据到ES:[DI]
movsb
movsb
movsb
;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的偏移值给ax
mov ds,ax ;ax再把data的偏移值给ds
;不直接给是因为没有立即数到段寄存器
mov ax,ds
mov es,ax
mov al,66h
lea di,g_sz1 ;获取字符串 g_sz 的首地址
stosb ;将 al (66H),依次赋值给 g_sz1 开始的 各个字节
stosb
stosb
stosb
;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的偏移值给ax
mov ds,ax ;ax再把data的偏移值给ds
;不直接给是因为没有立即数到段寄存器
mov ax,ds
mov es,ax
mov al,0
lea si,g_sz ;获取字符串 g_sz 的首地址
lodsb
lodsb
lodsb
mov 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的偏移值给ax
mov ds,ax ;ax再把data的偏移值给ds
;不直接给是因为没有立即数到段寄存器
mov ax,ds
mov es,ax
lea si,g_sz ;获取字符串 g_sz 的首地址
lea di,g_sz2 ;获取字符串 g_sz2 的首地址
cmpsb
cmpsb
mov 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的偏移值给ax
mov ds,ax ;ax再把data的偏移值给ds
;不直接给是因为没有立即数到段寄存器
mov ax,ds
mov es,ax
mov al,'l'
lea di,g_sz ;获取字符串 g_sz 的首地址
scasb
scasb
scasb
scasb
mov 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的偏移值给ax
mov ds,ax ;ax再把data的偏移值给ds
;不直接给是因为没有立即数到段寄存器
mov ax,ds
mov es,ax
lea 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的偏移值给ax
mov ds,ax ;ax再把data的偏移值给ds
;不直接给是因为没有立即数到段寄存器
mov ax,ds
mov es,ax
lea 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基础语法和串操作的更多相关文章
- Vue学习笔记之Vue基础语法
1. 概述 Vue.js 使用了基于 HTML 的模板语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据.所有 Vue.js 的模板都是合法的 HTML,所以能被遵循规范的浏览器和 H ...
- Java 学习笔记(1)——java基础语法
最近抽时间在学习Java,目前有了一点心得,在此记录下来. 由于我自己之前学过C/C++,而Java的语法与C/C++基本类似,所以这一系列文章我并不想从基础一点点的写,我想根据我已有的C/C++经验 ...
- Java基础学习笔记三 Java基础语法
Scanner类 Scanner类属于引用数据类型,先了解下引用数据类型. 引用数据类型的使用 与定义基本数据类型变量不同,引用数据类型的变量定义及赋值有一个相对固定的步骤或格式. 数据类型 变量名 ...
- Java基础学习笔记四 Java基础语法
数组 数组的需求 现在需要统计某公司员工的工资情况,例如计算平均工资.最高工资等.假设该公司有50名员工,用前面所学的知识完成,那么程序首先需要声明50个变量来分别记住每位员工的工资,这样做会显得很麻 ...
- Java基础学习笔记六 Java基础语法之类和ArrayList
引用数据类型 引用数据类型分类,提到引用数据类型(类),其实我们对它并不陌生,如使用过的Scanner类.Random类.我们可以把类的类型为两种: 第一种,Java为我们提供好的类,如Scanner ...
- Java基础学习笔记五 Java基础语法之面向对象
面向对象 理解什么是面向过程.面向对象 面向过程与面向对象都是我们编程中,编写程序的一种思维方式.面向过程的程序设计方式,是遇到一件事时,思考“我该怎么做”,然后一步步实现的过程.例如:公司打扫卫生( ...
- Java基础学习笔记七 Java基础语法之继承和抽象类
继承 继承的概念 在现实生活中,继承一般指的是子女继承父辈的财产.在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系. 例如公司中的研发部员工和维护部员工都属于员工, ...
- Java基础学习笔记八 Java基础语法之接口和多态
接口 接口概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”.接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成.这样将功能的定义 ...
- Java基础学习笔记九 Java基础语法之this和super
构造方法 我们对封装已经有了基本的了解,接下来我们来看一个新的问题,依然以Person为例,由于Person中的属性都被private了,外界无法直接访问属性,必须对外提供相应的set和get方法.当 ...
- Python学习笔记1(基础语法)
1.Python的文件类型: 源代码:扩展名以py结尾.python写的程序不需要编译成二进制代码,可以直接运行.pyw是Windows下开发图形界面的源文件. 字节代码:扩展名以pyc结尾,是编译过 ...
随机推荐
- 算子var_threshold
算子var_threshold 名称 var_threshold - 通过局部均值和标准差分析对图像进行阈值处理. 签名 var_threshold(Image : Region : MaskWidt ...
- java如何实现对List集合进行分页
对List集合进行分页: private <T> Page<T> listToPage(List<T> dataList, Integer pageSize, In ...
- mysql -- 自定义函数及循环结构
和存储过程类似,区别在于存储过程可以有0个或多个返回,但是函数只能有唯一一个返回值 一般而言,存储过程适合批量插入,批量删除,增删改:函数则用于处理数据,查询某个值. 创建 create functi ...
- Pydantic配置继承抽象基类模式
title: Pydantic配置继承抽象基类模式 date: 2025/3/21 updated: 2025/3/21 author: cmdragon excerpt: Pydantic模型配置系 ...
- Oracle 内存(SGA,PGA)详细介绍
一.名词解释(1)SGA:SystemGlobal Area是OracleInstance的基本组成部分,在实例启动时分配;系统全局域SGA主要由三部分构成:共享池.数据缓冲区.日志缓冲区.(2)共享 ...
- 深入理解Hadoop读书笔记-1
背景 公司的物流业务系统目前实现了使用storm集群进行过门事件的实时计算处理,但是还有一个需求,我们需要存储每个标签上传的每条明细数据,然后进行定期的标签报表统计,这个是目前的实时计算框架无法满足的 ...
- for循环的注意事项
1.注意事项! 实操 可以看见上图,当{}里的循环走完后,i还存在,但是a消失了,因此{}里的变量会在每一次循环结束后释放 . 这也是为什么之前我们打印a会出错的原因:a早就已经从内存中释放了,还怎么 ...
- 【Java】String字符串格式化
一.前言 String.format() 作为文本处理工具,为我们提供强大而丰富的字符串格式化功能,为了不止步于简单调用 String.format("Hello %s", &qu ...
- 【C#】SuperSocket配置启动UDP服务器
SuperSocket配置UDP服务器 零.需求 两个设备局域网联机,需要用广播自动搜寻,而SuperSocket1.6的默认AppServer使用的是TCP,但只有UDP才支持广播. 一.解决 推荐 ...
- Windows Terminal 添加 git-bash
配置文件中 profiles 节点补充配置 { "guid": "{b453ae62-4e3d-5e58-b989-0a998ec441b7}", " ...
