26 strcpy 的调试

news/2025/3/21 12:45:01/

前言

同样是一个 很常用的 glibc 库函数 

不管是 用户业务代码 还是 很多类库的代码, 基本上都会用到 字符串的复制 

不过 我们这里是从 具体的实现 来看一下 

它的实现 主要是使用 汇编 来进行实现的, 因此 理解需要一定的基础 

测试用例

就是简单的使用了一下 strcpy, strlen 

root@ubuntu:~/Desktop/linux/HelloWorld# cat Test03Strcpy.c 
#include "stdio.h"int main(int argc, char** argv) {int x = 2;
int y = 3;
int z = x + y;char* p1 = (char*) malloc(20);
char* p2 = (char*) malloc(20);
printf("p1 : 0x%x\n", p1);
printf("p2 : 0x%x\n", p2);memset(p1, 'a', 12);
strcpy(p2, p1);
int p2Len = strlen(p2); printf(" p1 = %s, p2 = %s, p2Len = %d\n ", p1, p2, p2Len);}

strcpy 的实现

首先是根据 8 字节对齐, 处理对齐之后剩余的字节 

这里的 label 0 的循环, 如果碰到 字符串结束字符, 跳转到 结束处理 

然后 以 8 字节为单位, 每次循环 4 组 来进行数据的复制, 主要是 si -> ax -> di, 然后迭代更新 si, di  

中间的两个 jnc, jnz 的这段逻辑处理主要是判断 当前这批 8 字节是否存在 字符串结束符 '\0' 

如果存在, 则跳转到 label 3 的流程处理 

否则 进行普通的 8 字节数据拷贝处理到目标内存

如果当前处理的 8 字节[存放于ax] 中存在 字符串结束符 '\0' 

则 label 3 的处理就是按字节 从源内存拷贝到目标内存 

然后 碰到 字符串结束符 '\t', 跳转到 label 4, 结束当前函数 


http://www.ppmy.cn/news/239999.html

相关文章

arm模拟器手机版_基于ARM的模拟器

ARM的ARMulator: ARMulator 是一个在 ARM 公司推出的集成开发环境 ADS (ARM Developer Suite)中提供的指令集模拟器。它与运行在通用计算机(通常是x86体系结构)上的调试器相连接,模拟 ARM 微处理器体系结构和指令集,提供了开发和调试 ARM 程序…

fiddler手机模拟器抓包_fiddler抓取手机模拟器数据

2. 正常傻瓜式安装,下一步,下一步,安装完毕后,先不用急于打开软件。 4.打开Fiddler,点击工具栏中的Tools—>Options 5.https设置及connections设置,勾选选择项 6.点击Actions,点击第二项:Exp…

MAC m1 PRO 安装安卓手机模拟器

背景:本人是一名产品经理,公司开发了好几款安卓APP应用,手机和笔记本都是苹果产品,偶尔需要演示和测试使用,最后找到一个mac安装安卓模拟器的方案,这里记录分享一下。 废话不多说直接上步骤,很…

手机数控模拟器安卓版_数控机床模拟器手机版

数控机床模拟器手机版,这是一款玩法十分经典有趣的游戏,在这款游戏中玩家可以自由的参与加工制作,并且在其中还有真实逼真的游戏音效模拟,带给玩家身临其境的感觉,喜欢的朋友就快快来下载挑战吧。 数控机床模拟器手机版…

服务器上模拟手机系统软件,云服务器可以用手机模拟器

云服务器可以用手机模拟器 内容精选 换一换 您可以使用已有的弹性云服务器创建系统盘镜像、数据盘镜像、整机镜像。系统盘镜像:系统盘镜像包含用户运行业务所需的操作系统、应用软件,可以用于云服务器业务的迁移。数据盘镜像:数据盘镜像是只包含用户业务数据的镜像。用户可以…

键盘手机JAVA模拟器下载_手机java模拟器

手机java模拟器可以帮助用户在安卓系统上运行java程序,用户就可以通过这款软件运行更多不同的java游戏和内容,这款软件的功能是非常的强大的,带给用户更加经典的童年回忆。 手机java模拟器简介: 手机java模拟器的操作都是非常的简…

为什么大多数企业数字化转型失败率高达80%?

数字化转型失败率为什么这么高? 多年的转型研究表明,企业数字化转型的成功率还不到 30%。 麦肯锡2023年报告显示,只有 16% 的受访者表示他们组织的数字化转型成功地提高了绩效,并使他们能够长期维持变革。 即使是精通数字技术的行…

MySQL JDBC详解

文章目录 简介JDBC APIJDBC Driver ManagerJDBC 驱动 JDBC 开发步骤一,导入 JDBC 驱动包,并加载驱动类二,建立数据库连接三,发送 SQL 语句,并获取执行结果Statement 对象PreparedStatement 对象 四,处理返回…