【汇编语言】流程转移和子程序

news2025/1/16 21:00:56

【汇编语言】流程转移和子程序


`

文章目录

  • 【汇编语言】流程转移和子程序
  • 前言
  • 一、“转移”综述
  • 二、操作符offset
  • 三、jmp指令
    • jmp指令——无条件转移
    • jmp指令:依据位移进行转移
    • 两种段内转移
    • 远转移:jmp far ptr 标号
    • 转移地址在寄存器中的jmp指令
    • 转移地址在内存中的jmp指令
    • jmp 指令小结
  • 四、其他转移指令
    • jcxz指令
    • loop指令
    • 根据位移进行“相对”转移的意义
  • 五、call 指令和 ret 指令
    • 模块化程序设计
    • call 指令
    • 指令“call far ptr 标号”实现的是段间转移
    • 转移地址在寄存器中的call指令
    • 转移地址在内存中的call指令
    • 返回指令:ret 和 retf
    • 执行过程
  • 六、call 和 ret 配合使用
    • 具有子程序的源程序的框架
    • call 和 ret 配合使用
    • 为call和ret指令设置栈
  • 七、乘法:mul 指令
    • 回顾:除法div指令
    • 用mul指令做乘法
    • 应用案例
  • 八、汇编语言模块化程序设计
    • 模块化程序设计
    • 参数和结果传递的问题
    • 用寄存器来储存参数和结果是最常使用的方法
    • 用内存单元批量传递数据
    • 用栈传递参数
    • 程序的执行过程中栈的变化
    • 小结:参数和结果传递的问题
  • 九、寄存器冲突问题
    • 引子
    • 编程将data段中的字符串转化为大写
    • 寄存器冲突问题的解决
    • 寄存器冲突问题的解决示例
  • 十、标志寄存器
    • 认识标志寄存器的特殊之处
    • ZF-零标志(Zero Flag)
    • PF-奇偶标志(Parity Flag)
    • SF-符号标志(Sign Flag)
    • CF-进位标志(Carry Flag)
    • OF-溢出标志(Overflow Flag)
    • 综合:一条指令会带来多个标志寄存器的变化
  • 十一、带进(借)位的加减法
    • adc带进位加法指令
    • adc指令应用:大数相加
    • 128 位数据相加
    • sbb 指令
  • 十二、cmp与条件转移指令
    • cmp指令
    • 无符号数比较与标志位取值
    • 有符号数比较与标志位取值
    • 条件转移指令
    • 条件转移指令的使用
  • 十三、条件转移指令的应用
    • 应用案例
  • 十四、DF标志和串传送指令
    • 问题分析
    • DF标志和串传送指令
    • rep指令
    • 应用实例
  • 总结


前言

在本篇文章当中我们将详细讲到,转移的综述,操作符offset,jmp指令,其他转移指令,call指令和ret指令,call指令和ret指令的配合使用,mul指令,汇编语言的模块化程序设计,寄存器冲突的问题和解决方法,标志寄存器,带进(借)位的加减法,cmp和条件转移指令,条件转移指令的应用,DF标志和串传送指令。


一、“转移”综述

背景:一般情况下指令是顺序地逐条执行的,而在实际中,常需要改变程序的执行流程。

转移指令:
可以控制CPU执行内存中某处代码的指令
可以修改IP,或同时修改CS和IP的指令
例:
在这里插入图片描述

转移指令分类:
在这里插入图片描述


二、操作符offset

用操作符offset取得标号的偏移地址****
格式:
offset 标号
例:
在这里插入图片描述
在这里插入图片描述

练习:
问题:有如下程序段,添写2条指令,使该程序在运行中将s处的一条指令复制到s0处
这边我已经给出了。
nop的机器码占一个字节,起“占位”作用在这里插入图片描述
我们来分析一下:
1)s和s0处的指令所在的内存单元的地址是多少?
cs:offset s 和cs:offset s0。
2)将s处的指令复制到s0处,就是________
就是将cs:offset s 处的数据复制到cs:offset s0处。
3)地址如何表示?
段地址已知在cs中,偏移地址已经送入si和di中。
4)要复制的数据有多长?
mov ax,bx指令的长度为两字节,即一个字


三、jmp指令

jmp指令——无条件转移

无条件转移,可以只修改IP,也可以同时修改CS和IP

jmp指令要给出两种信息:
转移的目的地址
转移的距离
段间转移(远转移): jmp 2000:1000
段内短转移: jmp short 标号 ; IP的修改范围为 -128~127,8位的位移
段内近转移: jmp near ptr 标号 ; IP的修改范围为 -32768~32767,16位的位移

jmp指令:依据位移进行转移

引子:常见指令中的立即数均在机器指令中有体现
在这里插入图片描述
可以看出立即数0123在机器码中有所体现。

问题:jmp short 指令中,转移到了哪里?
—>jmp short 的机器指令中,包含的是跳转到指令的相对位置,而不是转移的目标地址。
在这里插入图片描述
在这里插入图片描述
上边程序jmp short s指令的读取和执行:
1)(IP)=0003,CS:IP指向EB 05(jmp的机器码)
2) 读取指令码EB 05进入指令缓冲器;
3)(IP)=(IP)+所读取指令的长度=(IP)+2=0005,CS:IP指向add ax,0001;
4)CPU执行指令缓冲器中的指令EB05;
5)指令 EB 05执行后,(IP)=(IP)+05=000AH,CS:IP指向inc ax
在这里插入图片描述

两种段内转移

短转移:“jmp short 标号”
功能:(IP)=(IP)+8位位移
原理:
1)8位位移=“标号”处的地址-jmp指令后的第一个字节的地址;
2)short指明此处的位移为8位位移;
3)8位位移的范围为-128~127,用补码表示;
4)8位位移由编译程序在编译时算出。
在这里插入图片描述
在这里插入图片描述

近转移:指令“jmp near ptr 标号”
功能: (IP)=(IP)+16位位移
原理:
1)16位位移=“标号”处的地址-jmp指令后的第一个字节的地址;
2)near ptr指明此处的位移为16位位移,进行的是段内近转移;
3)16位位移的范围为 -32769~32767,用补码表示;
4)16位位移由编译程序在编译时算出。

远转移:jmp far ptr 标号

在这里插入图片描述

转移地址在寄存器中的jmp指令

指令格式:jmp 16位寄存器
功能:IP =(16位寄存器)
举例:
jmp ax
jmp bx
在这里插入图片描述
跳到哪儿由变量定

转移地址在内存中的jmp指令

在这里插入图片描述

jmp 指令小结

在这里插入图片描述

注意:
在这里插入图片描述


四、其他转移指令

jcxz指令

指令格式:jcxz 标号
功能:如果(cx)=0,则转移到标号处执行 ; 当(cx)≠0时,什么也不做(程序向下执行)
当(cx)=0时,(IP)=(IP)+8位位移)
8位位移=“标号”处的地址-jcxz指令后的第一个字节的地址;
8位位移的范围为-128~127,用补码表示;
8位位移由编译程序在编译时算出;

jcxz是有条件转移指令
所有的有条件转移指令都是短转移
对IP的修改范围都为-128~127
在对应的机器码中包含转移的位移,而不是目的地址
例:
在这里插入图片描述

loop指令

指令格式:loop 标号
指令操作:
1)(cx)=(cx)-1;
2)当(cx)≠0时,则转移到标号处执行 ; 当(cx)=0时,程序向下执行
8位位移=“标号”处的地址-loop指令后的第一个字节的地址
8位位移的范围为-128~127,用补码表示
8位位移由编译程序在编译时算出
在这里插入图片描述
在这里插入图片描述

根据位移进行“相对”转移的意义

对 IP的修改是根据转移目的地址和转移起始地址之间的位移来进行
jmp short 标号
jmp near ptr 标号
jcxz 标号
loop 标号
在这里插入图片描述


五、call 指令和 ret 指令

模块化程序设计

C语言中我们可以实现模块化设计
在这里插入图片描述
汇编中也可以实现模块化设计
在这里插入图片描述

call 指令

字面意思:调用子程序
实质:流程转移
call指令实现转移的方法和 jmp 指令的原理相似

格式:call 标号
CPU执行call指令,进行两步操作:
1)将当前的 IP 或 CS和IP 压入栈中;
2) 转移到标号处执行指令。
在这里插入图片描述

call 标号
16位位移=“标号”处的地址-call指令后的第一个字节的地址;
16位位移的范围为 -32768~32767,用补码表示;
16位位移由编译程序在编译时算出。
在这里插入图片描述
在这里插入图片描述

指令“call far ptr 标号”实现的是段间转移

CPU执行“call far ptr 标号”时的操作
1)(sp) = (sp) – 2
((ss) ×16+(sp)) = (CS)
(sp) = (sp) – 2
2) (CS) = 标号所在的段地址
(IP) = 标号所在的偏移地址
“call far ptr 标号” 相当于
push CS
push IP
jmp far ptr 标号
在这里插入图片描述

在这里插入图片描述

转移地址在寄存器中的call指令

指令格式
call 16位寄存器
功能:
(sp) = (sp) – 2
((ss)*16+(sp)) = (IP)
(IP) = (16位寄存器)
相当于进行
push IP
jmp 16位寄存器
在这里插入图片描述

转移地址在内存中的call指令

call word ptr 内存单元地址
相当于:
push IP
jmp word ptr 内存单元地址
在这里插入图片描述

call dword ptr 内存单元地址
相当于:
push CS
push IP
jmp dword ptr 内存单元地址
在这里插入图片描述

返回指令:ret 和 retf

在这里插入图片描述

执行过程

在这里插入图片描述


六、call 和 ret 配合使用

具有子程序的源程序的框架

在这里插入图片描述

call 和 ret 配合使用

例:
计算2的N次方,计算前,N的值由CX提供。
在这里插入图片描述
在这里插入图片描述
我们在这里没有设置栈段,这是非常危险的!

为call和ret指令设置栈

这里是引用
在这里插入图片描述


七、乘法:mul 指令

回顾:除法div指令

div是除法指令,格式为:
div 寄存器
div 内存单元
使用div作除法的时候
被除数:(默认)放在AX 或 DX和AX中
除数:8位或16位,在寄存器或内存单元中
结果:…
在这里插入图片描述

用mul指令做乘法

格式:
mul 寄存器
mul 内存单元
在这里插入图片描述

应用案例

在这里插入图片描述


八、汇编语言模块化程序设计

模块化程序设计

调用子程序:call指令
返回:ret指令
子程序:根据提供的参数处理一定的事务,处理后,将结果(返回值)提供给调用者。在这里插入图片描述

参数和结果传递的问题

问题:根据提供的N,计算N的三次方。
考虑:
1)我们将参数N存储在什么地方?
2)计算得到的数值,存储在什么地方?
方案:
用寄存器传递参数
用内存单元进行参数传递
用栈传递参数
在这里插入图片描述

用寄存器来储存参数和结果是最常使用的方法

问题:根据提供的N,计算N的三次方。
考虑:
1)我们将参数N存储在什么地方?
2)计算得到的数值,存储在什么地方?
寄存器传递参数
参数放到 bx 中,即(bx)=N
子程序中用多个 mul 指令计算 N^3
将结果放到 dx 和 ax中:(dx:ax)=N^3
在这里插入图片描述

编程任务:计算data段中第一组数据的 3 次方,结果保存在后面一组dword单元中。
在这里插入图片描述
问题:
如果需要传递的数据有3个、4个或更多,寄存器不够了,怎么办?

用内存单元批量传递数据

方案:
将批量数据放到内存中,然后将它们所在内存空间的首地址放在寄存器中,传递给需要的子程序。
对于具有批量数据的返回结果,也可用同样的方法。

编程任务:
将data段中的字符串转化为大写。
在这里插入图片描述
在这里插入图片描述

用栈传递参数

原理:由调用者将需要传递给子程序的参数压入栈中,子程序从栈中取得参数
任务:计算( a – b ) ^ 3 ,a、b 为 word 型数据。
进入子程序前,参数a、b入栈
调用子程序,将使栈顶存放IP
结果:( dx : ax ) = ( a – b ) ^ 3
例:设 a = 3 、b = 1 ,计算:( a – b ) ^ 3
在这里插入图片描述
在这里插入图片描述
将bp入栈出栈后不改变先前bp的值。在这里插入图片描述
将sp回复。在这里插入图片描述

程序的执行过程中栈的变化

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

小结:参数和结果传递的问题

问题:根据提供的N,计算N的3次方。
考虑:
1)我们将参数N存储在什么地方?
2)计算得到的数值,存储在什么地方?
方案:
用寄存器传递参数
用内存单元进行参数传递
用栈传递参数


九、寄存器冲突问题

引子

在这里插入图片描述
这个12哪来的?
这样写是数出来的,有没有别的办法呢?
C语言中用\0
汇编也可以。在后边加个0,db ‘conversation’,0

编程将data段中的字符串转化为大写

在这里插入图片描述
在这里插入图片描述

在例:将以下字符串转为大写
在这里插入图片描述
写出:
在这里插入图片描述
但是这个代码有一个大问题:
cx既用于循环又用于读取数据-------冲突!!!

寄存器冲突问题的解决

两个可能方案
1)在编写调用子程序的程序时 ,注意看看子程序中有没有用到会产生冲突的寄存器。
如果有,调用者使用别的寄存器;
2)在编写子程序的时候,不要使用会产生冲突的寄存器。
在这里插入图片描述

我们希望
1)编写调用了程序的程序的时候不必关心子程序到底使用了哪些寄存器;
2)编写子程序的时候不必关心调用者使用了哪些寄存器;
3)不会发生寄存器冲突。
在这里插入图片描述

寄存器冲突问题的解决示例

这里是引用
在这里插入图片描述
在这里插入图片描述


十、标志寄存器

8086CPU有14个寄存器:
通用寄存器:AX、BX、CX、DX
变址寄存器:SI、DI
指针寄存器:SP、BP
指令指针寄存器: IP
段寄存器:CS、SS、DS、ES
标志(flag)寄存器:PSW/FLAGS别称:程序状态字
在这里插入图片描述

认识标志寄存器的特殊之处

标志寄存器的结构:
flag寄存器是按位起作用的,也就是说,它的每一位都有专门的含义,记录特定的信息。
8086CPU中没有使用flag的1、3、5、12、13、14、15位,这些位不具有任何含义。
在这里插入图片描述

标志寄存器的作用:
用来存储相关指令的某些执行结果
用来为CPU执行相关指令提供行为依据
用来控制CPU的相关工作方式
观察寄存器的值:
在这里插入图片描述
在这里插入图片描述
直接访问标志寄存器的方法
pushf:将标志寄存器的值压栈;
popf:从栈中弹出数据,送入标志寄存器中。

ZF-零标志(Zero Flag)

在这里插入图片描述

ZF标记相关指令的计算结果是否为0;
ZF=1,表示“结果是0 ”,1表示“逻辑真”
ZF=0,表示“结果不是0”,0表示“逻辑假”
例:
在这里插入图片描述
在这里插入图片描述

PF-奇偶标志(Parity Flag)

在这里插入图片描述

PF记录指令执行后,结果的所有二进制位中1 的个数
1的个数为偶数PF=1
1的个数为奇数PF=0
例:
在这里插入图片描述

SF-符号标志(Sign Flag)

在这里插入图片描述

SF记录指令执行后,将结果视为有符号数
结果为SF=1
结果为非负SF=0
例:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

CF-进位标志(Carry Flag)

在这里插入图片描述

在进行无符号数运算的时候,CF记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值
CF记录指令执行后:
有进位或借位CF = 1
无进位或借位CF = 0
例:
在这里插入图片描述
在这里插入图片描述

OF-溢出标志(Overflow Flag)

在进行有符号数运算的时候,如结果超过了机器所能表示的范围称为溢出。
OF记录有符号数操作指令执行后,
有溢出OF = 1
无溢出OF = 0
例:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

综合:一条指令会带来多个标志寄存器的变化

在这里插入图片描述
可通过Debug检验结果:
在这里插入图片描述


十一、带进(借)位的加减法

adc带进位加法指令

adc是带进位加法指令 ,它利用了CF位上记录的进位值。
adc是带进位加法指令 ,它利用了CF位上记录的进位值。
功能:操作对象1=操作对象1+操作对象2+CF
例:adc ax,bx 实现的功能是:(ax)=(ax)+(bx)+CF
实例:
在这里插入图片描述

adc指令应用:大数相加

问题:8086指令提供add指令,完成8位或16位加法,有更大的数相加时,如何做?
32位、64位、24位?
在这里插入图片描述
在这里插入图片描述

128 位数据相加

问题:编写一个子程序,对两个128位数据进行相加。
名称:add128
功能:两个逆序存放的128位数据进行相加
在这里插入图片描述
在这里插入图片描述
数据为128位,需要8个字单元,由低地址到高地址单元,依次存放由低到高的各个字。
分析:
ds:si指向存储第一个数的内存空间
ds:di指向存储第二个数的内存空间
运算结果存储在第一个数的存储空间中。
在这里插入图片描述
在这里插入图片描述
答案是不行的:
sub ax,ax将CF清零
inc di 不会影响进位,add di,2 会影响进位。

sbb 指令

sbb:带借位减法指令
格式:sbb 操作对象1,操作对象2
功能:操作对象1=操作对象1–操作对象2–CF
与sub区别:利用CF位上记录的借位值
比如:sbb ax,bx
实现功能: (ax) = (ax) – (bx) – CF
在这里插入图片描述


十二、cmp与条件转移指令

cmp指令

cmp指令
格式:cmp 操作对象1,操作对象2
功能:计算操作对象1–操作对象2
在这里插入图片描述
应用: 其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。
例如:
在这里插入图片描述

无符号数比较与标志位取值

思路:通过cmp 指令执行后相关标志位的值,可以看出比较的结果
指令:cmp ax,bx
在这里插入图片描述

有符号数比较与标志位取值

问题:用cmp来进行有符号数比较时,CPU用哪些标志位对比较结果进行记录?
示例指令:cmp ah,bh
在这里插入图片描述

条件转移指令

套路:
cmp oper1,oper2 ;或者其他影响标志寄存器的指令
jxxx 标号
在这里插入图片描述

条件转移指令的使用

jxxx系列指令和cmp指令配合,构造条件转移指令
不必再考虑cmp指令对相关标志位的影响和jxxx指令对相关标志位的检测
可以直接考虑cmp和jxxx指令配合使用时表现出来的逻辑含义
jxxx系列指令和cmp指令配合实现高级语言中if语句的功能
在这里插入图片描述


十三、条件转移指令的应用

条件转移指令:jxxx——je/jna/jae…
可以根据某种“条件”,决定是否“转移”程序执行流程
“转移”= 修改IP
如何检测条件?
通过检测标志位,由标志位体现条件
条件转移指令通常都和cmp相配合使用,cmp指令改变标志位
例:双分支结构的实现
在这里插入图片描述

应用案例

  • 给出下面一组数据:
  • 在这里插入图片描述
    请编程实现如下统计,用ax保存统计结果
    1)统计数值为8的字节的个数
    2)统计数值大于8的字节的个数
    3)统计数值小于8的字节的个数

1)编程思路:初始设置(ax)=0,然后用循环依次比较每个字节的值,找到一个和8相等的数就将ax的值加1。
在这里插入图片描述
2)初始设置(ax)=0,然后用循环依次比较每个字节的值,找到一个大于8的数就将ax的值加1。
在这里插入图片描述
3)初始设置(ax)=0,然后用循环依次比较每个字节的值,找到一个小于8的数就将ax的值加1。
在这里插入图片描述


十四、DF标志和串传送指令

问题分析

编程:将data段中的第一个字符串复制到它后面的空间中。
在这里插入图片描述
在这里插入图片描述
这是我们之前写过的代码,在这情况下能在简洁吗?

DF标志和串传送指令

在这里插入图片描述

DF-方向标志位(Direction Flag)
功能
在串处理指令中,控制每次操作后si,di的增减。
DF = 0:每次操作后si,di递增
DF = 1:每次操作后si,di递减
对DF位进行设置的指令
cld指令:将标志寄存器的DF位设为0(clear)
std指令:将标志寄存器的DF位设为1(setup)

串传送指令1:movsb
功能:(以字节为单位传送)
1)((es))*16+(di))=((ds)*16+(si))
2) 如果DF = 0则: (si) = (si) + 1 ; (di) = (di) + 1
如果DF = 1则:(si) = (si) - 1 ; (di) = (di) - 1
串传送指令2:movsw
功能:(以字为单元传送)
1)((es)*16+(di))=((ds)*16+(si))
2)) 如果DF = 0则: (si) = (si) + 2 ; (di) = (di) + 2
如果DF = 1则: (si) = (si) - 2 ; (di) = (di) - 2
在这里插入图片描述

rep指令

rep指令常和串传送指令搭配使用
功能:根据cx的值,重复执行后面的指令
用法:
在这里插入图片描述
在这里插入图片描述

应用实例

任务:用串传送指令,将F000H段中的最后16个字符复制到data段中。(F000H段的最后一个字符的位置:F000:FFFF)
data segment
db 16 dup (0)
data ends
在这里插入图片描述


总结

到这里这篇文章的内容就结束了,谢谢大家的观看,如果有好的建议可以留言喔,谢谢大家啦!

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

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

相关文章

神经网络进阶

⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计3077字,阅读大概需要3分钟 🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号&#xf…

socket套接字在tcp客户端与tcp服务器之间的通信,以及socket中常用的高效工具epoll

1.socket(套接字)的概念 Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议,主要利用三元组【ip地址,协议&am…

10G网络布线:DAC线缆与AOC光缆的选择指南

在10G网络部署中,选择合适的传输介质是确保网络性能和可靠性的关键。本文将全面比较10G DAC高速线缆和10G AOC有源光缆,帮助您做出明智的选择。 10G DAC高速线缆 VS 10G AOC有源光缆 定义与构造 10G DAC高速线缆(Direct Attach Cable&…

配置有效的防爬虫技术保护网站

本文主要介绍了防爬虫的概念、目的以及一些有效的防爬虫手段。防爬虫是指网站采取各种技术手段阻止爬虫程序对其数据进行抓取的过程。为了保护网站的数据和内容的安全性,防止经济损失和恶意竞争,以及减轻服务器负载,网站需要采取防爬虫机制。…

文心一言4.0、智谱清言、MoonshotAI实测对比(上)

前言 前两天看到这张图,又刚好拿到了文心一言的4.0内测号,就想着把新版国内御三家横向对比测评一下。 文末领取免费领取AI学习基地 AI交流群 前一段时间也一直在研究复杂提示词(结构化提示词)向国内大模型迁移适配的问题&#…

matlab新手快速上手5(蚁群算法)

本文根据一个较为简单的蚁群算法框架详细分析蚁群算法的实现过程,对matlab新手友好,源码在文末给出。 蚁群算法简介: 蚁群算法是一种启发式优化算法,灵感来源于观察蚂蚁寻找食物的行为。在这个算法中,解决方案被看作是…

Fhopify:跨境电商行业迎来发展新机遇打造购物者天堂

随着全球化的推进和互联网的普及,跨境电商作为一种新型的商业模式,日益受到人们的关注和重视。它通过互联网平台,打破了地域限制,使得消费者可以便捷地购买来自世界各地的商品,同时也为企业提供了更广阔的市场和发展空间。在这样的背景下,跨境电商的新趋势和未来发展备受关注。…

ShardingSphere 5.x 系列【24】集成 Nacos 配置中心

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.1.0 本系列ShardingSphere 版本 5.4.0 源码地址:https://gitee.com/pearl-organization/study-sharding-sphere-demo 文章目录 1. 前言2. ShardingSphereDriverURLProvider3. 方式一:基于 Nacos Java SDK…

初学python记录:力扣2739. 总行驶距离

题目: 卡车有两个油箱。给你两个整数,mainTank 表示主油箱中的燃料(以升为单位),additionalTank 表示副油箱中的燃料(以升为单位)。 该卡车每耗费 1 升燃料都可以行驶 10 km。每当主油箱使用了…

演示在一台Windows主机上运行两个Mysql服务器(端口号3306 和 3307),安装步骤详解

目录 在一台Windows主机上运行两个Mysql服务器,安装步骤详解因为演示需要两个 MySQL 服务器终端,我只有一个 3306 端口号的 MySQL 服务器,所以需要再创建一个 3307 的。创建一个3307端口号的MySQL服务器1、复制 mysql 的安装目录2、修改my.in…

基于springboot实现海滨学院班级回忆录的设计项目【项目源码+论文说明】计算机毕业设计

基于springboot实现海滨学院班级回忆录的设计演示 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了海滨学院班级回忆录的开发全过程。通过分析海滨学院班级回忆录管理的不足,创建了一个计算机管理海…

Andorid进程间通信之 UNIX SOCKET

1,什么是UNIX SOCKET UNIX SOCKET,域套接字,UNIX SOCKET可用于同一台设备进程间通信,它不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序列号应答等,只需要将数据从一个进程复制到另一个进程&…

xray使用入门

简介 长亭科技旗下的一款网络安全漏洞扫描工具,用于检测和评估web应用程序的安全性。具有一下特点:检测速读快、检查范围广、代码质量高、高级可定制以及安全无危害。属于不开源的项目,用户直接下载xray的可执行文件,即可运行该工…

SSH远程连接docker容器-Linux-SSH -L 打隧道

问题:在物理机上用podman创建了一个容器,想SSH直接远程连接docker容器 解决方式: 步骤1: 在本地terminal输入以下命令: ssh -L 容器端口号:localhost:容器端口号 物理机用户名物理机ip -p 物理机端口号 即可,可新打…

1、k8s问题pod从service中剔除

一、起因 redis原来由两服务器的集群变为三服务器的集群,通过statefulset扩展了两节点,并把redis-app-0和redis-app-3从集群中去除,但是由于service路由后端不变,导致程序连接后端仍然可能到redis-app-0和redis-app-3 二、处理 …

WiFi、Ethenet、4G优先级切换

1、多网卡情况下如何调整优先级方案 按照目前公司前辈给出的方案&#xff0c;调整优先级的手段有两种&#xff1a; <1>.删除默认路由--route del 的方法 <2>.ifmetric源码提供的修改路由表的mteric的值来设置路由的优先级&#xff0c;metric越小优先级越高。 应…

C#开发中关于业务类与窗口文件以及数据库的大体连接流程(业务类的写法)

所有的开发在基准上&#xff0c;都是数据的交互&#xff0c;在VS中基于WinFrm的C#开发可以采用业务类与窗口类分开&#xff0c;以形成模块&#xff0c;接下来简述大体开发流程 业务类中&#xff0c;我们需要继承EntityClass类&#xff0c;来形成与窗口类的接口&#xff1a; pu…

Spring 事务 @Transactional 注解

上期我们讲解了Spring事务的两种实现&#xff0c;其中声明式注解使用了 Transactional 注解&#xff0c; 接下来我们学习 该注解的使用细节。 我们主要学习 Transactional注解当中的三个常见属性&#xff1a; rollbackFor&#xff1a;异常回滚属性&#xff0c;指定能够出发事…

河道采砂执法监管信息化平台:科技赋能,智慧监管

随着信息技术的飞速发展&#xff0c;信息化平台已经成为提升行业监管效率和水平的重要工具。河道采砂作为水利资源管理的重要环节&#xff0c;其执法监管同样需要与时俱进&#xff0c;利用先进技术手段提升监管效能。河道采砂执法监管信息化平台便是这一背景下的产物&#xff0…

【总结】hbase master重启恢复失败问题修复

问题现象 最近hbase master 莫名其妙宕机了&#xff0c;查看最后输出日志&#xff0c;也没有发现有效信息。 于是想着先重启一把&#xff0c;在hbase master 选主成active状态的过程中&#xff0c;发现重启多次都很漫长&#xff0c;且最终因重启时间过长&#xff0c;被hbase-…