安卓逆向之ARM汇编寻址,汇编指令
一:ARM汇编寻址
1. 立即数寻址 (Immediate Addressing)
指令中直接给出一个常数值(立即数),并对其进行操作。
MOV R0, #5 ; 将立即数5载入寄存器R0
2. 直接寻址 (Direct Addressing)
指令中给出的地址直接指定了内存中的一个位置,通常在数据段中。
LDR R0, =0x1000 ; 将地址0x1000的值加载到R0寄存器
3. 间接寻址 (Indirect Addressing)
使用寄存器中的地址来访问内存中的数据。
LDR R0, [R1] ; 将R1寄存器中存储的地址所指向的值载入R0
4. 基址寻址 (Base Addressing)
通过一个基址寄存器,加上一个偏移量来访问内存。
LDR R0, [R1, #4] ; 从R1寄存器所指向的地址加上4的偏移量处加载数据到R0
5. 偏移寻址 (Offset Addressing)
在基址的基础上,通过增加一个偏移值来访问数据。
STR R0, [R1, R2] ; 将R0的值存储到地址为R1 + R2的内存位置
6. 自增和自减寻址 (Pre-Indexed & Post-Indexed Addressing)
通过预增或后增来访问数据。
- 预索引 (Pre-Indexed): 在访问内存前,先修改基址寄存器的值。
LDR R0, [R1, #4]! ; 加载R1地址加4处的值到R0,并将R1更新为R1 + 4
- 后索引 (Post-Indexed): 在访问后修改基址寄存器的值。
LDR R0, [R1], #4 ; 首先加载R1地址处的值到R0,然后将R1增加4
7. 结构体寻址 (Struct Addressing)
通常在处理结构体时,利用基址和字段偏移量进行访问。
LDR R0, [R1, #OFFSET] ; 读取R1寄存器指向的位置加上字段偏移量存入R0
8. 无条件跳转和条件跳转
无条件跳转 B
和带条件的跳转指令 BEQ
、BNE
等,这些也是寻址模式的体现,因为它们影响程序计数器 (PC) 的值。
B label ; 跳转到 label
BEQ label ; 如果 ZF (零标志位) 为 1,跳转到 label
示例汇编程序
以下是一个简单的 ARM 汇编程序示例,展示了不同寻址方式的使用:
.section .data
value: .word 10.section .text
.global _start_start:LDR R0, =value ; 使用直接寻址加载 value 地址LDR R1, [R0] ; 使用间接寻址加载 value 的值 (10)ADD R1, R1, #1 ; R1 = R1 + 1,结果 R1 = 11STR R1, [R0] ; 使用间接寻址将 R1 的值存回 memory locationMOV R7, #1 ; 系统调用号 (exit)SWI 0 ; 触发系统调用,退出程序
在 ARM 汇编语言中,寄存器移位寻址、加载/存储寻址方式以及栈寻址是非常重要的寻址模式。
1. 寄存器移位寻址 (Register Shift Addressing)
寄存器移位寻址允许在操作数中对寄存器的值进行位移操作。这种模式通常用于算术和逻辑操作中,可以通过左移、右移等方式改变寄存器中的值。
示例
MOV R0, #1 ; 将立即数1加载到R0
LSL R1, R0, #2 ; 将R0左移2位,结果存储在R1中 (R1 = 4)
LSR R2, R1, #1 ; 将R1右移1位,结果存储在R2中 (R2 = 2)
- LSL (Logical Shift Left): 左移操作,低位补零。
- LSR (Logical Shift Right): 右移操作,最高位补零。
2. 加载/存储寻址方式 (Load/Store Addressing)
在 ARM 中,加载(LDR)和存储(STR)指令用于将数据从内存加载到寄存器,或将寄存器中的数据存储到内存。常见的加载/存储寻址方式包括:
- 直接寻址: 直接指定地址。
- 基址寻址: 使用基址寄存器和偏移量。
- 间接寻址: 使用寄存器中的地址。
示例
.data
value: .word 10.text
.global _start_start:LDR R0, =value ; 直接寻址,加载 value 的地址LDR R1, [R0] ; 从 R0 指向的地址加载值 (10) 到 R1ADD R1, R1, #1 ; R1 = R1 + 1 (R1 = 11)STR R1, [R0] ; 将 R1 的值存储回 value 的地址
3. 栈寻址 (Stack Addressing)
栈是用于存储局部变量、函数参数和返回地址的特殊内存区域。ARM 使用向下增长的栈,通常通过 PUSH
和 POP
指令进行操作。栈寻址通常涉及到 SP(栈指针寄存器)。
示例
.text
.global _start_start:MOV R0, #5 ; 将5放入R0PUSH {R0} ; 将R0的值压入栈中POP {R1} ; 从栈中弹出值到R1 (R1 = 5)MOV R7, #1 ; 系统调用号 (exit)SWI 0 ; 触发系统调用,退出程序
4. 栈的使用
栈通常用于函数调用和返回。以下是一个简单的示例,演示如何在函数中使用栈:
.text
.global mainmain:PUSH {LR} ; 保存返回地址MOV R0, #10 ; 将10放入R0PUSH {R0} ; 将R0的值压入栈中BL subroutine ; 调用子程序POP {R0} ; 从栈弹出值到R0POP {PC} ; 从栈弹出返回地址,返回到调用者; 程序结束subroutine:POP {R1} ; 从栈弹出值到R1ADD R1, R1, #1 ; R1 = R1 + 1PUSH {R1} ; 将结果压入栈中BX LR ; 返回到调用者
总结
- 寄存器移位寻址 允许对寄存器的值进行位移操作,适用于算术和逻辑运算。
- 加载/存储寻址方式 是 ARM 汇编中最常用的方式,用于在寄存器和内存之间传输数据。
- 栈寻址 是通过栈实现局部变量和函数调用的管理,使用
PUSH
和POP
指令进行操作。
二:汇编指令详细介绍
在 ARM 汇编语言中,指令集非常丰富,涵盖了数据处理、控制流、内存访问等多个方面。以下是一些常见的 ARM 汇编指令的详细介绍,包括它们的功能、语法和示例。
1. 数据处理指令
1.1 MOV (Move)
将一个值移动到寄存器中。
语法:
MOV <destination>, <source>
示例:
MOV R0, #5 ; 将立即数5加载到R0寄存器
1.2 ADD (Addition)
将两个寄存器的值相加,并将结果存储在目标寄存器中。
语法:
ADD <destination>, <operand1>, <operand2>
示例:
ADD R1, R0, R2 ; R1 = R0 + R2
1.3 SUB (Subtraction)
从一个寄存器中减去另一个寄存器的值。
语法:
SUB <destination>, <operand1>, <operand2>
示例:
SUB R3, R1, R0 ; R3 = R1 - R0
1.4 MUL (Multiply)
将两个寄存器的值相乘。
语法:
MUL <destination>, <operand1>, <operand2>
示例:
MUL R4, R0, R1 ; R4 = R0 * R1
2. 逻辑指令
2.1 AND (Bitwise AND)
对两个寄存器的值进行按位与操作。
语法:
AND <destination>, <operand1>, <operand2>
示例:
AND R5, R0, R1 ; R5 = R0 & R1
2.2 ORR (Bitwise OR)
对两个寄存器的值进行按位或操作。
语法:
ORR <destination>, <operand1>, <operand2>
示例:
ORR R6, R0, R1 ; R6 = R0 | R1
2.3 EOR (Bitwise Exclusive OR)
对两个寄存器的值进行按位异或操作。
语法:
EOR <destination>, <operand1>, <operand2>
示例:
EOR R7, R0, R1 ; R7 = R0 ^ R1
3. 移位指令
3.1 LSL (Logical Shift Left)
将寄存器的值左移指定的位数。
语法:
LSL <destination>, <source>, #<shift>
示例:
LSL R8, R0, #2 ; R8 = R0 << 2
3.2 LSR (Logical Shift Right)
将寄存器的值右移指定的位数。
语法:
LSR <destination>, <source>, #<shift>
示例:
LSR R9, R1, #1 ; R9 = R1 >> 1
4. 加载和存储指令
4.1 LDR (Load Register)
从内存加载数据到寄存器。
语法:
LDR <destination>, [<address>]
示例:
LDR R0, [R1] ; 从R1指向的地址加载数据到R0
4.2 STR (Store Register)
将寄存器中的数据存储到内存。
语法:
STR <source>, [<address>]
示例:
STR R0, [R1] ; 将R0的值存储到R1指向的地址
5. 控制流指令
5.1 B (Branch)
无条件跳转到指定标签。
语法:
B <label>
示例:
B loop ; 跳转到 loop 标签
5.2 BL (Branch with Link)
跳转到指定标签并保存返回地址。
语法:
BL <label>
示例:
BL function ; 跳转到 function 标签并保存返回地址
5.3 BX (Branch and Exchange)
跳转到指定寄存器的地址,并根据地址的最低位决定是 ARM 还是 Thumb 模式。
语法:
BX <register>
示例:
BX R0 ; 跳转到R0寄存器指向的地址
6. 栈操作指令
6.1 PUSH
将寄存器的值压入栈中。
语法:
PUSH {<registers>}
示例:
PUSH {R0, R1} ; 将R0和R1的值压入栈中
6.2 POP
从栈中弹出值到寄存器。
语法:
POP {<registers>}
示例:
POP {R0, R1} ; 从栈中弹出值到R0和R1
7. 条件执行指令
ARM 汇编指令可以通过条件后缀来实现条件执行。例如,BEQ
表示“如果相等则跳转”。
7.1 BEQ (Branch if Equal)
如果零标志位(ZF)为1,则跳转。
语法:
BEQ <label>
示例:
BEQ equal_label ; 如果相等则跳转到 equal_label
7.2 BNE (Branch if Not Equal)
如果零标志位(ZF)为0,则跳转。
语法:
BNE <label>
示例:
BNE not_equal_label ; 如果不相等则跳转到 not_equal_label
三:补充:数据处理指令
在 ARM 汇编语言中,数据处理指令是用于对寄存器中的数据进行算术运算、逻辑运算、位操作等的指令。除了之前提到的基本指令,ARM 还提供了许多其他强大的数据处理指令。
1. 数据处理指令详细介绍
1.1 ADC (Add with Carry)
将两个寄存器的值相加,并加上进位标志(C)。
语法:
ADC <destination>, <operand1>, <operand2>
示例:
ADC R0, R1, R2 ; R0 = R1 + R2 + C
1.2 SBC (Subtract with Carry)
从一个寄存器中减去另一个寄存器的值,并减去进位标志(C)。
语法:
SBC <destination>, <operand1>, <operand2>
示例:
SBC R0, R1, R2 ; R0 = R1 - R2 - C
1.3 ROR (Rotate Right)
将寄存器的值右旋转指定的位数。
语法:
ROR <destination>, <source>, #<shift>
示例:
ROR R0, R1, #2 ; R0 = R1 右旋转2位
1.4 ROL (Rotate Left)
将寄存器的值左旋转指定的位数(在 ARM 中通常使用 LSL 来实现)。
语法:
ROL <destination>, <source>, #<shift>
示例:
MOV R0, R1 ; 将R1复制到R0
LSL R0, R0, #1 ; 左移1位
ORR R0, R0, R1, LSR #31 ; 将R1的最高位移到最低位
1.5 CMP (Compare)
比较两个寄存器的值,设置状态标志,但不存储结果。
语法:
CMP <operand1>, <operand2>
示例:
CMP R0, R1 ; 比较R0和R1的值
1.6 CMN (Compare Negative)
比较两个寄存器的值,并设置状态标志,类似于 CMP,但相当于 R0 + R1。
语法:
CMN <operand1>, <operand2>
示例:
CMN R0, R1 ; 计算R0 + R1并设置状态标志
1.7 TST (Test)
对两个寄存器进行按位与操作,设置状态标志,但不存储结果。
语法:
TST <operand1>, <operand2>
示例:
TST R0, R1 ; R0 和 R1 进行按位与操作
1.8 TEQ (Test Equivalence)
对两个寄存器进行按位异或操作,设置状态标志,但不存储结果。
语法:
TEQ <operand1>, <operand2>
示例:
TEQ R0, R1 ; R0 和 R1 进行按位异或操作
1.9 BIC (Bit Clear)
将一个寄存器的值与另一个寄存器进行按位与,清除指定的位。
语法:
BIC <destination>, <operand1>, <operand2>
示例:
BIC R0, R1, #0xFF ; 清除R1中最低的8位,结果存入R0
1.10 MVN (Move Not)
将一个寄存器的值取反,并存储到目标寄存器中。
语法:
MVN <destination>, <source>
示例:
MVN R0, R1 ; R0 = ~R1
2. 其他重要指令
2.1 SEL (Select)
根据条件选择一个寄存器的值。虽然在 ARM 指令集中并不常见,但在某些 ARM 扩展中存在。
语法:
SEL <destination>, <condition>, <operand1>, <operand2>
示例:
SEL R0, R1, R2, R3 ; 根据条件选择 R1 或 R2 存入 R0
2.2 CLZ (Count Leading Zeros)
计算一个寄存器中前导零的数量。
语法:
CLZ <destination>, <source>
CLZ R0, R1 ; R0 = R1 中前导零的数量
相关文章:
安卓逆向之ARM汇编寻址,汇编指令
一:ARM汇编寻址 1. 立即数寻址 (Immediate Addressing) 指令中直接给出一个常数值(立即数),并对其进行操作。 MOV R0, #5 ; 将立即数5载入寄存器R02. 直接寻址 (Direct Addressing) 指令中给出的地址直接指定了内存中的一…...
Idea常见插件(超级实用)
文章目录 Idea好用的插件推荐Idea插件安装Chinese(中文版)Alibaba Java Coding Guidelines(代码规范)Auto Filling Java Arguments(自动补全参数)CamelCase(变量名称格式转换)CodeGeeX(智能&…...
C++中如何获取时间并格式化为字符串?
在C中,你可以使用标准库中的 <chrono> 和 <iomanip> 头文件来获取当前时间并将其格式化为字符串。以下是一个简单的示例,展示了如何获取当前时间并将其格式化为一个可读的字符串(例如:YYYY-MM-DD HH:MM:SS)…...
项目1 yolov5鱼苗检测计数
yolov5鱼苗检测 1. yolov5鱼苗检测1.1. 环境配置1.2 Predict1.3 Validate1.4 Train1.5 生成 ONNX 2 代码解析2.1 模型2.2 数据集2.3 损失函数2.4 训练2.5 预测 之前做的项目,再回顾一下 环境:GPU1卡,CPU4核,每显卡12GB,…...
GPU 学习笔记三:GPU多机多卡组网和拓扑结构分析(基于数据中心分析)
文章目录 一、概述二、数据中心(DC)2.1 数据中心简介2.2 传统数据中心的网络模型2.3 脊叶网络模型(Spine-Leaf)2.4 Facebook的Fabric网络架构 三、基于数据中心的多机多卡拓扑3.1 Spine-Leaf 架构网络规模测算方法3.2 NVIDIA多机多…...
各编程语言处理HTTP状态码的库推荐
Http 状态码用那个库 备注 Spring 的状态码库为 org.springframework.http.HttpStatus Apache 的状态码库为: org.apache.http.HttpStatus 通常这 2 个库都差不多。 如你的项目中已经用了 Spring 的代码的话,那么就用 Spring 的库吧。 不管是那个库…...
【Mac】Python 环境管理工具
一、pyenv 1、安装 (1)安装 brew install pyenv(2)环境配置 查看系统使用 shell 是 bash 还是 zsh bash 配置文件:~/.bash_profile zsh 配置文件:~/.zshrc userMac ~ % echo $SHELL /bin/zsh userMa…...
大语言模型数据流程源码解读(基于llama3模型)
文章目录 前言一、数据进入LlamaForCausalLM(LlamaPreTrainedModel)类二、数据进入LlamaModel(LlamaPreTrainedModel)类1、input_ids的embedding编码2、position_ids位置获取3、causal_mask因果mask构建1、causal_mask调用2、因果mask代码解读(_update_causal_mask)4、hidden_s…...
[蓝桥杯 2015 省 A] 饮料换购
题目描述 乐羊羊饮料厂正在举办一次促销优惠活动。乐羊羊 C 型饮料,凭 3 个瓶盖可以再换一瓶 C 型饮料,并且可以一直循环下去(但不允许暂借或赊账)。 请你计算一下,如果小明不浪费瓶盖,尽量地参加活动,那么ÿ…...
K8S测试pod内存和CPU资源不足
只设置requests参数 mysql主从pod启动后监控 读压测之后 同时设置limits和requests,只调低内存值 监控 压力测试 同时设置limits和requests,只调低CPU值 初始状态 开始压测 结论 对于CPU,如果pod中服务使用CPU超过设置的limits&…...
rabbitmq 使用注意事项
1,注意开启的端口号,一共四个端口号,1883是mqtt连接的端口号,如果没开,是连接不上的需要手动起mqtt插件。 //开始mqtt插件服务 rabbitmq-plugins enable rabbitmq_mqtt 2,15672端口是http网页登录的管理后…...
<项目代码>YOLOv8 夜间车辆识别<目标检测>
YOLOv8是一种单阶段(one-stage)检测算法,它将目标检测问题转化为一个回归问题,能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法(如Faster R-CNN),YOLOv8具有更高的…...
xterm.js 库作用
前言:xterm.js 是一个用于在网页上模拟终端的强大 JavaScript 库。 一、在网页中实现终端模拟 1. 提供类似终端的界面 xterm.js可以在浏览器中创建一个看起来和行为都类似于传统终端的界面。这包括显示命令行提示符、接受用户输入、显示命令输出等。 例如&#…...
在Excel中如何快速筛选非特定颜色
Excel中的自动筛选是个非常强大的工具,不仅可以筛选内容,而且可以筛选颜色,例如筛选A列红色单元格。但是有时希望筛选除了红色之外的单元格(下图右侧所示),其他单元格的填充色不固定,有几种颜色…...
kotlin定时器和主线程定时器
场景 最近要用kotlin写一个每隔一段时间切视频并截图 刷刷的就写出来了,很快啊 timerTask object : TimerTask() {override fun run() {captureWindow()if ((group 1) * 4 > urls.size) {showDialog()timerTask.cancel()timer.cancel()}groupupdatePlayers(…...
vscode不能执行vue命令/ vue : 无法加载文件
问题: 解决: 1. 在Windows应用中找到Windows PowerShell,以管理员运行: 2. 在命令框输入: set-ExecutionPolicy RemoteSigned, 然后输入A即可解决...
1.4 STL C++面试问题
1.4.1 说说STL的基本组成部分 总结 STL 的基本组成部分包括容器、算法、迭代器、函数对象和仿函数和适配器。通过这些组件,STL 提供了高效、灵活和可复用的代码结构,极大地提高了 C 的开发效率和程序的可维护性。STL 的设计思想使得算法和数据结构的使…...
Bash、sh 和 Shell都弄混了?
在Linux和Unix系统中,Bash、sh 和 Shell 都与命令行解释器相关,但它们各自的含义和作用略有不同。以下是它们之间的关系和区别: Shell Shell 是一个通用术语,指的是操作系统中负责解释和执行用户命令的程序。它是用户与操作系统…...
架构师备考专栏-导航页
简介 架构师备考专栏——软考系统架构师考试的学习宝典,集合了全面覆盖架构师考试大纲的精华文章。每篇文章都为本人手输,并校对数遍后发表,在此我保障每篇文章的质量绝对过关。诚邀对架构师软考感兴趣的朋友们收藏此页面,并根据个人所需高效…...
STM32-Cube定时器TIM
一、内部时钟源 1、创建项目 File → New → STM32 project选择STM32F103C8T6单片机,命名TIM 2、配置单片机 1.打开USART1,方便我们与电脑连接查看数据 开启UART1并开启中断。 2、设置时钟源 开启外部高速晶振 将时钟频率设置为72MHz 设置调试模…...
Webpack 是什么? 解决了什么问题? 核心流程是什么?
在前端开发中,Webpack 无疑是一个举足轻重的工具。它作为一个静态资源打包工具,能够帮助开发者将项目中的各种资源高效整合,以便于在浏览器中加载和执行。本文将深入探讨 Webpack 的核心功能、解决的问题以及 Webpack的核心流程。 Webpack是什…...
Jenkins面试整理-Jenkins 的主要用途是什么?
Jenkins 的主要用途 是在软件开发流程中实现自动化,尤其是在持续集成(CI)和持续交付/部署(CD)中。具体来说,Jenkins 的主要用途包括: 1. 持续集成(CI): ● Jenkins 自动从版本控制系统(如 Git、SVN)中拉取代码,自动化地编译、构建和测试代码。 ● 每当开发人员提…...
Linux下使用C/C++进行UDP网络编程
UDP 是User Datagram Protocol 的简称,中文名是用户数据报协议,是一种无连接、不可靠的协议,同样它也是工作在传顺层。它只是简单地实现从一端主机到另一端主机的数据传输功能,这些数据通过 IP 层发送,在网络中传输&am…...
【JavaEE初阶】网络原理—关于TCP协议值滑动窗口与流量控制,进来看看吧!!!
前言 🌟🌟本期讲解关于TCP协议的重要的机制“连接的建立和断开”~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客 🔥 你的点赞就是小编不断更新的最大动力 …...
无人机避障——使用三维PCD点云生成的2D栅格地图PGM做路径规划
着重介绍通过对三维 PCD 点云进行处理生成 2D 栅格地图 PGM,而后将该 PGM 地图充分运用到无人系统路径规划之中,使得无人机能够依据此规划合理避开飞行路线上可能出现的障碍物。(解决如何使用PGM的问题) Hybrid A*算法 参考博客…...
supermall项目上拉加载bug分析
1.bug分析 bug出现的过程是这样的:better-scroll框架会计算滚动内容的高度(通过BScroll对象的scrollerHeight属性记录滚动内容的高度) 由于内容中的图片资源还未加载成功 就已经完成计算 导致计算结果错误 而计算之后 图片资源随之加载完成 这时候better-scroll框架…...
【linux网络编程】| socket套接字 | 实现UDP协议聊天室
前言:本节内容将带友友们实现一个UDP协议的聊天室。 主要原理是客户端发送数据给服务端。 服务端将数据再转发给所有链接服务端的客户端。 所以, 我们主要就是要实现客户端以及服务端的逻辑代码。 那么, 接下来开始我们的学习吧。 ps:本节内容…...
第二届开放原子大赛-开源工业软件算法集成大赛即将启动!
第二届开放原子大赛-开源工业软件算法集成大赛作为开放原子开源基金会组织举办的开源技术领域专业赛事,聚焦开源底座框架平台建设,通过组件化集成的开发模式,丰富平台功能模块,拓展其应用场景,以此促进工业软件生态的繁…...
PXC集群(Percona XtraDB Cluster )
一、简介 基于Galera Cluster技术的开源分布式数据库解决方案,它允许你在多个MySQL服务器之间创建一个同步的多主复制集群。 特点: * 多主复制架构: PXC集群支持多主复制,每个节点都可以同时读写数据,这使得应用程序可以更灵活地进行负载均衡和高可用性设置。* 同步复制:…...
分布式光伏是什么意思?如何高效管理?
分布式光伏系统是指在用户现场或靠近用电现场配置较小的光伏发电供电系统,以满足特定用户的需求。根据通知,分布式光伏系统主要有以下几类定义: 10kV以下电压等级接入,且单个并网点总装机容量不超过6MW的分布式电源:这…...
wordpress示例/最新疫情19个城市封城
springBoot项目打jar包后,配置文件(application.properties)封装于jar包中,修改起来不方便,可以使用其他的办法。 spring boot给了几个读取配置文件的位置,我们可以通过这个方式去从jar包外部修改配置文件。 启动jar包时…...
wordpress 安装语言/网络营销的具体形式种类
随着微信的普及,扫码登录方式越来越被现在的应用所使用。它因为不用去记住密码,只要有微信号即可方便快捷登录。微信的开放平台原生就有支持扫码登录的功能,不过大部分人还是在用公众平台,所以扫码登录只能自行实现。这里基于微信…...
沧州网站建设费用/深圳优化公司统高粱seo
ubuntu下使用sratoolkit将sra文件转换成fastq文件: 环境:ubuntu14.04 sratoolkit.2.5.5-ubuntu641.下载 下载地址: http://trace.ncbi.nlm.nih.gov/Traces/sra/sra.cgi?cmdshow&fsoftware&msoftware&ssoftware# 2.将sra转换成…...
会搭建网站找什么工作室/谷歌seo综合查询
http://blog.csdn.net/smartempire/article/details/23168945 看关于LBP人脸识别的论文时提到了Histogram intersection这个方法,方法最初来自The Pyramid Match Kernel:Discriminative Classification with Sets of Image Features这篇论文,用来对特征构…...
初级买题做哪个网站好/建网站公司哪里好
用ifconfig -a来查看正确的网卡名 # 手工指定的方式################################ # ipconfig fxp0 192.168.8.33/24 # 添加网卡ip# route add default 192.168.8.1 # 添加路由(也可理解为网关)立即生效,但是重启后失效。 #重新启…...
模板网站建设平台/如何把网站推广出去
很多同学兴许有这样的烦恼,就是对于自己文件夹中的相似的图片想删除,可是奈何图片太多,所以手动删除太浪费时间了,那么今天学到这段代码,就不需要手动了。 如下是我对视频截取的一些帧,我通过算法将这些相似…...