汇编语言程序设计(四)之汇编指令
系列文章
汇编语言程序设计(一)
汇编语言程序设计(二)之寄存器
汇编语言程序设计(三)之汇编程序
汇编指令
1. 数据传输指令
指令包括:MOV、XCHG、XLAT、LEA、LDS、LES、PUSH、POP、PUSHF、LAHF、SAHF、POPF、IN、OUT
重点掌握:MOV、XCHG、XLAT、LEA、PUSH、POP
- MOV指令
作用:把一个字或者直接的操作数从源地址传送到目的地址
;使用格式:
;mov target,source
mov reg/mem,imm ;mem表示内存,imm表示立即数(数据)seg表示段寄存器
mov reg/mem/seg,reg
mov reg/seg,mem
mov reg/mme.seg
注意事项:
1.target不能是CS(代码段寄存器)
2.target和source不能同时为内存数、段寄存器(CS\DS\ES\SS\FS\GS)
3.不能将立即数传送给段寄存器
4.target和source必须类型匹配,比如,要么都是字节,要么都是字或者都是双字等。
5.由于立即数没有明确的类型,所以将立即数传送到target时,系统会自动将立即数零扩展到与
target数的位数相同,再进行传送。有时,需要用BYTE PTR 、WORD PTR明确指出立即数的位数
图示解析:

示例:
mov al,4 ;将4以字节的形式传送给al寄存器,为字节传送
mov cx,00FFH ;将00FFH传送给CX寄存器 上述的4和00FF都为立即数,cx,al均为reg
mov si,0200H ;将0200H传送给寄存器SI,为字传送
mov ax,bx ;将bx中的内容传递给ax,属于寄存器之间的操作
mov byte ptr [si],0ah ;byte ptr说明是字节操作
mov ds,ax ;将ax中内容传递个段寄存器ds,属于段寄存器(seg)和寄存器之间的传送
mov [si],al ;将al中的内容传送给ds:[si]指向的内存单元中
;[bp] ---> ss:[bp] [si] ---> ds:[si] [bx] ---> ds:[bx]
- XCHG指令
作用:将一个字节或者自己的源操作数和目的操作数相交换
;使用格式
;XCHG OPRD1,OPRD2
; 目的 源
XCHG reg,reg
XHCG reg,mem
XCHG mem,reg
;XCHG指令可以交换两个寄存器、寄存器->寄存器中的数据
示例:
xchg al,cl
xchg ax,[bx]
xchg [bx],ax
注意事项:
1.不能同时都为内存操作
2.任何一个寄存器都不能为段寄存器
3.任何一个操作不能使立即数
4.两个操作数的长度必须相等
- 换码指令XLAT
作用:将bx指定的缓冲区、AL指定的位移处的一个字节数据取出赋值给AL
;使用格式
xlat ;al<-ds:[bx+al] [bx+al]:整体作为偏移地址,al作为地址位移
示例:
mov bx,0100H
mov al,03H
xlat ;al<-ds:[0100+03]H
- 堆栈指令PUSH、POP
作用:将寄存器或者储存器中的数据按照堆栈操作的规则进行出入栈
;使用格式
;PUSH 源操作数
;POP 目的操作数
PUSH reg\mem\seg
POP reg\mem\seg
示例:
PUSH ax ;将ax寄存器中的数据压入到栈中
POP ax ;将栈顶中的数据出栈到ax中
注意事项:
1.当栈为空时能不进行出栈
2.指令的操作数必须是16位,即不能使用al这种8位寄存器
- 地址传送指令LEA LDS LES
作用:将对应的地址表示送入对应的寄存器中
;使用格式
LEA reg,mem
LDS reg,mem
LES reg,mem
示例:
mov bx,0400H
mov si,3CH
lea bx,[bx+si+0f62h]
;bx = 0400H+003CH+0f62H = 139EH
LDS:将mem指定的字送入指定的寄存器中,并且DS=mem+2
LES:将mem指定的字送入指定的寄存器中,并且ES=mem+2
- 标志寄存器传送指令 LAHF、SAHF、PUSHF、POPF
作用:标志寄存器传送指令用来传送标志寄存器FLAGS的内容,方便对各个标志位的直接操作,首先需要了解一下什么是标志寄存器:
标志寄存器:用来存储相关指令的某些执行结果,用来为CPU执行相关指令提供依据并可以以此来控制CPU的相关行为。8086中的标志寄存器为PSW(程序状态字)。该寄存器并不是用来存放普通数据的,而是按位起作用,每一位都有专门的含义。(如下图)SF:符号标志位,如果执行结果为负数,则SF=1,非负则SF=0;ZF:零标志位,如果执行结果为0,则ZF=1,否则ZF=0;PF:奇偶标志位,如果执行结果中所有二进制位中1的个数为偶数则PF=1,否则PF=0;CF:进/借位标志位,一般来说,在进行无符号的运算时,如果数据最高位产生了进位或者借位CF=1,否则CF=0;OF:溢出标志位,运算结果超出了机器所能表示的范围称为溢出;DF:方向标志位,在串处理指令操作后控制DI、SI的增减,如果DF=0,则前述寄存器递增,否则递减,注意DF的值由程序员通过CLD(0)和STD(1)指令设定;TF:调试标志位,当TF=1时,处理器每次只执行一条指令,即单步执行;IF:中断允许标志位,用来控制8086CPU是否可以接受外部中断请求。IF=1,则能响应外部中断,否则屏蔽外部中断;AF:辅助进位标志位,运算过程中看第三位,不论长度多少。如果最后四位向前有进位/借位,AF=1,否则AF=0;

;使用格式 直接输入即可
;低8位传送
LAHF ;将标志寄存器的低字节传送给寄存器AH;SF/ZF/AF/PF/CF状态标志位分别送入AH的第7/6/4/2/0位,而AH的第5/3/1位任意
SAHF ;SAHF将AH寄存器内容送FLAGS的低字节;用AH的第7/6/4/2/0位相应设置SF/ZF/AF/ PF/CF标志
;16位传送
PUSHF ;PUSHF指令将标志寄存器的内容压入堆栈,同时栈顶指针SP减2
POPF ;POPF指令将栈顶字单元内容送标志寄存器,同时栈顶指针SP加2
- 输入输出指令 IN、OUT
8086通过输入输出指令与外设进行数据交换,呈现给程序员的外设是端口(Port),即I/O地址
8086的寻址方式
1.直接寻址:只用于寻址00H~FFH前256个端口,操作数i8表示端口号
2.间接寻址:可用于寻址全部64K个端口,DX寄存器的值就是端口号
对大于FFH的端口只能采用间接寻址方式
;使用格式
;字节输入
IN al,i8 ;AL←I/O端口(i8直接寻址)
IN al,DX ;AL←I/O端口(DX间接寻址)
;字输入
IN ax,i8 ;AX←I/O端口(i8直接寻址)
IN ax,dx ;AX←I/O端口(DX间接寻址)
-----------------------------------------------
;字节输出
OUT i8,al ;I/O端口←AL(i8直接寻址)
OUT dx,al ;I/O端口←AL(DX间接寻址)
;字输出
OUT i8,ax ;I/O端口←AX(i8直接寻址)
OUT DX,AX ;I/O端口←AX(DX间接寻址)
下列程序可以从CPU中的RAM中读取月份和日期(保存方式位BCD码),可以自行测试:
mov al,8
out 70,al
in al,71 ;这三句可以将月份保存在al中
mov ah,al
mov al,7
out 70,al
in al,71 ;这三句可以将日期保存在al中
2. 算数运算指令
指令包括:ADD、ADC、INC、SUB、SBB、DEC、CMP、NEG、MUL、IMUL、DIV、IDIV、DAA、DAS、AAA、 AAS、AAM、AAD、CBW、CWD重点掌握:ADD、ADC、INC、SUB、SBB、DEC、CMP
- 加法指令ADD、ADC、INC
;使用格式
ADD reg,imm/reg/mem
ADD mem,imm/reg
;reg<-reg+reg/mem/imm mem<-mem+reg/imm
--------------------------------
ADC reg,imm/reg/mem
ADC mem,imm/reg
;reg<-reg+imm/reg/mem+CF mem<-mem+imm/reg+CF
;ADC指令将源与目的操作数相加,再加上CF标志,结果送到目的操作数,ADC指令主要与ADD配合
--------------------------------
INC reg/mem
;reg/mem<-reg/mem+1
示例:
mov ax,0123
add ax,ax ;ax<-ax+ax
---------------------------------------------------
mov ax,4652h ;ax=4652h
add ax,0f0f0h ;ax=3742h,CF=1
mov dx,0234h ;dx=0234h
adc dx,0f0f0h ;dx=f325h,CF=0
---------------------------------------------------
inc bx ;bx<-bx+1
INC指令不影响进位CF标志,按定义设置其他状态标志
- 减法指令 SUB、SBB、DEC
;使用格式
SUB reg,imm/reg/mem
SUB mem,imm/reg
;reg<- reg-imm/reg/mem mem<- mem-imm/reg
----------------------------------------------------
SBB reg,imm/reg/mem
SBB mem,imm/reg
;reg<-(reg-(imm/reg/mem)-CF) mem<-mem-imm/reg-CF
----------------------------------------------------
DEC reg/mem
;reg/mem<-reg/mem-1
DEC指令不影响进位CF标志,按定义设置其他状态标志
比较指令 CMP
CMP指令将目的操作数减去源操作数,按照定义相应设置状态标志
;使用格式
CMP reg,imm/reg/mem
CMP mem,imm/reg
;reg-imm/reg/mem mem-imm/re
示例:
cmp al,100 ;al-100jz below;al==100,跳转到below执行sub al,100;al!=100, al<-al-100inc ah ;ah<-ah+1
below: ...
CMP指令执行的功能与SUB指令相同,但结果不回送目的操作数
- 其余指令
乘法指令:MUL、IMUL。MUL无符号乘法(字/字节),IMUL有符号乘法(字/字节);
被乘数被隐藏在al/ax中,结果溢出的数据被保存在ah/dx中除法指令:DIV、IDIV。DIV无符号除法(字/字节),IDIV有符号除法(字/字节);除数放在8/16位reg或内内存单元中,被除数默认在AX/(DX-AX)中(16位),结果:AL放商,AX放余数/AX放商,DX放余数求反指令:NEG。以0减去操作数;符号扩展指令:CBW、CWD。CBW字节装换为字,CWD、字转为双字节;
将al/ax的数据扩展为字数据(前者扩展到ah中,后者扩展到dx中)十进制调整指令:DAA、DAS、AAA、AAS、AAM、AAD。DAA/DAS将加/减之后的结果调整为压缩BCD码
AAA/AAS将加/减之后的结果调整为非压缩BCD码
AAM/AAD将乘/除之后的结果调整为非压缩BCD码;
3. 位运算指令
指令包括:AND、OR、XOR、NOT、TEST、SHL、SAL、SHR、SAR、RCL、RCR、ROL、ROR
- 逻辑运算 AND、OR、XOR、NOT、TEST
将操作数进行按位的运算,逻辑运算指令对操作的要求大多和MOV指令相同。
非 运算指令要求操作数不能是立即数!
;使用格式
AND target,source ;按位与 1 and 1 == 1 1 and 0 == 0 0 and 0 == 0
OR target,source ;按位或 1 or 1 == 1 1 or 0 == 1 0 or 0 == 0
XOR target,source ;按位异或 1 xor 1 == 0 0 xor 1 == 1 0 xor 0 == 0
;将source与target进行相应操作之后的结果保存到target中
TEST target,source
;将source与target进行按位与操作,根据结果设置标志位但是不保存结果
NOT target ;按位非 1 --> 0 0--> 1
;将target中取反后的结果放入到target中
示例:
and bl,[bX] ;bl<-bl and ds:[bx]
or ax,bx ;ax<-ax or bx
xor ax,bx ;ax<-ax xor bx
test ax,8000H;ax and 8000H
not ax ;ax<-not ax
注意事项:
1.通常使用AND指令对指定位清0
2.通常使用OR指令对指定位置1
3.通常使用NOT指令将某个数据取反码,再加1就得到补码
4.通常使用XOR指令来取反某位
5.通常使用TEST指令来测试指定位置是0还是1
6.非运算对标志位不影响,其余指令对标志均会产生影响
- 移位运算
非循环移位 SHL、SAL、SHR、SAR
;左移:算术左移和逻辑左移
;使用格式
SAL reg/mem,1
SAL reg/mem,cl ;有符号数、算术左移,如果采用立即数,立即数必须是1,下述同理
SHL reg/mem,1
SHL reg/mem,cl ;无符号数、逻辑左移
;将数据按照指定的位数往左按位移动,如下图

示例:
mov bl,f8
sal bl,1
;结果 CF=1,bl = F0
;右移:算术右移和逻辑右移
;使用格式
SAR reg/mem,1
SAR reg/mem,cl ;有符号数、算术右移
SHR reg/mem,1
SHR reg/mem,cl ;无符号数、逻辑右移
;将数据按照指定的位数往左按位移动,如下图

示例:
mov bl,f8
sar bl,1
;CF = 0,结果为:bl = fC
循环移位 RCL、RCR、ROL、ROR
;带进位的循环移位
;循环左移
RCL reg/mem,1
RCL reg/mem,cl
;循环右移
RCR reg/mem,1
RCR reg/mem,cl
;带进位循环移位,如下图

示例:
mov al,f8
rcl al,1
;CF = 1,al = f0
rcl al,1
;CF = 1,al = E1
;不带进位的循环移位
;循环左移
ROL reg/mem,1
ROL reg/mem,cl
;循环右移
ROR reg/mem,1
ROR reg/mem,cl
;不带进位循环移位,如下图

示例:
mov al,f8
rol al,1
;CF = 1,al = f1
循环移位会影响OF标志位a
4. 串操作指令
指令包括:MOVS、LODS、STOS、CMPS、SCAS、REP
串的概念:串是连续存放在内存中的字节块或字块。每个串有一个起始地址和长度,待操作的数据串
称为源串,目的地址称为目标串。
串指令操作的特点:- 源操作数用寄存器SI寻址,默认在数据段DS中,但允许段超越:DS:[SI]- 目的操作数用寄存器DI寻址,默认在附加段ES中,不允许段超越:ES:[DI]- 每执行一次串操作指令,SI和DI将自动修改:±1(对于字节串)或±2(对于字串)执行指令CLD指令后,DF = 0,地址指针增1或2执行指令STD指令后,DF = 1,地址指针减1或2- 数据快长度值由CX指定
- 串传送指令 MOVS
作用:把字节/子操作数从主存的源地址传送至目的地址
;使用格式,指令包括 MOVSB、MOVSW
MOVSB ;字节串传送, ES:[DI]<-DS:[si];DF==0, SI<-SI+1,DI<-DI+1,DF==1,则递减
MOVSW ;字串传送:ES:[DI]<-DS:[SI];DF==0, SI<-SI+2,DI<-DI+2,DF==1,则递减
示例:
mov si,offset source ;获得源偏移地址mov di,offset destination ;获得目的偏移地址mov cx,0064 ;cx<-传送次数cld ;置DF=0,地址增加
again: movsb ;传送一个字节dec cx ;传送次数减1jnz again ;判断传送次数cx是否为0 不为0,则到again位置执行指令 否则,结束

- 串存储指令 STOS
作用:把AL或AX的数据传送至目的地址
;使用格式,指令包括 STOSB、STOSW
STOSB ;字节串存储:ES:[DI]<-AL;DI<-DI±1
STOSW ;字串存储:ES:[DI]<-AX;DI<-DI±2
示例:
mov ax,0mov di,0mov cx,8000h ;cx<-传送次数(32×1024)cld ;DF=0,地址增加
again: stosw ;传送一个字dec cx ;传送次数减1jnz again ;传送次数cx是否为0
- 串读取指令 LODS
作用:将字节/字从数据段中读取出来保存在AL或者AX中
;使用格式,指令包括 LODSB、LODSW
LODSB ;字节串存储:AL<-DS:[SI];SI<-SI±1
LODSW ;字串存储:AX<-DS:[SI];SI<-SI±2
- 串比较指令 CMPS
作用:将主存中的源操作数减去目的操作数,以便设置标志,进而比较两操作数之间的关系
;使用格式,指令包括 CMPSB、CMPSW
CMPSB ;字节串比较:DS:[SI]-ES:[DI];SI<-SI±1,DI<-DI±1
CMPSW ;字串比较:DS:[SI]-ES:[DI];SI<-SI±2,DI<-DI±2
- 串扫描指令 SCAS
;使用格式,指令包括 SCASB、SCASW
SCASB ;字节串比较:AL-ES:[DI];DI<-DI±1
SCASW ;字串比较:AX-ES:[DI];DI<-DI±2
示例:
mov di,offset stringmov al,20h ;空格对应的ASCII码值为20hmov cx,countcld
again: scasb ;搜索jz found ;为0(ZF=1),发现空格dec cx ;不是空格jnz again ;搜索下一个字符
found: ... ;不含空格,则继续
-
重复前缀指令 REP
重复前缀 REP 可以加到串传送操作指令时。REP 前缀是的每次执行串指令后CX-1。CX-1后,重复执行串指令,直到CX值为0时,指令才终止。
;使用示例 REP、REPZ、REPNZ、REPE、REPNE
rep movsx ;无条件重复直到cx==0
repz cmpsx ;无条件重复直到CX==0 / ZF == 0
repnz cmpsx ;无条件重复直到CX==0 / ZF == 1
repe cmpsx ;不断比较,直到CX==0 / ZF == 0
repne cmpsx ;不断比较,直到CX==0 / ZF == 1
示例:
mov si,offset source
mov di,offset destination
mov cx,100 ;cx<-传送次数
cld
rep movsb
;----------------------------------------mov si,offset string1mov di,offset string2mov cx,countcldrepz cmpsb ;重复比较两个字符jnz unmat ;字符串不等,转移mov al,0 ;字符串相等,设置00hjmp output ;转向output
unmat: mov al,0ffh ;设置ffh
output: mov result,al ;输出结果标记
5. 控制转移指令

- 无条件转移指令 JMP
作用:跳转到对应的指令地址
;使用格式
jmp label ;IP<-IP+位移量
jmp reg/mem ;IP<-reg/mem reg以及mem都需要是16位
jmp far ptr label ;CS=label的段地址,IP=label的偏移地址
jmp far ptr mem ;CS=[mem+2],IP=[mem]
示例:
label:...jmp label
;此时往上跳转,则位移量为负数
mov ax,4
jmp ax ;ip<-4
;------------------------------------
mov word ptr [bx],0
mov word ptr [bx+2],1500
jmp far ptr [bx] ;CS = 1500, IP = 0
当指令只需要在当前代码段范围内转移时(+-32KB),不需要更改CS地址,只需要修改IP地址实际编程时,汇编程序会根据目标地址的距离,自动处理成短转移/近转移/远转移程序员可用操作符short/near ptr/far ptr 强制
条件转移指令 JCC
作用:根据运算结果跳转到对应的指令地址(下图为jcc指令集以及判断条件含义)


示例:
mov di,offset stringmov al,20h ;空格对应的ASCII码值为20hmov cx,countcld
again: scasb ;搜索jz found ;为0(ZF=1),发现空格dec cx ;不是空格jnz again ;搜索下一个字符
found: ... ;不含空格,则继续执行
-
计数器CX为0跳转指令 JCXZ
CX寄存器通常在程序中用作计数器,JCXZ指令用来判断计数是否为0
;使用格式
jcxz label ;CX=0,发生转移:IP<-IP+8位位移量;CX≠0,顺序执行
- 循环指令 LOOP、LOOPZ、LOOPNZ、LOOPNE
LOOP label ;CX←CX-1,;CX≠0,循环到标号label
LOOPZ label ;CX←CX-1,;CX≠0且ZF=1,循环到标号label
LOOPNZ label ;CX←CX-1,;CX≠0且ZF=0,循环到标号label
示例:
mov cx,count ;设置循环次数mov si,offset stringxor bx,bx ;bx清0,用于记录空格数mov al,20h
again: cmp al,es:[si]jnz next ;ZF=0,非空格,转移inc bx ;ZF=1,是空格,个数加1
next: inc siloop again ;字符个数减1,不为0继续循环
子程序跳转指令 CALL
子程序:子程序是完成特定功能的一段程序 当主程序(调用程序)需要执行这个功能时,采用CALL调用指令转移到该子程序的起始处执行,当运行完子程序功能后,采用RET返回指令回到主程序继续执行
;使用格式
CALL label
CALL reg/mem ;SP<-SP-2,SS:[SP]<-IP,jmp labelreg/mem
CALL far ptr label
CALL far ptr mem ;SP<-SP-2,SS:[SP]<-IP;SP<-SP-2,SS:[SP]<-CS
CALL指令其实是做了两件事,执行到CALL时先将CALL指令的下一条指令的IP入栈,在JMP到指定的函数的地址处
- 子程序返回指令 RET
;使用格式
RET(或者RETN) ;无参数段内返回
RET(或者RETN) i16 ;有参数段内返回
RETF ;无参数段间返回
RETF i16 ;有参数段间返回
段内返回时需要出栈 ip<-ss:[sp], sp<-sp+2段间返回时需要出栈 ip<-ss:[sp], sp<-sp+2 cs<-ss:[sp], sp<-sp+2带参数则:在最后sp<-sp+i16注意call far ptr 需要与 retf 配合使用
- 中断指令 INT
作用:改变程序的执行顺序
;使用示例
INT i8 ;8位的数据
8086的中断:8086可以管理256个中断,各种中断用一个向量编号来区别,上述的i8即代表一个中断标号除法错中断:执行除法指令,结果溢出产生的 0 号中断指令中断:执行中断调用指令INT i8产生的 i8 号中断断点中断:用于断点调试(INT 3)的 3 号中断溢出中断:执行溢出中断指令,OF=1产生的 4 号中断单步中断:TF=1在每条指令执行后产生的 1 号中断
6. 处理机控制指令

;使用格式
clc ;复位进位标志位 CF<-0
stc ;置位进位标志位 CF<-1
cmc ;求反进位标志位 CF<-~CF
cld ;复位方向标志位 DF<-0 串操作指令中使用
std ;置位方向标志位 DF<-1
cli ;复位中断标志位 IF<-0 用于控制可屏蔽中断的允许和禁止
sti ;置位中断标志位 IF<-1
NOP ;空操作,但是占用一个字节存储单元,空耗一个指令执行周期
HLT ;使CPU进入暂停状态,这时CPU不执行任何操作。可用来程序中等待中断,一般不使用
LOCK ;指令前缀,可以放在任何指令前。在当前指令未执行完,8086输出引脚被封锁,其他控制器不能控制总线
ESC 六位立即数,reg/mem ;把浮点指令交给浮点处理器
WAIT ;该指令使处理机处于空转状态,它也可以用来等待外部中断发生,但中断结束后仍返回WAIT指令继续等待
7. 伪指令

-
assume:说明段所对应的段寄存器
使用示例:assume cd:codeseg -
段定义: segment … ends
使用示例:
codeseg segment
…
codeseg ends -
源程序结束:end
编译程序在编译时编译到end时会停止编译 -
变量定义:DB、DW、DD
使用示例:
data segmentvar dd 100001h ;定义了一个双字 var为变量名代表了偏移地址dw 100h ;定义了字变量db 0h ;定义了字节变量
data endsstack segmentdw 0,0,0,0,0,0,0,0 ;每个0都是占字空间
stack ends
相关文章:
汇编语言程序设计(四)之汇编指令
系列文章 汇编语言程序设计(一) 汇编语言程序设计(二)之寄存器 汇编语言程序设计(三)之汇编程序 汇编指令 1. 数据传输指令 指令包括:MOV、XCHG、XLAT、LEA、LDS、LES、PUSH、POP、PUSHF、LA…...
Vant2 源码分析之 vant-sticky
前言 原打算借鉴 vant-sticky 源码,实现业务需求的某个功能,第一眼看以为看懂了,拿来用的时候,才发现一知半解。看第二遍时,对不起,是我肤浅了。这里侧重分析实现原理,其他部分不拓展开来&…...
【自然语言处理】【大模型】大语言模型BLOOM推理工具测试
相关博客 【自然语言处理】【大模型】大语言模型BLOOM推理工具测试 【自然语言处理】【大模型】GLM-130B:一个开源双语预训练语言模型 【自然语言处理】【大模型】用于大型Transformer的8-bit矩阵乘法介绍 【自然语言处理】【大模型】BLOOM:一个176B参数…...
云桌面技术初识:VDI,IDV,VOI,RDS
VDI(Virtual Desktop Infrastucture,虚拟桌面架构),俗称虚拟云桌面 VDI构架采用的“集中存储、集中运算”构架,所有的桌面以虚拟机的方式运行在服务器硬件虚拟化层上,桌面以图像传输的方式发送到客户端。 …...
基于本地centos构建gdal2.4.4镜像
1.前言 基于基础镜像构建gdal环境一般特别大,一般少则1.6G,多则2G甚至更大,这对于镜像的迁移造成了极大的不便。究其原因在于容器中有大量的源码文件以及编译中间过程文件,还要大量编译需要的yum库。本文主要通过在centos系统上先…...
生产环境线程问题排查
线程状态的解读RUNNABLE线程处于运行状态,不一定消耗CPU。例如,线程从网络读取数据,大多数时间是挂起的,只有数据到达时才会重新唤起进入执行状态。只有Java代码显式调用sleep或wait方法时,虚拟机才可以精准获取到线程…...
Day908.joinsnljdist和group问题和备库自增主键问题 -MySQL实战
join&snlj&dist和group问题和备库自增主键问题 Hi,我是阿昌,今天学习记录的是关于join&snlj&dist和group问题和备库自增主键问题的内容。 一、join 的写法 join 语句怎么优化?中,在介绍 join 执行顺序的时候&am…...
算法 - 剑指Offer 丑数
题目 我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。 解题思路 这题我使用最简单方法去做, 首先我们可以获取所有2n,3n,5*n的丑数,只是我们这里暂时无法排序,并且可能…...
【ONE·C || 文件操作】
总言 C语言:文件操作。 文章目录总言1、文件是什么?为什么需要文件?1.1、为什么需要文件?1.2、文件是什么?2、文件的打开与关闭2.1、文件指针2.2、文件打开和关闭:fopen、fclose2.3、文件使用方式3、文…...
cmd窗口中java命令报错。错误:找不到或无法加载主类 java的jdk安装过程中踩过的坑
错误: 找不到或无法加载主类 HelloWorld 遇到这个问题时,我尝试过网上其他人的做法。有试过添加classpath,也有试过删除classpath。但是依然报错,这里javac可以编译通过,说明代码应该是没有问题的。只是在运行是出现了错误。我安装…...
Breathwork(呼吸练习)
查了下呼吸练习相关内容,做个记录。我又在油管学习啦。 喜欢在you. tube看一些self-help相关的内容。比如学习方法、拉伸、跑步、力量举、自重锻炼等等。 总是听Obi Vicent说起Breathwork,比如: My 6am Morning Routine | New Healthy Habit…...
taobao.itemprops.get( 获取标准商品类目属性 )
¥开放平台基础API不需用户授权 通过设置必要的参数,来获取商品后台标准类目属性,以及这些属性里面详细的属性值prop_values。 公共参数 请求地址: HTTP地址 http://gw.api.taobao.com/router/rest 公共请求参数: 公共响应参数: 请求参数 点…...
QT配置安卓环境(保姆级教程)
目录 下载环境资源 JDK1.8 NDK SDK 安装QT 配置环境 下载环境资源 JDK1.8 介绍JDK是Java开发的核心工具,为Java开发者提供了一套完整的开发环境,包括开发工具、类库和API等,使得开发者可以高效地编写、测试和运行Java应用程序。 下载…...
【uni-app教程】八、UniAPP Vuex 状态管理
八、UniAPP Vuex 状态管理 概念 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。 应用场景 Vue多个组件之间需要共享数据或状态。 关键规则 State:…...
同花顺测试面经(30min)
大概三十分钟,面试官人还挺好的 1.自我介绍 2.详细问你了自我介绍中的一个实习经历 3.对我们公司有什么了解 !!(高频) 4.对测试有什么看法,为什么选测试 5.黑盒白盒分别是什么 6.对测试左移有什么看法…...
C++-简述#ifdef、#else、#endif和#ifndef的作用
回答如下: #ifdef,#else,#endif和#ifndef都是预处理指令,用于条件编译。#ifdef:这个指令用来判断一个宏是否已经被定义过,如果已经定义过,则执行后面的代码块。#else:这个指令一般与…...
VictoriaMetrics 集群部署
官网 ## 官网 https://github.com/VictoriaMetrics/VictoriaMetrics 集群角色详解 VictoriaMetrics 集群模式。主要由 vmstorage ,vminsert,vmselect 三部分组成,这三个组件每个组件都可以单独进行扩展。其中: vmstorage 负责提供数据存储服务vminsert 是数据存…...
【基于感知损失的无监督泛锐化】
PercepPan: Towards Unsupervised Pan-Sharpening Based on Perceptual Loss (PercepPan:基于感知损失的无监督泛锐化) 在基于神经网络的全色锐化文献中,作为地面实况标签的高分辨率多光谱图像通常是不可用的。为了解决这个问题…...
在vercel上用streamlit部署网站
Verce和Streamlit都是非常流行的Web应用程序部署平台。以下是从零开始在Vercel上部署Streamlit应用程序的一些基本步骤。 安装 Streamlit 在本地计算机上安装Streamlit。可以轻松地通过在命令行中运行以下命令来安装: pip install streamlit为 Streamlit 应用程序…...
华为OD机试题 - 斗地主(JavaScript)| 含思路
更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜索引擎搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 华为OD机试题 最近更新的博客使用说明本篇题解:斗地主题目输入输出描述示例一输入输出示例二输…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...
WEB3全栈开发——面试专业技能点P4数据库
一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库,基于 mysql 库改进而来,具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点: 支持 Promise / async-await…...
