汇编实现strcpy

news/2025/1/16 0:04:22/

需要有两点注意:

  1. .type在windows的mingw上无法识别。
  2. windows下编译会找不到my_strcpy的定义(undefined reference),通过看mingw的代码发现,它会在汇编函数前加一个下划线,所以在我们的汇编代码中加上下划线即可。

维基百科中关于cdecl的阐述,中文版有一条:编译后的函数名前缀以一个下划线字符,但英文版中没有这一条。
且加上下划线后在windows下mingw虽然不再报错,但在linux下gcc又会报undefined reference。
具体原因尚不明确。

32位

.text.globl my_strcpy
.type my_strcpy, @function #.type伪指令在windows下编译会无法失败,可以去掉my_strcpy:movl 8(%esp), %edx	#sourcemovl 4(%esp), %eax	#destpushl %ebp			#保存旧栈底movl %esp, %ebp 	#保存栈顶,结束时恢复movb (%edx), %cl 	#从source取一个字节,放到cltest %cl, %cl		#判断cl是否为0je return			#为0就returnbody:movb %cl, (%eax) 	#把从source取的一个字节放到destmovb 1(%edx), %cl	#取source的下一个字节inc %eax			#递增dest索引inc %edx			#递增source索引test %cl, %cl		#判断取的字节是否为0jne body			#不为0就继续循环return:movl $0, (%eax)		#给dest的字符串结尾加上'\0'movl %ebp, %esp		#恢复栈顶popl %ebp			#恢复栈底ret					#返回

64位

.text.globl my_strcpy
.type my_strcpy, @function_my_strcpy:pushq %rbpmovq %rsp, %rbpmovq %rdi, %rdx #destmovq %rsi, %rax #srcmovb (%rax), %cltest %cl, %clje return
body:movb %cl, (%rdx)movb 1(%rax), %clinc %raxinc %rdxtest %cl, %cljne bodyreturn:movq $0, (%rdx)movq %rbp, %rsppopq %rbpret

使用

main.c:

#include <stdio.h>extern void my_strcpy(char*, const char*);int main(void)
{char str_1[1024];char str_2[]="hello world";my_strcpy(str_1, str_2);puts(str_1);
}

假设my_strcpy定义在my_strcpy.s汇编代码文件中。

对于32位,编译:gcc main.c my_strcpy.s -o main -m32,64位不带-m32就行了。

链接器可能会报可执行堆栈的警告:

/usr/bin/ld: warning: /tmp/ccJvbhJo.o: missing .note.GNU-stack section implies executable stack
/usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker

可以加上-z noexecstack,或者在汇编代码里面加上这一行:

.section	.note.GNU-stack,"",@progbits

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

相关文章

我可能用到的网站和软件

(一)程序员交流的网站 csdn博客 https://www.csdn.net/博客园 博客园 - 开发者的网上家园InfoQ InfoQ - 促进软件开发及相关领域知识与创新的传播-极客邦掘金 掘金 (juejin.cn) (二)代码管理工具 github GitHub: Where the world builds software GitHub 有时候卡&…

GPT与Mdjourney绘图工具完美结合,让你轻松绘制精美图画

小念助手已经实现将GPT与Midjourney结合在一起使用啦&#xff01;现在&#xff0c;你可以在绘图页直接输入你要绘制的主题&#xff0c;之后调用GPT生成适合绘画的描述&#xff0c;等待一会会&#xff0c;一张精致的图片就做好啦&#xff01; 无需担心绘画技巧&#xff0c;小念助…

利用masigpro包进行时间序列分析

这边文章的代码主要源于网上已有的精品推文&#xff0c;根据自身数据和作图时出现的报错“Error in plot.new() : figure margins too large”进行了个性化修改 值得注意的是&#xff1a;maSigPro软件包主要用于差异基因分析&#xff0c;因此其内置的函数和方法都是基于差异基…

MySQL 中NULL和空值的区别

MySQL 中NULL和空值的区别&#xff1f; 简介NULL也就是在字段中存储NULL值&#xff0c;空值也就是字段中存储空字符(’’)。区别 1、空值不占空间&#xff0c;NULL值占空间。当字段不为NULL时&#xff0c;也可以插入空值。 2、当使用 IS NOT NULL 或者 IS NULL 时&#xff0…

【C++杂货铺】拷贝构造函数

&#x1f4d6;定义 拷贝构造函数是构造函数的一个重载&#xff0c;它的本质还是构造函数&#xff0c;那就意味着&#xff0c;只有在创建对象的时候&#xff0c;编译器才会自动调用它&#xff0c;那他和普通的构造函数有什么区别呢&#xff1f; 拷贝构造函数&#xff0c;是创建…

数据结构问答8

查找 1. 一些基本概念 关键字:能唯一标识该元素 查找:给定值k,在含n个元素的表中找出关键字==k的元素。找到返回其位置信息,否则返回-1。 动、静态查找表:查找同时对表进行修改(插入、删除等),相应的表为动态,否则为静态。 内、外查找:整个查找过程在内存中进行…

LLM模型微调方法及经验总结

文章目录 微调方法Freeze方法P-tuning方法prefix-tuningPrompt TuningP-tuning v1P-tuning v2 Lora方法Qlora方法 微调经验模型选择模型大小选择数据处理微调方案英文模型需要做词表扩充吗&#xff1f;如何避免灾难遗忘 参考&#xff1a; 在现在这大规模语言模型&#xff08;LL…

基于langchain 的文档问答 最佳实践(附源码)

文档问答的原理 文档读取并切割&#xff0c;用句向量 向量化&#xff0c;存入向量数据库问题向量化&#xff0c;在向量数据库中进行相似性检索&#xff0c;并存出top K把问题和top K 答案组成 prompt 并发给大模型&#xff0c;等大模型答案 这里面涉及到的技术点有&#xff1a…