汇编语言程序设计(四)之汇编指令

news/2024/6/3 19:50:44 标签: 汇编

系列文章

汇编语言程序设计(一)
汇编语言程序设计(二)之寄存器
汇编语言程序设计(三)之汇编程序

汇编指令

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寄存器  上述的400FF都为立即数,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-100
    jz below
    ;al==100,跳转到below执行
    sub al,100
    ;al!=100,   al<-al-100
    inc 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,地址指针增12
    执行指令STD指令后,DF = 1,地址指针减12
  

 - 数据快长度值由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      ;传送次数减1
        jnz 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,0
        mov di,0
        mov cx,8000h    ;cx<-传送次数(32×1024)
        cld             ;DF=0,地址增加
again:  stosw           ;传送一个字
        dec cx          ;传送次数减1
        jnz 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 string
        mov al,20h  ;空格对应的ASCII码值为20h
        mov cx,count
        cld
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 string1
    mov di,offset string2
    mov cx,count
    cld
    repz cmpsb      ;重复比较两个字符
    jnz unmat       ;字符串不等,转移
    mov al,0        ;字符串相等,设置00h
    jmp 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 string
        mov al,20h  ;空格对应的ASCII码值为20h
        mov cx,count
        cld
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 string
        xor bx,bx   ;bx清0,用于记录空格数
        mov al,20h
again:  cmp al,es:[si]
        jnz next    ;ZF=0,非空格,转移
        inc bx      ;ZF=1,是空格,个数加1
next:   inc si
        loop 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 segment
  var dd 100001h    ;定义了一个双字 var为变量名代表了偏移地址
   dw 100h          ;定义了字变量
   db 0h            ;定义了字节变量 
data ends

stack segment
  dw 0,0,0,0,0,0,0,0    ;每个0都是占字空间
stack ends

http://www.niftyadmin.cn/n/123203.html

相关文章

Javalin解构

Javalin Javalin是一个轻量级http框架&#xff0c;我们可以很容易的了解请求的处理过程及其设计&#xff0c;具有较高的学习意义。 从demo说起 public static void main(String[] args) {Javalin app Javalin.create(config -> {System.out.println("用户配置"…

既然有MySQL了,为什么还要有Redis?

目录专栏导读一、同样是缓存&#xff0c;用map不行吗&#xff1f;二、Redis为什么是单线程的&#xff1f;三、Redis真的是单线程的吗&#xff1f;四、Redis优缺点1、优点2、缺点五、Redis常见业务场景六、Redis常见数据类型1、String2、List3、Hash4、Set5、Zset6、BitMap7、Bi…

二分查找算法

感谢“五点七边”工作室的算法讲解&#xff0c;详细内容可以参考视频讲解 二分查找为什么总是写错&#xff1f;_哔哩哔哩_bilibili 此处仅是个人学习总结 以target等于5为例&#xff0c;输入: 1 2 3 5 5 5 8 9 1. 找到第一个 > target 的元素 判断条件 < target&am…

如何写好单测

1、为什么要写单测&#xff1f; 单测即单元测试&#xff08;Unit Test&#xff09;&#xff0c;是对软件的基本组成单元进行的测试&#xff0c;比如函数、过程或者类的方法。其意义是&#xff1a; 功能自测&#xff0c;发现功能缺陷自我Code Review测试驱动开发促进代码重构并…

taobao.item.joint.img( 商品关联子图 )

&#xffe5;开放平台免费API必须用户授权 关联一张商品图片到num_iid指定的商品中传入的num_iid所对应的商品必须属于当前会话的用户商品图片关联在卖家身份和图片来源上的限制&#xff0c;卖家要是B卖家或订购了多图服务才能关联图片&#xff0c;并且图片要来自于卖家自己的…

人脸网格/人脸3D重建 face_mesh(毕业设计+代码)

概述 Face Mesh是一个解决方案&#xff0c;可在移动设备上实时估计468个3D面部地标。它利用机器学习&#xff08;ML&#xff09;推断3D面部表面&#xff0c;只需要单个摄像头输入&#xff0c;无需专用深度传感器。利用轻量级模型架构以及整个管道中的GPU加速&#xff0c;该解决…

Cookie和Session

1. Cookie饼干 1.1 什么是Cookie&#xff1f; Cookie翻译过来就是饼干的意思Cookie是服务器通知客户端保存键值对的一种技术客户端有了Cookie后&#xff0c;每次请求都发送给服务器每个Cookie的大小不能超过4kb 1.2 如何创建Cookie BaseServlet 程序 package com.gdhd;impo…

嵌入式Linux内核代码风格(二)

第九章&#xff1a;你已经把事情弄糟了 这没什么&#xff0c;我们都是这样。可能你的使用了很长时间Unix的朋友已经告诉你“GNU emacs”能 自动帮你格式化C源代码&#xff0c;而且你也注意到了&#xff0c;确实是这样&#xff0c;不过它所使用的默认值和我们 想要的相去甚远&a…