常用汇编指令集

寄存器

在这里插入图片描述

如上是OD展示的寄存器,逐条说明常用的寄存器和标志位含义:

EIP:寄存器指向即将要执行的指令的地址(EIP中的地址,就是下一步要执行指令的地址)
ESP:里面的内容永远指向堆栈的最顶端
EAX:(十六进制EAX=12345678)(?AX=5678和和?AH=56和?AL=78)		AX是最后四位,AL是最后两位
ECX:和上面EAX一样
EBX:和上面EAX一样
EDX:和上面EAX一样注:EIP是不能直接修改的,必须在窗口选中某处右键设置为新的EIP有符号就是负数,无符号就是正数O标志:溢出标志位(O 0):当指令运算结果,即操作改变了符号的时候返回错误值设置的(0 1  :就是二进制的符号位改变了,也就是正数变负数)A标志:辅助进位标志P标志:基偶标志位(当指令运算结果,窗口中执行的结果用二进制表示,如果1的总个数是双数那P标志位为1)Z标志:当指令运算结果为0的话Z标志位就是1S标志:符号标志:当指令运算结果为负数的话,S标志结果为1C标志:进位标志位(也可以叫借位标志位);某条指令运算的无符号运算结果,超过最大值(无符号最大数:FFFFFFFF),也就是EAX=FFFFFFFF,add eax,1,超过最大了,那么C标志位就是1了为什么  EAX=FFFFFFFFadd eax,1EAX=00000000		变成0了?因为进位了,那个1在EAX外面了即:1 00000000T标志:跟踪标志位D标志:方向标志位CF就是无符号溢出标志位,OF是有符号溢出标志位,拿16位举例,范围0X0000~0XFFFF,既然0减1,应该等于-1,那么就是溢出了

指令集

NOP指令:空指令使用位置:更改call,在字节的计算上(也就是HEX 数据栏中:2个为一组算一个字节),修改导致(数据栏中)不足的字节用NOP自动填充下去90NOP填充是无操作的,00NOP(一个指令)填充是有操作的NOP的机器码(二进制)表示:HEX的90
PUSH指令:将push指令后面的数据压入到堆栈中
POP指令:把该数据存入(变为)堆栈的最顶上,类似于剪切(pop eax、pop ebx、等等)
PUSHAD指令:将寄存器的从上向下的顺序,依次push到堆栈中,最后EDI在堆栈中的最顶端(寄存器顺序:EAX——>EDI,堆栈内对应:EAX数据——>最顶EDI数值)
POPAD指令:将堆栈内的数值从下向上pop到寄存器中(寄存器顺序:EDI——>EAX,堆栈内对应:最顶——>第八位)
PUSHA和POPA都是16位的操作指令,PUSHAD和POPAD是32位的;两个其实都差不多
(主要PUSHA和POPA,指的是EAX中的EX、CX、DX、BX、SP、BP、SI、DI,是后八位数值)
MOV指令:赋值操作指令(可以说是复制)mov eax,ecx:将ecx中的内容复制给eax,让eax中的内容与ecx相同。dword:4字节长度word:2字节长度/mov dword ptr ds:[0x402000],eax		// 4字节长度mov word ptr ds:[0x402000],ax		// 2字节长度mov byte ptr ds:[0x402000],al		// 1字节长度byte// dword word byte决定需要复制的数值/
MOVSX指令:(会判断原来的数值是正还是负,再根据正负用0000还是FFFF)MOVSX EAX,BX		// 2字节BX复制到4字节EAX,因为填充不足,所以会用占位符来占位(负数的二进制符号为1,会用FFFF填充剩下的字符)至于具体是0000还是FFFF填充,那么就看EAX中的前4字节是否是正数(00001234)还是负数(0000A123)了(这里A123用F填充EAX,1234用0填充EAX)16位的最大正数:7FFF,负数开始是:8000	 32位的最大正数:7FFFFFFF,负数开始是:80000000	 符号位0还是1决定正负(MOV指令是不行的)
MOVZX指令:(不考虑正负,直接用0000填充)
LEA指令:(两个数字为一个字节)mov 寄存器,[401000]			//有[],取得是[]内的地址的数值,在lealea 寄存器,dword ptr ds:[ecx+0x16]			// 这里的括号是取ecx+0x16的结果,相当于:lea 寄存器,ecx+0x16lea意思就是:取计算结果的地址lea指令可以用来将一个内存地址直接赋给目的操作数例如:lea eax,[ebx+8]就是将ebx+8这个地址值直接赋给eax,而不是把ebx+8处的内存地址里的数据赋给eax。(与我们平时使用到的指令涉及到的[]情况是不一样的,看下面的说明即可:)而mov指令则恰恰相反例如:mov eax,[ebx+8]则是把内存地址为ebx+8处的数据赋给eax。说明:如果是:push 0x00401000   那么就是压入这个地址push [00401000]	  那么就是压入这个地址对应的数据的内容(只需要选中地址,右键,在数据窗口中跟随选择,那么就能看到地址对应的数据内容)
XCHG指令:内容交换xchg eax,ebx    结果就是eax的内容变为ebx的,ebx的内容变成eax的。
ADD指令:加法指令ADD EAX,333		// 数据添加ADD EAX,EBX		// 寄存器相加ADD dword ptr ds:[0x402000],0x2	ADD dword ptr ds:[0x402000],ecx			// 0x402000地址的数值和ecx相加,给0x402000地址// 左下数据框中的数据是反着来的,即:14 01 00 00,在寄存器的ECX中就是00 00 01 14
SUB指令:减法指令(和加法一样使用)
ADC指令:ADC EAX,0x5      // 相当于EAX=EAX+0x5+C			// 这个C是进位标志位,为1就加1,为0就加0
SBB指令:SBB EAX,0x2		// 相当于EAX=EAX-0x2-C			// 这个C是进位标志位,为1就加1,为0就加0
INC指令:(递增)inc eax			// 每次执行都会eax自增数值1		// 类似i++
DEC指令:(递减)dec eax			// 每次执行都会eax自减数值1		// 类似i--
MUL指令:(无符号乘法)MUL ECX			// 代表的含义就是:EAX*ECX=EAX和EDX存储// 举例:EAX=FFF FFF9、ECX=0000 0005、那么结果应该是4 FFFF FFDD// 存储的时候,EAX存储FFFF FFDD,EDX存储0000 00040000 0004 FFFF FFDDEDX       EAX
DIV指令:(无符号除法)div cl	(16进制的)// 举例:EAX=0000 0017,ECX=0000 0003// 结果就是:EAX=0000 02 07		// 17/3  熵7余2,那么熵在al,余数在ahdiv cx	(16进制的)// 举例:EAX=0000 0017,ECX=0000 0003// 结果就是:EAX=0000 0007,EDX=0000 0002		// 17/3  熵7余2,那么熵在ax,余数在dxdiv ecx	(32进制的)// 举例:EAX=0000 0017,ECX=0000 0003// 结果就是:EAX=0000 0007,EDX=0000 0002		// 17/3  熵7余2,那么熵在eax,余数在edx
IMUL指令:(有符号的乘法运算(0和F))IMUL al:意义就是al*alIMUL cl:意义就是al*cl// 对此来说,cl取al,cx取ax,ecx取eaxIMUL ax,cx,0x2:意义就是cx*0x2放入ax
IDIV指令:执行的操作:与DIV相同,但操作数必须是带符号的数,商和余数也都是带符号的数,且余数的符号和被除数的符号相同
XADD指令:(交换并相加)(单独交换:XCHG,单独相加:ADD)XADD eax,ecx		// eax和ecx交换数值并相加,将结果存储在eax中
NEG指令:(取反)(即正变负)neg eax			// EAX = 0000 0050变为 FFFF FFB0	// 可以左下的command进行计算:? -121110得到十六进制	-----------------------------------------------------网上说的,二进制的算法:neg指令执行的操作是把eax的每个二进制位取反之后再加1,得到的十六进制就是结果,以F补全空位作用: 将操作数取反再加一, 可以用来求一个数的相反数.格式   NEG OPR执行操作(OPR)<-- -(OPR) 亦即把操作数按位求反后末位加1,因而执行的操作也可表示为:(OPR)<-- 0FFFFH - (OPR) + 1NEG指令对标志的影响与用零作减法的SUB指令一样。-----------------------------------------------------但在OD中可以左下的command进行计算:? 十六进制	例如 ? -50		得到FFFF FFB0		这就是neg的作用,这里的计算是直接取十六进制反数点击EAX修改数据时,有符号位展示的是十进制数,求十进制的取反也可以得到取反对应的十六进制
AND指令:(与)AND EAX,ECX		// EAX与ECX的各个位相与,得到的结果给EAX// 同为1,为1,只要有0就为0
OR指令:(或)OR EAX,ECX		// EAX与ECX的各个位相或,得到的结果给EAX// 只要有1就为1
XOR指令:(异或)XOR EAX,ECX		// EAX与ECX的各个位相异或,得到的结果给EAX// 相同为0,不同为1
NOT指令:(反)		// EAX与ECX的各个位相反,得到的结果给EAXNOT EAX// 各位取反完整的EAX:0000 0000 0000 0000 0000 0000 0101 0000   32位取反: 1111 1111 1111 1111 1111 1111 1010 1111得到十六进制: FFFF FFAF
CMP指令:(比较指令:比较的是地址空间中的数值)第一种情况:Z标志位Z标志:当指令运算结果为0的话Z标志位就是1(变红就是当前得到的结果,白色是上一步的)举例:cmp eax,ecx  	// cmp只做减法,但是结果不放在eax中(即不存储结果),而是将影响Z标志位为0还是1// 本质为 sub eax,ecx做的减法放入eax------------结果相同,Z标志位为1,结果不同,Z标志位为0			问题:通常情况下CMP指令都是比较寄存器里的数值那就是字符串相等的话,也会提示不等。(举例的这个比较寄存器里的字符串,这种例子基本上很少有的)这是因为比较的内容并不是字符串,而是寄存器里的数值而已,也就是字符串的地址,也就是我们语言的字符串指针。如果要比较字符串的话,是需要取寄存器里的数值作为地址,然后再取地址里的值(HEX 数据)进行运算,也就是我们C语言的指针,是相同的意思。第二种情况:S标志位S标志:符号标志:当指令运算结果为负数的话,S标志结果为1cmp eax,ecx   如果走本质是减法运算的话,部分情况下,S标志位也是受影响的第三种情况:cmp eax,[0x数值地址]cmp eax,[402000]——————>>>这样写,OD自动转为cmp eax,dword ptr ds:[0x402000]-------------------------------------------
cmp中需要注意的:1、cmp eax,ecx  这种情况下,比较的是寄存器中的数值是否相等,也就是字符串的地址,也就是我们语言的字符串指针也叫寄存器数值比较2、cmp [0x402000],[0x402011] 或 cmp eax,[402011]其中eax=0x402000要比较字符串的话,是需要取寄存器里的数值作为地址,然后再取地址里的值进行运算,也就是我们C语言的指针,是相同的意思这叫字符串值比较// 将数据地址:402000的地方在左下角写入数据字符串(xxx),在402010的地方写上(aaa);写完一个字符串需要写一个00,因为以00结尾字符串数据,然后原本写402010就写成402011,修改EAX和ECX分别为上面的地址进行cmp,我们发现地址对应的ASCII字符串是不一样的,进行比较发现。Z标志位为红色0,所以不同。// 也就是说,cmp比较的就是十六进制数值地址对应的数据内容,那些地址类似与字符串指针比较操作所谓的做减法,也就是说:例如:402000地址对应的字符串(xxx)的数据的十六进制为:77 88 55 77 44402011地址对应的字符串(aaa)的数据的十六进制为:99 44 F1 33 22// 将(给机器处理)该十六进制转为二进制进行减法运算,或者(给人看)二进制再转为十进制运算
TEST指针:(逻辑比较)test eax,eax		// 意义就是判断eax是否为0// 本质就不是减法了,本质是做了位运算(按位与的方式进行运算:都为1才为1)测试操作数是否为0
cmp与test的区别:cmp判断两地址中的值是否相等test是测试这个数是否为0

(跳转指令),影响跳转的是标志位
OD运行到指定地址:首先左键点击选中该行,然后按下F4就能运行到指定位置
查看辅助的跳转路径线,没开启的话需要开启:调试——>CPU——>显示跳转方向、路径等几个选项

JMP指令:(无条件跳转)不受标志位影响jmp 00401031		// 直接跳过中间代码,到00401031位置,jmp不受标志位影响,直接跳JE指令:(有条件跳转)受标志位影响Z(ZF)标志位1的时候会跳转,为0不跳转。je看的Z标志位JZ指令:(有条件跳转)受标志位影响JZ和JE是相同的,仅仅只是名字不同,实际上输入汇编语句使用JZ也会被OD用JE替代JNE指令:(有条件跳转)受标志位影响Z(ZF)标志位0的时候会跳转,为1不跳转。JNE看也是的Z标志位JNZ指令:(有条件跳转)受标志位影响JNZ和JNE也是相同的,仅仅名字不同,实际上输入汇编语句使用JNZ也会被OD用JNE替代JS指令:(有条件跳转)受标志位影响S(SF)标志位1的时候会跳转,为0不跳转。S:符号标志位cmp eax,ecx		// 本质是eax-ecx,这里eax=0000 0000  ecx=0000 0001,得到-1,S标志位为1js 00401007JNS指令:(有条件跳转)受标志位影响S(SF)标志位0的时候会跳转,为1不跳转。S:符号标志位cmp eax,ecx		// 本质是eax-ecx,这里eax=0000 0001  ecx=0000 0000,得到1,S标志位为0js 00401007JP指令:(有条件跳转)受标志位影响P(PF)标志位1的时候会跳转,为0不跳转。P:奇偶标志位(就是将汇编指令计算得到的结果转为二进制,二进制中1的个数为偶数的话,那么P标志位就是1)// 修改寄存器中的数据时,有符号处为十进制数JPE指令:(有条件跳转)受标志位影响JP和JPE也是相同的,仅仅名字不同,实际上输入汇编语句使用JP也会被OD用JPE替代JNP指令:(有条件跳转)受标志位影响P(PF)标志位0的时候会跳转,为1不跳转。P:奇偶标志位(就是将汇编指令计算得到的结果转为二进制,二进制中1的个数为偶数的话,那么P标志位就是1)// 修改寄存器中的数据时,有符号处为十进制数JPO指令:(有条件跳转)受标志位影响JNP和JPO也是相同的,仅仅名字不同,实际上输入汇编语句使用JNP也会被OD用JPO替代JO指令:(有条件跳转)受标志位影响O(OF)标志位1的时候会跳转,为0不跳转。O:溢出标志位举例:修改EAX=7FFF FFFF,修改ECX=0000 0001add eax,ecxjo 0x00401008// 加一以后,最大正整数变为8000 0000负数,所以O标志位会变为红1 JNO指令:(有条件跳转)受标志位影响O(OF)标志位0的时候会跳转,为1不跳转。O:溢出标志位JB指令:(有条件跳转)受标志位影响C(CF)标志位1的时候会跳转,为0不跳转。C:借位标志位(也可以叫进位标志位)cmp eax,ecxjb 0x00401018		// JB的条件是:第一个操作数小于第二个操作数就跳转发生;即eax小于ecx就跳转// 发生改变的是C(CF)标志位:借位标志位置1,发生了跳转JNB指令:(有条件跳转)受标志位影响C(CF)标志位0的时候会跳转,为1不跳转。C:借位标志位(也可以叫进位标志位)cmp eax,ecxjb 0x00401018		// JB的条件是:第一个操作数大于或等于第二个操作数就跳转发生;即eax大于或等于ecx就跳转// 发生改变的是C(CF)标志位:借位标志位置0,发生了跳转JBE指令:(有条件跳转)受标志位影响受两个标志位影响:C和ZC为1或者Z为1的时候,都可以跳转// cmp eax,ecx  也可以说JBE的条件还有:第一个操作数小于或等于第二个操作数就都可以跳转发生;即eax小于或等于ecx就都可以跳转JA指令:(有条件跳转)受标志位影响实际上也叫JNBE指令,OD中输入JNBE指令的时候,会自动以JA指令填充受两个标志位影响:C和ZC为0与Z为0的时候,才可以跳转// cmp eax,ecx  也可以说JNBE的条件还有:第一个操作数大于第二个操作数才可以跳转发生;即eax大于ecx才可以跳转JL指令:(有条件跳转)受标志位影响S(SF)标志位1的时候会跳转,为0不跳转。S:符号标志位cmp eax,ecxJL 0x401018		// 第一操作数小于第二操作数时就跳转(影响的标志位是S(F)标志位)十进制有符号数比较,JB是转成十进制无符号数进行比较(JB只关心是否进位或者进位)-----可以在寄存器上右键修改看到
CALL指令:(函数指针指令)call就是执行了一个函数,call后面就是函数的地址;call要执行这个函数,执行完再返回这个call---实际上call就是函数调用(F7进入call,也就是函数的执行内容,当遇到return的时候就回到主程序;有个辅助括号,说明哪儿才是结束的return)---包括右下角的堆栈单元里面都会提示返回地址,也就是call的地址(call就是函数的代表,F7进入函数,F8直接执行过函数;很多函数调用,至于哪个才是自定义的函数,使用:选中call,右键跟随那么就能到call地址,不需要分析只需要小键盘的减号键就能回到主程序)如何存储call返回地址的?F7进call看堆栈,堆栈最开始就记录下来的初始开始地址以及最后的返回地址;(例如:返回到  call函数的下一个地址  来自 call内函数的起始地址)简单地说:call就是进入一个函数执行函数代码,return就是出函数举例:PUSH 0x402000retn等价于:jmp 0x402000call可以函数嵌套,所以,要耐心跟call,哪些是有用的自定义的函数或者底层用的函数,哪些就是普通函数不用管的,熟练利用F7进call,和F8单步直接执行call堆栈中的返回地址上面的内容是call的数据,这个数据可能是push压栈的也可能是生成的,需要记住观察堆栈内容
LOOPD指令:(循环指令)举例:xor ecx,ecx 		//清空ecx	// 需要计数器表名循环几次,基本会用ecx做计数器,不约而同的规则mov ecx,6		// 定义ecx循环6次// 开始循环dec ecx			// ecx自减一,每次循环减一test ecx,ecx		// 判断是否为0  或者用cmp ecx,0x0// 等于0就不循环了,执行跳转jne 00401007	LOOP举例:xor ecx,ecxmov ecx,0x6loopd 0x0040100A		// (相当于执行了:dec ecx、test ecx,ecx、jnz 0x0040100A)使用的小差别:首测循环的时候loopd没有减一,导致ecx为1的时候就执行了,而另一种方式首次减一了的所以执行的时候ecx为0的时候执行的-----但是都是循环定义的次数,只是ECX结果有差别LOOP指令:是8位指令,CL
LOOPW指令:是16位指令,CX
LOOPD指令:是32位指令,ECX
shl指令是汇编语言中的一个指令:格式:SHL DST,1 。功能:将目的操作数顺序左移1位或CL寄存器中指定的位数。左移一位时,操作数的最高位移入进位标志位CF,最低位补零。特点:SHL指令将影响CF和OF两个标志位。如果移位次数为1,且移位后的符号位的值发生变化,则OF=1,否则OF=0.如果移位次数不为1,则OF的值不确定。SHL指令使目的操作数逻辑左移一位,最低位用0填充。最高位移入进位标志位,而进位标志位中原来的数值被丢弃。若将1100 1111左移1位,该数就变为 1001 1110SHL指令将影响CF和OF两个标志位。如果移位次数为1,且移位后的符号位的值发生变化,则OF=1,否则OF=0.如果移位次数不为1,则OF的值不确定。例如:BL左移一位。最高位复制到进位标志位,最低位填充0:mov bl, 8FH              ; BL = 10001111bshi bl, 1        ; CF = 1, BL = 00011110b当一个数多次进行左移时,进位标志位保存的是最后移出最高有效位(MSB)的数值。mov al, 10000000bshi al, 2                   ; CF = 0, AL = 00000000b步骤:1.将一个寄存器或者内存单元中过的数据向左移动bit位。2.将溢出的这一位放到CF中。3.最低位用0补充。位元乘法:数值进行左移即行了位元乘法。任何操作数左移 n 位,将该数乘以 2n。例如,十进制数 10 左移两位,其结果与10 * 2n相同。mov al, 10      ; 00001010 shl dl ,2       ; 00101000 
SHR指令SHR指令使目的操作数逻辑右移一位,最高位用0填充。最低位置复制到进位标志位CF,而进位标位中原来的数值被丢弃。例如:AL中的最低位0被复制到进位标志位,而AL中的最高位用0填充。mov al, 0D0H       ; aL = 11010000bshr al, 1		   ; aL = 01101000b, CF = 0在多位移操作中,最后一个移出位0的数值进入进位标志位。mov al, 00000010bshr al, 2                        ; AL = 00000000b, CF = 1总结:当一个数多次进行右移时,进位标志位保存的是最后移出最低有效位的数值。移位指令分为逻辑移位指令和算术移位指令,分别具有左移与右移。
SHL逻辑左移;左移,最低位补0,最高位进入CF。
SHR逻辑右移;右移,最高位补0,最低位进入CF。
SAL算术左移;左移,与SHL功能相同。
SAR算术右移;右移,最高位不变(符号位,若为负,则进1),最低位进入CF。
CDQ扩展指令:是一个让很多人感到困惑的指令,用于扩充EAX的存储范围这个指令把 EAX 的第 31 bit 复制到 EDX 的每一个 bit 上。 它大多出现在除法运算之前。它实际的作用只是把EDX的所有位都设成EAX最高位的值。也就是说,当EAX <80000000, EDX 为00000000;当EAX >= 80000000, EDX 则为FFFFFFFF。例如 :假设 EAX 是 FFFFFFFB (-5) ,它的第 31 bit (最左边) 是 1,执行 CDQ 后, CDQ 把第 31 bit 复制至 EDX 所有 bitEDX 变成 FFFFFFFF这时候, EDX:EAX 变成 FFFFFFFF FFFFFFFB ,它是一个 64 bit 的大型数字,数值依旧是 -5。备注:EDX:EAX,这里表示EDX,EAX连用表示64位数CDQ指令的功能是该指令先把edx的每一位置成eax的最高位,意思就是说把EAX由32位扩展成64位(EDX:EAX),EDX表示原来EAX的符号,这个是进行除法之前的准备操作!eax除以ecx,商保存在eax,余数放在edx   ,基本上没edx什么事,除了后面保存余数先前把符号位保存到edx里面,等除法做完了  ,符号位又回到eax里面了 其他指令:
;CBW(Convert Byte to Word):             将 AL 扩展为 AX
;CWDE(Convert Word to Extended Double): 将 AX 扩展为 EAX
;CDQ(Convert Doubleword to Quadword):   将 EAX 扩展为 64 位数 EDX:EAX
;CWD(Convert Word to Doubleword):       将 AX 扩展为 DX:AX;它们都是用符号位填充多出的空间
;它们对 EFLAGS 无影响, 也无参数
int3指令:断点指令(机器码为:CC)
sete指令:sete al当前标志位是什么,al就是什么

寻址方式

直接寻址:不用执行一眼就看得出来地址,写清楚地址的例如:直接表明地址了MOV DWORD PTR [00401000],EAXMOV AXE, WORD PTR [00401000]CALL 401000JMP 401000间接寻址:需要程序执行到,才知道地址的,就是间接寻址例如:未写出地址,需要执行到才知道地址MOV DWORD PTR[EAX],ECXCALL EAXJMP [EBX + 8]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/198596.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文详解集合竞价,建议收藏!

集合竞价是指对在规定的一段时间内接受买卖申报一次性集中撮合的竞价方式。沪深市场9:15-9:25及14:57-15:00为集合竞价的时间段。集合竞价的所有交易以同一个价格成交。集合竞价的成交价确定原则是&#xff1a; 1、可实现最大成交量的价格&#xff1b; 2、高于该价格的买入申…

mac苹果笔记本电脑如何强力删除卸载app软件?

苹果电脑怎样删除app&#xff1f;不是把app移到废纸篓就行了吗&#xff0c;十分简单呢&#xff01; 其实不然&#xff0c;因为在Mac电脑上&#xff0c;删除应用程序只是删除了应用程序的主要组件。大多数时候&#xff0c;系统会有一个相当长的目录&#xff0c;包含所有与应用程…

Java三种代理模式:静态代理、动态代理和CGLIB代理

Java三种代理模式&#xff1a;静态代理、动态代理和CGLIB代理 代理模式 代理模式是23种设计模式种的一种。代理模式是一种结构型设计模式&#xff0c;它允许为其他对象提供一个替代品或占位符&#xff0c;以控制对这个对象的访问。代理模式可以在不修改被代理对象的基础上&am…

C语言之多重循环

目录 二重循环 用break语句强制结束循环 显示图形 绘制等腰直角三角形 多重循环 continue语句 将循环语句的循环体作为循环语句&#xff0c;就可以进行二重、三重循环。这样的循环称为多重循环。 我们先来了解二重循环 二重循环 在之前我们学习到的循环中的程序都比较简…

Java---异常

文章目录 1. 异常概述2. try...catch3. Throwable成员方法4. 编译时异常和运行时异常区别5. 异常处理之throws6. 自定义异常7. throws和throw的区别 1. 异常概述 1. 异常&#xff1a;就是程序中出现了不正常的情况。 2. Error&#xff1a;严重问题&#xff0c;不需要处理。Exce…

【带头学C++】----- 九、类和对象 ---- 9.4 拷贝构造函数、赋值

目录 9.4 拷贝构造函数、赋值 9.4.1 定义拷贝构造函数 9.4.2 拷贝构造和无参构造、有参构造的关系 9.4.3 拷贝构造的几种调用形式 1、旧对象给新对象初始化&#xff0c;调用拷贝构造 2、给对象取别名不会调用拷贝构造 3、普通对象作为函数参数&#xff0c;调用函数时会发…

STM32-GPIO编程

一、GPIO 1.1 基本概念 GPIO&#xff08;General-purpose input/output&#xff09;通用输入输出接口 --GP 通用 --I input输入 --o output输出 通用输入输出接口GPIO是嵌入式系统、单片机开发过程中最常用的接口&#xff0c;用户可以通过编程灵活的对接口进行控制&#xff0c;…

ArcGIS提取DEM中的山脉范围

已知数据&#xff1a;DEM文件ASTGTM_N00E118E.img 使用软件&#xff1a;ArcMap 要求&#xff1a;对数据进行操作&#xff0c;提取数据文件中的山脉范围 下面开始操作&#xff1a; 1、 打开ArcMap将DEM文件ASTGTM_N00E118E.img添加到数据框。 2、 接下来我们打开spatial ana…

虚幻学习笔记8—蓝图操作其他虚幻模块

一、前言 蓝图不仅可以相互之间操作和通信&#xff0c;其他的资源、模块也有操作和通信的方法。文本主要针对蓝图和材质、Niagara、编辑器的通信进行讲解。 二、实现 2.1、蓝图和材质 1&#xff09;首先&#xff0c;在材质蓝图中按住“4鼠标左键”创建一个参数为四维向量的参…

Kafka中的auto-offset-reset配置

Kafka这个服务在启动时会依赖于Zookeeper&#xff0c;Kafka相关的部分数据也会存储在Zookeeper中。如果kafka或者Zookeeper中存在脏数据的话&#xff08;即错误数据&#xff09;&#xff0c;这个时候虽然生产者可以正常生产消息&#xff0c;但是消费者会出现无法正常消费消息的…

【小工具分享】分享一个小工具---可视化数据结构 (初学者建议收藏)

工具链接&#xff1a; 可视化数据结构 这里支持大量数据结构地演示&#xff0c;相当全面&#xff0c;对于初学数据结构或者想更直观感受某个数据结构地实现有很大帮助&#xff0c;能直观的看到该数据结构的增删改查&#xff0c;帮助我们理解某一数据结构的性能~ 下面我演示一下…

揭秘MQTT:为何它是物联网的首选协议?

文章目录 MQTT 协议简介概览MQTT 与其他协议对比MQTT vs HTTPMQTT vs XMPP 为什么 MQTT 是适用于物联网的最佳协议&#xff1f;轻量高效&#xff0c;节省带宽可靠的消息传递海量连接支持安全的双向通信在线状态感知 MQTT 5.0 与 3.1.1MQTT 服务器MQTT 客户端 MQTT 协议简介 概…

设计模式之代理模式(1)

目录 概述定义应用场景主要角色类图 详述基本代码应用实例符合的设计原则 总结 概述 定义 代理模式是一种结构型设计模式&#xff0c;它允许通过一个代理对象来控制对原始对象的访问。代理对象可以在不改变原始对象的情况下&#xff0c;增加一些额外的功能&#xff0c;例如权限…

如何做好一个软件开发项目经理?

要成为一名优秀的软件开发项目经理&#xff0c;需要具备一定的技术知识和管理能力。下面是学习和发展软件开发项目经理职业所需的关键能力和工作内容。 首先&#xff0c;作为软件开发项目经理&#xff0c;你需要具备扎实的软件开发知识和技能。这包括熟悉常用的编程语言、开发框…

Python教程75:textwrap模块 — 文本自动换行与填充

TextWrap模块是一个Python模块&#xff0c;它提供了一些函数和方法来处理文本字符串的包装和填充。这个模块的主要功能是将一个长字符串根据指定的宽度分成多行&#xff0c;可以用于格式化文本输出&#xff0c;使其在指定的行数内完成显示。这个过程通常用于控制文本在终端、文…

面向注解编程—Spring 注解看这一篇就够了

面向注解编程—Spring 注解大全之IOC篇 Spring的一个核心功能是IOC&#xff0c;就是将Bean初始化加载到容器中&#xff0c;调用的时候直接注入即可&#xff0c;使用注解可以大大提高了开发效率&#xff01;。 Bean英文意为 豆子 理解起来就是豆荚里的豌豆&#xff0c;豆荚就是…

.Net core 6.0 升8.0

1 Update Visual Studio 2 3 用Nutget 更新不同套件版本 更新后结果如下&#xff1a;

第四期丨酷雷曼无人机技能培训

第4期无人机技能培训 2023年10月25日&#xff0c;酷雷曼无人机技能培训及执照考试第四期成功举办&#xff0c;自7月份首期开办以来&#xff0c;已按照每月一期的惯例连续举办四期&#xff0c;取得了极为热烈的反响。 随着无人机培训的重要性及影响力逐渐扩大&#xff0c;参加培…

UE4/UE5 材质实现带框环形进度条

UE4/UE5 材质实现带框环形进度条 此处使用版本&#xff1a;UE4.27 原理&#xff1a;大圆减小圆可以得到圆环&#xff0c;大圆环减小圆环&#xff0c;可以得到圆环外围线框 实现效果&#xff1a; 实现&#xff08;为了给大家放进一张面前能看的图&#xff0c;我费劲了心思&…

从 MQTT、InfluxDB 将数据无缝接入 TDengine,接入功能与 Logstash 类似

利用 TDengine Enterprise 和 TDengine Cloud 的数据接入功能&#xff0c;我们现在能够将 MQTT、InfluxDB 中的数据通过规则无缝转换至 TDengine 中&#xff0c;在降低成本的同时&#xff0c;也为用户的数据转换工作提供了极大的便捷性。由于该功能在实现及使用上与 Logstash 类…