基础的汇编指令

目录

1、接上一个csdn特殊功能寄存器

    1.1CPSR寄存器

     1.2SPSR寄存器

    1.3CPSR寄存器的高四位和第四位   ​编辑

2、汇编指令的分类

3、汇编指令的基本格式

4、数据搬移指令(赋值指令)

4.1指令码

4.2指令格式

4.3测试代码

4.5立即数

4.6ldr伪指令

5、位移操作运算指令

5.1指令码

5.2指令格式

5.3测试代码

6.位运算操作指令

6.1指令码

6.2指令格式

6.3测试代码

6.4练习代码

7、算数运算指令

    7.1指令码

    7.2指令格式

    7.3测试代码


1、接上一个csdn特殊功能寄存器

    1.1CPSR寄存器

CPSR寄存器------the current program status register
CPSR寄存器的中文名是当前程序状态寄存器
CPSR寄存器的作用:用于保存当前程序的状态

     1.2SPSR寄存器

SPSR寄存器-------the save program status register

SPSR寄存器的中文名字是备份程序状态寄存器
SPSR寄存器的作用:用于备份程序的状态

这张图展示了ARM处理器用户模式(USER)与中断请求模式(IRQ)之间的异常处理流程,核心是通过CPSR和SPSR寄存器实现模式切换与状态备份恢复,流程是1.先正常执行,此时处理器处于普通执行状态,使用用户模式的寄存器,CPSR寄存器记录当前程序的运行状态,2.触发异常用户代码执行中断事件,处理器会备份当前状态将CPSR寄存器的值保存到IRQ模式对应的SPSR中确保用户模式下不会丢失,3.开始处理异常代码,此时使用IRQ模式的寄存器组,独立于用户模式的寄存器,保证不会干扰用户代码的执行,4.从IRQ到USER模式异常处理完毕后处理器会从SPSR中备份的用户模式状态写会CPSR切换到USER模式继续执行后面的代码,

CPSR:记录当前模式下的程序状态(标志位、中断控制、处理器模式等),是实时状态的 “快照”。

SPSR:是异常模式(如 IRQ、FIQ)下的 “备份寄存器”,用于保存 ** 原模式(如 USER)** 的 CPSR 值,确保异常处理完成后能恢复原状态。
总结:这种机制保证了 ARM 处理器在处理异常时,既能及时响应中断,又能在处理完毕后准确回到原程序的执行上下文,是 ARM 架构 “多模式、高可靠性” 设计的核心体现。

自我理解:可以这样理解触发异常事件是将CPSR中保存的值给SPSR,异常执行结束将SPSR中的值还原给CPSR回到user模式继续执行后面的代码

    1.3CPSR寄存器的高四位和第四位

   

N【31】位:
           负数标志位(用于比较两个数的大小)
            当汇编指令的执行结果位负数时,N位会被硬件自动置为1;否则,清0;
Z【30】位:
             零标志(用于比较两个数是否相等时)
              当汇编指令的执行结果为0时,z位会被硬件自动置1否则;清0;

C【29】位:
            进位/借位标志位
            当汇编指令的执行结果产生进位时,c位会被硬件自动置为1;否则清零(加法运算
             当汇编指令的执行结果产生借位时,C位会被硬件自动清零;否则置1(减法运算
             可以看后面的第八条
V【28】位:
              溢出标志位/符号标志位
               当汇编指令的执行结果对符号位产生变化时,v位会被硬件自动置1;否则,清零
I【7】位:
                FRQ模式使能位/IRQ模式屏蔽位
                I=1时,屏蔽IRQ模式(无法进入到IRQ模式下)
                I=0时,不屏蔽FIQ模式(可以进入到FIQ模式下)
T【5】位:

               状态位/ARM状态屏蔽位
                T=1时,屏蔽ARM状态(不适用ARM汇编指令集,默认使用Tumb汇编指令集)
                 T=0时,不屏蔽AMR状态(可以使用ARM汇编指令集)
M【4:0】位
                 模式位/工作模式位
CPSR寄存器的高四位由硬件控制,不需要认为更改
CPSR寄存器的第八位可以认为更改
M[4:0] -> 处理器模式
10000 -> User 模式
10001 -> FIQ 模式
10010 -> IRQ 模式
10011 -> Supervisor(SVC)模式
10110 -> Monitor(MON)模式
10111 -> Abort(ABT)模式
11010 -> Hyp(HYP)模式
11011 -> Undef(UND)模式
11111 -> System(SYS)模式

2、汇编指令的分类

基础汇编指令:
1、数据操作指令
      1.1数据搬移指令(赋值指令=)
      1.2移位运算指令(<<,>>)
      1.3位运算指令(&,|,~,^)
       1.4算术运算指令(+,-,*,/)
        1.5比较指令(<,>,==,!=)
2、跳转指令
进阶汇编指令:
         3、单寄存器内存读写指令
         4、栈指针寄存器内存读写指令(包含了多寄存器内存读写指令)
         5、CPSR特殊功能寄存器内存读写指令
         6、swi软中断指令

3、汇编指令的基本格式

{opcode}{cond}{s}           Rd,Rn, oprand_shifter2|
|                  |       |              |    |                 |----------------->第二操作数(相当于右操作数)
|                  |       |              |    |                 |----------------->第二操作数可以是:
|                  |       |              |    |                 |                             1、立即数
|                  |       |              |    |                 |                              2、普通寄存器
|                  |       |              |    |                 |                               3、经过移位的寄存器
|                  |       |              |    |
|                  |       |              |    |------------------第一操作寄存器(相当于左操作数)
|                  |       |              |------------目标寄存器,用于存放当前汇编指令的执行结果
|                  |       |
|                  |       |----------状态位,+s,当前汇编指令的执行结果会影响xpsr寄存器的nzcv位
|                  |                               不+s,当前汇编指令的执行结果不会影响cpsr寄存器的nzcv位
|                  |----------条件码,用于让汇编指令的指令(在使用比较指令时会使用)
|
|----------------指令码,也就是汇编指令的名字
注意:
          1、{opcode}{cond}{s}指令码、条件码,状态位连在一起写的,不允许出现空格
           2、Rd,Rn,oprand_shifter2目标寄存器、第一操作寄存器、第二操作数连在一起写、但是需要使用逗号隔开
            3、{opcode}{cond}{s}   和    Rd,Rn,oprand_shifter2 这两个部分中间需要用空格隔开
             4、汇编指令指令么有以;结尾,所以一条汇编指令写一行
             5、汇编指令没有大小写区分
                   mov r0,#0xff   ====   MOV R0,#0xFF   ====MoV  r0,#0xFF这三句是一样的
             6、在当前汇编文件中,使用的汇编器支持的注释方式:
                       6.1单行注释@(不同的编译器支持的注释方式不同,可能有;,#......)
                        6.2多行注释
                                      /**/
                                         .if 0/1 .else .endif

4、数据搬移指令(赋值指令)

4.1指令码

mov     --------      直接赋值指令

mvn     ------         按位取反后赋值

4.2指令格式

mov/mvn Rd,operand_shifter2

赋值指令时没有第一操作寄存器的,只有目标寄存器和第二操作数

4.3测试代码

.text

.global _start
    
            _start:
                      
                      mov r0,#oxff  @解释:将0xff赋值到R0寄存器中
                                                            @如果使用赋值指令时,第二个操作数是一个立即数
                                                              @需要在他的前面加上#
                      mvn r1,#0xff  @解释:将0xff全部按位取反后,赋值给r1寄存器
                                                               @r1=~(0xff)=0xffffff00
                  mov r2,#(-0xff)     @-0xff(存储的补码,正数源码和补码是一致的,负责需要计算)
                                                               @源码:0x800000ff
                                                                 @反码:0xffffff00
                                                                @补码:0xffffff01
              stop:
                   
                         b stop
.end

                                                     

4.5立即数

以mov这条汇编指令为例,不同的汇编指令的立即数是不一样的
以mov r0, #0xff为例,一条汇编指令占四个字节的空间

立即数是指可以被指令直接编码、无需从内存或者寄存器读取的常数。它的核心特点是“能被指令格式直接表示“。
立即数的判断步骤:
                          1、确定带判断数a;
                          2、在0x00~0xff范围内找一个数b;
                          3、将b循环右移偶数位(0、2、4......30位),若结果等于a,则是立即数
eg:
          0xff是否为立即数
            在0x00~0xff中找到b=0xff;
           将b循环右移32位(等价于右移0位,因为32是偶数),结果仍为0xff,因此0xff是立即数
            0xfff是否是立即数
             在0x00~0xff中找不到任何数循环右移等于0xfff的,所以0xfff不是立即数
 

有效数:如果一个数全部按位取反后,能够得到一个立即数,这个数就是一个有效数
有效数可以当做立即数使用

4.6ldr伪指令

ldr伪指令可以实现0x00000000~0xffffffff之间任意数的赋值操作
指令格式:ldr Rd,=任意数

如果以后遇到一个数,不知道是否是立即数,可以直接使用ldr进行赋值操作
eg:
     ldr r0,=0x12345678

5、位移操作运算指令


5.1指令码

lsl-------逻辑左移/无符号位  ------  高位移出,低位补0
lsr-------  逻辑右移/无符号数右移 ------低位移出,高位补0

ror  ------ 循环右移        ------   低位移出,补到高位

asr ----- 算数右移/有符号数右移 ----低位移出,高位补符号位

5.2指令格式

lsl/lsr/ror/asr Rd, Rn, oprand_shifter2

5.3测试代码

/***********************2、移位运算指令**************************/ /*
                    mov r0, #0xff

                    lsl r1, r0, #8              @ 将r0寄存器中的值逻辑左移8位后赋值给r1寄存器
                                                                                                     @ r1 = r0 << 8 = 0xff00

                    lsr r2, r1, #12            @ 将r1寄存器中的值逻辑右移12位后赋值给r2寄存器
                                                                                                           @ r2 = r1 >> 12 = 0xf

                     ror r3, r2, #4 @ 将r2寄存器中的值循环右移4位后赋值给r3寄存器
                                                                                                              @ r3 = 0xf0000000

                      asr r4, r3, #4 @ 将r3寄存器中的值算术右移4位后赋值给r4寄存器
                                                                                                                @ r4 = 0xff
                     @ 高位补符号位指的是所有高位都需要补符号位,而不是只有最高位补符号位

*/ /***********************2、第二操作数的所有情况**************************/
@ 第二操作数可以是一个立即数
mov r0, #0xff @ 解释:将0xff赋值给r0寄存器中

@ 第二操作数可以是一个普通寄存器
mov r1, r0 @ 解释:将r0寄存器中的值赋值给r1寄存器中

@ 第二操作数可以是一个经过移位的寄存器
mov r2, r1, lsl #4                       @ 解释:将r1寄存器中的值逻辑左移4位后赋值给r2寄存器

                                                 @ 上述汇编指令的作用和这条lsl r2, r1, #4汇编指令的作用是一致的

6.位运算操作指令


6.1指令码

and   ---   按位与(&)
orr     ---   按位或(|)
eor    ---    按位异或(^)

mvn   ---   按位取反(~)
口诀:
       与0清0,与1不变
        或1置1,或0不变
         异或1取反,异或0不变

6.2指令格式

and/orr/eor/mvn   Rd, Rn, oprand_shifter2

6.3测试代码

/***********************4、位运算操作指令**************************/
                 @ 32位数:
                 @ 31                                                                                                                   0                     @ **** **** **** **** **** **** **** ****

                mov r0, #0xff

               @ 目的:将r0寄存器中的第[3]位清0,其他位不变,最后赋值给r0寄存器
               @ c语言写法:r0 = r0 & (~(0x1 << 3))
                and r0, r0, #(~(0x1 << 3))                                    @ r0 = 0xf7
                @ 目的:将r0寄存器中的第[3]位置1,其他位不变,最后赋值给r0寄存器
                 orr r0, r0, #(0x1 << 3)

6.4练习代码

@假设你不知道r0寄存器中的值
                                  ldr r0, =0x12345678
                                  @ 31 0
                                  @ **** **** **** **** **** **** **** ****
                                  @ 1> 将r0寄存器的第[3]位清0,保持其他位不变
                                  and r0, r0, #(~(0x1 << 3))

                                  @ 2> 将r0寄存器的第[29]位置1,保持其他位不变
                                  orr r0, r0, #(0x1 << 29)

                                 @ 3> 将r0寄存器的第[7:4]位清0,保持其他位不变
                                  and r0, r0, #(~(0xf << 4))
                                 @ and r0, r0, #(~(0b1111 << 4))

                                 @ 4> 将r0寄存器的第[15:8]位置1,保持其他位不变
                                 orr r0, r0, #(0xff << 8) @ orr r0, r0, #(0x0000ff00)
                                 @ 5> 将r0寄存器的第[3:0]位按位取反,保持其他位不变
                                  eor r0, r0, #(0xf << 0)

                                  @ 6> 将r0寄存器的第[11:4]位修改为10101011,保持其他位不变


                                 @ 推荐使用先清0再置1
                                 and r0, r0, #(~(0xff << 4))
                                 orr r0, r0, #(0b10101011 << 4) @ orr r0, r0, #(0xab << 4)

                                @ 也可以先置1再清0
                                 orr r0, r0, #(0xab << 4)
                                and r0, r0, #(~(0x54 << 4))

7、算数运算指令


    7.1指令码

add -----基础加法指令(不涉及CPSR寄存器中的c位的使用)
adc-------进阶加法指令(涉及CPSR寄存器中的c位使用)
sub--------基础减法指令(不涉及CPSR寄存器中的c位的使用)
sbc------进阶减法指令(涉及CPSR寄存器中的c位使用)
mul-------- 乘法指令
div-------除法指令(使用除法指令需要架构ARM-V8架构之上)

    7.2指令格式

add/adc/sub/abc/mul/div     Rd,Rn,oprand_shifter2

    7.3测试代码

mov r1, #0x1
mov r2, #0x3
add r3, r1, r2       @r3=0x1+0x3=0x4
sub r4, r2, r1       @r4=0x3-0x1=0x2
@模拟两个64位数相减
@r1寄存器存放第一个64位数的高32位,r2寄存器存放第一个64位数的低32位
@r3寄存器存放第二个64位数的高32位,r4寄存器存放第二个64位数的低32位
@r5寄存器中存放相减后的高32位数,r6寄存器存放相减后的低32位数
mov r1, #0x5
mov r2, #0x2
mov r3, #0x1
mov r4, #0x8
@先低位相减
subs r6, r2, r4           @此时需要使用到s状态位
                                                 @由于当前指令的执行结果产生了借位
                                                 @并且高32位运算时,需要用到产生借位后的c位
                                                 @r6=r2-r4=0x2-0x8=0x2-0x2-0x6=0x0-0x6=0x0-0x1-0x5
                                                 @=0xffffffff-0x5=0xfffffffa

注:-1 mod 2³² = 2³² - 1 = 0xffffffff(因为 0xffffffff + 1 = 0x100000000,对 2³² 取模后等于 0)。同样也可以这样理解当你10-1的时候是不是等于九是不是个位数里面最大的数同理当你0x0-0x1时也是一样的等于最大值0xffffffff

sbc  r5, r1, r3                  此时需要使用到sbc
                                                    由于此处高32位相减时,需要使用到产生借位后的位
                                                     r5= r1- r3- C位(注:无论是进位还是借位的c位都是0x1)
                                                     r5=r1-r3-c位=0x5-0x1-0x1=0x3
                                                      注意:不管C位存放的是0/1
                                                      只要c位产生了借位,就需要多减一个0x1
                                                       只要c位产生了进位,就要多加一个0x1

注:为什么加s,subs中的s是为了强制更新 CPSR 的借位标志(C 位),让后续的高位运算能正确处理低 32 位产生的借位,当指令后加s(即 “set flags”)时,会在执行运算后自动更新 CPSR 的关键标志位(N、Z、C、V 等),其中:C 位(进位 / 借位标志)对于减法,C=0表示有借位,C=1表示无借位,这是 64 位减法中处理高位运算的核心依据。


@模拟两个64位数相加
@r1寄存器存放第一个64位数的高32位,r2寄存器存放第一个64位数的低32位
@r3寄存器存放第二个64位数的高32位,r4寄存器存放第二个64位数的低32位
@r5寄存器中存放相加后的高32位数,r6寄存器存放相加后的低32位数
 mov r1, #0x1

mov r2, #0xfffffffe
mov r3, #0x2
mov r4, #0x4
adds  r6, r2, r4                            r6=0xfffffffe+0x4=0xfffffffe+0x1+0x3=0xfffffffff+0x3
                                                     =oxffffffff+0x1+0x2=0x0+0x2=0x2
注:可以这样理解当9+1的时候是不是等于十是不是十位数里面最小的数同理当你0xffffffff+0x1时也是一样的等于0x0
adc r5, r1, r3                               r5=r1+r3+c位=0x1+0x2+0x1=0x4
注:为什么加c位是因为发生了进位上面已经解释了。

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

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

相关文章

Docker实战避坑指南:从入门到精通

摘要&#xff1a;文人结合自身微服务实践&#xff0c;系统梳理从安装适配、镜像拉取&#xff0c;到运行配置、构建优化、多容器编排、数据持久化、监控运维等 Docker 全流程高频踩坑点&#xff0c;给出可落地的解决方案&#xff0c;帮助读者快速规避同类问题并提升容器化效率。…

《Bishop PRML》10.1. Variational Inference(2)理解VAE

通过VAE与AE理解变分分布的变量 如何理解变分推断公式中,Z和X的含义是什么? 知乎 变分自编码器VAE的数学原理。 csdn 变分自编码器(VAE)的数学原理以及实现 Loss functions in Variational Autoencoders (VAEs) 一文解释 VAE+ELBO AE的编码和解码是确定性的。VAE的解码过程…

函数调用中的初始化与赋值——深入理解C++对象的生命周期

技术博客&#xff1a;函数调用中的初始化与赋值——深入理解C对象的生命周期引言在C编程中&#xff0c;理解函数调用过程中参数传递、对象创建和返回值处理的细节对于编写高效且无误的代码至关重要。本文将通过一个具体的例子来探讨函数调用时实参到形参的转换过程&#xff0c;…

矩阵微积分的链式法则(chain rule)

矩阵微积分的链式法则&#xff08;chain rule&#xff09;与标量情况一样&#xff0c;用于求复合函数的导数&#xff0c;但由于涉及矩阵和向量的求导&#xff0c;维度匹配和布局约定&#xff08;numerator-layout vs. denominator-layout&#xff09;必须格外小心。下面给出常见…

网络编程4-并发服务器、阻塞与非阻塞IO、信号驱动模型、IO多路复用..

一、并发服务器1、单循环服务器&#xff08;顺序处理&#xff09; 一次只能处理一个客户端连接&#xff0c;只有当前客户端断开连接后&#xff0c;才能接受新的客户端连接2、多进程/多线程并发服务器while(1) {connfd accept(listenfd);pid fork(); // 或 pthread_cr…

在 WSL2-NVIDIA-Workbench 中安装Anaconda、CUDA 13.0、cuDNN 9.12 及 PyTorch(含完整环境验证)

在 WSL-NVIDIA-Workbench&#xff08;NVIDIA AI Workbench & Ubuntu 22.04&#xff09;中 安装 Anaconda、CUDA 13.0、cuDNN 9.12 及 PyTorch 步骤也可参阅&#xff1a; 在WSL2-Ubuntu中安装Anaconda、CUDA13.0、cuDNN9.12及PyTorch&#xff08;含完整环境验证&#xf…

Shell编程核心入门:参数传递、运算符与流程控制全解析

Shell编程核心入门&#xff1a;参数传递、运算符与流程控制全解析 在Linux/Unix系统中&#xff0c;Shell作为命令解释器和脚本语言&#xff0c;是自动化运维、批量处理任务的核心工具。掌握Shell脚本的参数传递、运算符使用和流程控制&#xff0c;能让你从“手动执行命令”升级…

如何用 Kotlin 在 Android 手机开发一个应用程序获取网络时间

使用 NTP 协议获取网络时间在 build.gradle 文件中添加以下依赖&#xff1a;implementation commons-net:commons-net:3.6创建 NTP 时间获取工具类&#xff1a;import org.apache.commons.net.ntp.NTPUDPClient import org.apache.commons.net.ntp.TimeInfo import java.net.In…

python智慧交通数据分析可视化系统 车流实时检测分析 深度学习 车流量实时检测跟踪 轨迹跟踪 毕业设计✅

博主介绍&#xff1a;✌全网粉丝50W&#xff0c;前互联网大厂软件研发、集结硕博英豪成立软件开发工作室&#xff0c;专注于计算机相关专业项目实战6年之久&#xff0c;累计开发项目作品上万套。凭借丰富的经验与专业实力&#xff0c;已帮助成千上万的学生顺利毕业&#xff0c;…

计算机视觉第一课opencv(四)保姆级教学

目录 简介 一、轮廓检测 1.查找轮廓的API 2.代码分析 2.1.图像二值化处理 2.2轮廓检测 2.3轮廓绘制 2.4轮廓面积计算 2.5轮廓周长计算 2.6筛选特定面积的轮廓 2.7查找最大面积的轮廓 2.8绘制轮廓的外接圆 2.9绘制轮廓的外接矩形 二、轮廓的近似 三、模板匹配 简…

基于Vue2+elementUi实现树形 横向 合并 table不规则表格

1、实现效果 共N行&#xff0c;但是每一列对应的单元格列数固定&#xff0c;行数不固定2、实现方式说明&#xff1a;使用的是vue2 elementUI表格组件 js实现<template><div class"table-container" ><el-table height"100%" :span-metho…

深度学习在计算机视觉中的应用:对象检测

引言 对象检测是计算机视觉领域中的一项基础任务&#xff0c;目标是在图像或视频帧中识别和定位感兴趣的对象。随着深度学习技术的发展&#xff0c;对象检测的准确性和效率都有了显著提升。本文将详细介绍如何使用深度学习进行对象检测&#xff0c;并提供一个实践案例。 环境准…

node.js 安装步骤

在Node.js中安装包通常通过npm(Node Package Manager)来完成,这是Node.js的包管理工具。以下是安装Node.js和通过npm安装包的基本步骤: 1. 安装Node.js 方法一:使用nvm(Node Version Manager) 推荐使用nvm来安装Node.js,因为它允许你安装多个Node.js版本,并轻松地在…

面试-故障案例解析

一、NFS故障&#xff0c;造成系统cpu使用率低而负载极高。故障概述: 公司使用NFS为web节点提供共享存储服务,某一天下午发现web节点CPU使用率低,而负载极高.登录web节点服务器排查发现后段NFS服务器故障. 影响范围: 网站看不到图片了。 处理流程: 通过ssh登录NFS服务…

医疗AI时代的生物医学Go编程:高性能计算与精准医疗的案例分析(一)

摘要: 随着高通量测序、医学影像和电子病历等生物医学数据的爆炸式增长,对高效、可靠、可扩展的计算工具需求日益迫切。Go语言凭借其原生并发模型、卓越的性能、简洁的语法和强大的标准库,在生物医学信息学领域展现出独特优势。本文以“生物医学Go编程探析”为主题,通过三个…

针对 “TCP 连接建立阶段” 的攻击

针对 “TCP 连接建立阶段” 的攻击一、定义二、共性防御思路三、攻击手段3.1、SYN 洪水攻击&#xff08;SYN Flood&#xff09;3.2、Land 攻击&#xff08;Land Attack&#xff09;一、定义 什么是针对 “TCP 连接建立阶段” 的攻击&#xff1f;核心特征是利用 TCP “三次握手…

聊一聊 单体分布式 和 微服务分布式

微服务 与 单体架构对比维度单体架构微服务架构​​架构本质​​一个单一的、功能齐全的应用程序一组​​小型、独立​​的服务集合​​开发​​团队工作在同一个代码库&#xff0c;易产生冲突。技术栈统一。每个服务可以由​​ 独立的小团队 ​​负责&#xff0c;允许使用​​…

【C++八股文】计算机网络篇

网络协议核心知识点详解 TCP头部结构 TCP头部包含多个关键字段&#xff0c;每个字段都有其特定作用&#xff1a; 16位源端口&#xff1a;标识发送方应用程序的端口号16位目的端口&#xff1a;标识接收方应用程序的端口号32位序号&#xff1a;保证数据包有序传输的唯一标识32…

小迪Web自用笔记7

游戏一般不走http https协议&#xff0c;一般的抓包工具抓不到。科来&#xff0c;这个工具是从网卡抓包。你一旦打怪数据就会多起来↓但不是很专业。可以抓到https。wep↑这个西东是全部协议都做流量包&#xff0c;你不知道他是从哪儿来的&#xff0c;他全都抓&#xff08;专业…

现代 Linux 发行版为何忽略Shell脚本的SUID位?

在现代Linux系统中&#xff0c;为Shell脚本设置 SUID&#xff08;Set User ID&#xff09; 权限位几乎是无效的。这个看似简单的现象背后&#xff0c;是Linux内核设计者们在安全与便利性之间做出的一个至关重要的历史性抉择。要彻底理解这一点&#xff0c;我们需要深入到内核层…