23 memset 的调试

news2024/10/7 10:23:12

前言

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

不管是 用户业务代码 还是 很多类库的代码, 基本上都会用到 内存数据的设置 

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

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

测试用例

就是简单的使用了一下 memcpy, memset, memcmp 


#include "stdio.h"
 
int main(int argc, char** argv) {
 
int x = 2;
int y = 3;
int z = x + y;
 
void *p1 = malloc(20);
void *p2 = malloc(20);
void *p3 = malloc(20);
printf("p1 : 0x%x\n", p1);
printf("p2 : 0x%x\n", p2);
printf("p3 : 0x%x\n", p3);
 
memset(p1, 'a', 12);
memcpy(p2, p1, 17);
int p1CmpResult = memcmp(p1, p2); 
 
printf(" x + y = %d, p1CmpResult = %d\n ", z, p1CmpResult);
 
}

memset 的实现

分为几个部分, 对于 大于64字节的空间的处理, 对于小于 16 字节的处理, 对于 16 - 64 字节的处理 

如下截图为对于 16 - 64 字节的处理[jbe less_16_bytes 之后的部分], 以 16 字节为单位设置的 [start, start+16), [end-16, end) 的字节的数据 为目标字节

      如果是 16-32 字节, 这里会覆盖这所有的字节的数据, 如果是 32-64 字节, 则覆盖的是头16字节 和 尾16字节, 中间一部分数据 还需要处理 

如果长度在 32-64 字节, 则处理 [start+16, start+32), [end-32, end-16) 的数据, 这里的处理将 头尾16字节之外的其他的字节 都覆盖到了 

对于超过了 64 字节的数据, 和上面 32-64 字节的处理一致 

先处理 [start, start+64), [end-64, end) 的数据 

然后长度大于 64, 再循环 以 64 字节为单位, 处理中间的数据, 直到到达 待处理数据末尾 

对于小于 16 字节的数据, 分为 8-16 字节处理, 4-7字节处理, 0-3字节处理 

对于 8-16 字节, 以 8 为单位, 对 [start, start+8), [end-8, end) 进行处理, 无论长度为多少 覆盖的都是 [start, end)

对于 4-7 字节, 以 4 为单位, 对 [start, start+4), [end-4, end) 进行处理, 无论长度为多少 覆盖的都是 [start, end)

对于 1-3 字节, 如果是1字节, 拷贝1字节之后, 走 "testb $2, %dl" 之后就 return 了, 如果是两字节, 走 "testb $2, %dl" 之后 拷贝两字节就 return 了, 如果是三字节, 拷贝1字节之后, "testb $2, %dl" 之后又拷贝了两字节, 然后 return 了

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

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

相关文章

去面试测试开发工程师要做哪些准备?大厂真实面试题汇总

目录 1.黑盒测试和白盒测试的区别特点和方法。 2.单元测试、集成测试、系统测试、验收测试、回归测试 3.集成测试和系统测试的区别和应用场景 4.α测试、β测试,以及它们的区别 5.给你一个字符串,你怎么判断是不是ip地址?手写这段代码&…

大数据之RDD的算子分类

文章目录 前言一、RDD的算子分类二、Transformation转换算子三、Action动作算子总结 前言 #博学谷IT学习技术支持# 上一篇文章主要讲述了两种RDD的创建方式,本篇文章接着讲RDD的算子及其分类。 一、RDD的算子分类 RDD的算子主要有两种类型,一种是Tran…

docker面试题:docker容器虚拟化与传统虚拟机比较

容器就是将软件打包成标准化单元,以用于开发、交付和部署。 容器镜像是轻量的、可执行的独立软件包 ,包含软件运行所需的所有内容:代码、运行时环境、系统工具、系统库和设置。容器化软件在任何环境中都能够始终如一地运行。容器赋予了软件独…

什么是强化学习?强化学习有哪些框架、算法、应用?

什么是强化学习? 强化学习是人工智能领域中的一种学习方式,其核心思想是通过一系列的试错过程,让智能体逐步学习如何在一个复杂的环境中进行最优的决策。这种学习方式的特点在于,智能体需要通过与环境的交互来获取奖励信号&#…

JAVA常用API - 正则表达式

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 目录 文章目录 前言 一,正则表达式是什么? 二,正则表达式符号 三,常用正则表达式组合 四,正则表达…

利用MySQL的binlog恢复误删的数据库

1 查看当前数据库内容并备份数据库 查看数据库信息: 备份数据库: [rootlocalhost ~]# mysqldump -u root -p t > /mnt/t.sql Enter password: [rootlocalhost ~]# ll /mnt/t.sql -rw-r--r-- 1 root root 1771 Aug 25 11:56 /mnt/t.sql2 开启bin…

java-----web项目部署到新服务器以及服务器的部署

目录 一、服务器安装jdk1.8 二、安装mysql5.7 2.1下载mysql 2.2修改root账号密码 2.3设置远程登录 三、项目的部署 3.1导入数据库 3.2将项目打成jar包 3.3项目上传 服务器部署项目的方式,本次以打成jar包的形式讲解(以springboot项目为例&#xf…

2023年贵工程团体程序设计赛--部分题解

作者:杨书瑶 单位:贵州工程应用技术学院 本次比赛由大学生程序设计协会(cpa)举办,共计17道题,295分。其中5分题三道,10分题三道,15分题两道,20分题三道,25分题两道,30分题两道…

chatgpt赋能Python-pythonbus

PythonBus: 为Python 开发者量身打造的社区 对于所有Python 开发者而言,PythonBus 是一个非常值得加入的社区平台。该平台汇聚了全球最顶尖的Python 开发者,同时也是一站式排除各种问题并交流经验的平台。在PythonBus,无论你是初学者还是专家…

【模电实验】基本放大电路的研究实验

实验四 基本放大电路的研究实验(2小时) —、实验目的 (1)充分认识分压式偏置放大电路的电压放大作用,了解其静态工作点的调节、测量,认识截止失真和饱和失真现象,了解消除截止失真和饱和失真…

华为OD机试真题 Java 实现【计算网络信号】【2023Q2 200分】

一、题目描述 网络信号经过传递会逐层衰减,且遇到阻隔物无法直接穿透,在此情况下需要计算某个位置的网络信号值。 注意: 网络信号可以绕过阻隔物array[m][n]的二维数组代表网格地图,array[i][j]0代表i行j列是空旷位置&#xff…

DAY 64 mysql主从复制与读写分离

概念 什么是读写分离? 读写分离,基本的原理是让主数据库处理事务性增、改、删操作( INSERT、UPDATE、DELETE) ,而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。 为什么要读写分离呢? 因为数据库的…

【Linux系列P2】Linux基本指令知识(带图演示,精炼)

前言 大家好,这里是YY的Linux系列part2;本章主要内容面向能使用Linux的老铁,主要内容含【设置普通用户】【Linux基本知识】【基本指令大全】 在下一章节【Linux系列part3】中,YY将手把手讲述Linux的权限知识,欢迎订阅YY的Linux专栏…

MyBatis 是什么?与 Hibernate 的区别是什么?

MyBatis 是一种基于 Java 的持久化框架,它可以将 SQL 语句和 Java 代码进行映射,使得开发人员可以使用面向对象的方式来操作数据库。MyBatis 通过提供 XML 配置文件或注解方式来配置映射关系,使得数据库操作变得更加简单和灵活。 与 Hiberna…

VS Code 配置 C/C++ 开发环境

一、软件下载 需要下载的软件如下: VS Code编译工具:MinGW 或 MSYS2 或 VS2022 VS Code 下载地址:链接 MinGW 下载地址:链接 或者 链接 MSYS2 下载地址:链接 VS2022 下载地址:链接 上述软件下载完成以后…

入门JavaScript编程:上手实践四个常见操作和一个轮播图案例

部分数据来源:ChatGPT 简介 JavaScript是一门广泛应用于Web开发的脚本语言,它主要用于实现动态效果和客户端交互。下面我们将介绍几个例子,涵盖了JavaScript中一些常见的操作,包括:字符串、数组、对象、事件等。 例子…

Java【TCP 协议2】好多人都错了! 保证可靠传输的不是三次握手和四次挥手! 而是...

文章目录 前言一、确认应答1, 什么是确认应答2, 序列号和确认应答号 二、超时重传1, 什么是超时重传 总结 前言 各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你: 📕 JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系…

蓝牙RFCOMM 协议

蓝牙RFCOMM 1.RFCOMM1.1 服务定义模型1.2 字节排序 2 RFCOMM数据帧2.1 选项和模式2.2 帧类型2.3 帧格式2.3.1 Address2.3.2 Control(帧类型)2.3.3 Length2.3.4 InfoData2.3.5 FCS 2.4 多路复用控制命令(DLCI 0)2.4.1 DLC paramete…

OpenCV基础操作(4)颜色空间转换、几何变换、图像二值化操作

OpenCV基础操作(4)颜色空间转换、几何变换、图像二值化操作 import cv2 as cv import numpy as np一、颜色空间转换 1、转换颜色空间 在 OpenCV 中有超过 150 中进行颜色空间转换的方法。但是你以后就会发现我们经常用到的也就两种:BGR↔Gray 和 BGR↔HSV。 我们…

《面试1v1》volatile

基本功 我是 javapub,一名 Markdown 程序员从👨‍💻,八股文种子选手。 面试官: 你能解释一下 volatile 关键字的作用吗? 候选人: 当我们在编写多线程程序时,经常会遇到线程安全的问…