汇编实现: C库常见函数,串操作指令作用
汇编实现: C库常见函数
一丶汇编实现Strncpy拷贝函数
void __asmStrncpy(char *des,char *src,int len)
{
__asm {
mov edi,[ebp + 8]; //获取局部变量地址 des
mov esi,[ebp + 0xc]; //获取局部变量地址 src
mov ecx,len; //使用movs指令,需要给ecx长度
cld //设置DF = 0; 内存方向, 此时edi++ esi ++获取方式
rep movs byte ptr [edi],byte ptr[esi];//根据ecx的值,循环从esi里面获取字节输几局给edi
;rep movsb //直接省略了.默认操作 eis 跟 edi.以字节方式
;rep movsw //以word两个字节为单位拷贝 等价于 rep movs byte ptr[edi],byte ptr[esi]
;rep movsd //四个字节为单位.
}
}
总结:
movs指令的作用
主要使用了串操作指令movs指令 [esi] 拷贝->[edi] ecx计数 rep重复.
1.跟ecx搭配, ecx控制循环次数
2.跟cld搭配. cld设置DF位,这样拷贝的时候内存就是++拷贝
3.movs的主要作用就是把 esi所指向的内存数据 拷贝到 edi所指向的内存中.
4.movs 有很多重载, 例如 movsb movsw movsd 分别就是按照字节拷贝, 按照一个字拷贝 按照4个字拷贝.
二丶loads实现Strlen操作.
loads作用: 将 [esi]所指向内存拷贝到 eax中/ax al..
int __asmStrlen(char *src)
{
__asm{
mov esi,[ebp + 8]; //获取src参数地址给esi
xor eax,eax;
xor ebx,ebx; //清空计数寄存器
Len:
Lods byte ptr[esi]; //将esi内存的字符串按照1字节给eax存储
test eax,eax; //判断最后的eax是否为0
jz Exit; //为0 就把计数的值给eax进行返回
inc ebx; //不为0,计数器++
jnz len; //并且跳转到上边继续执行.
Exit:
mov eax,ebx;
}
}
总结:
lods 主要就是[esi] 内存的值给eax进行存储. 其lodsb lodsd lodsw 分别就是按照一个字节 两个字节 4个字节赋值.
1.lods寄存器 操作的 esi 跟 eax寄存器
2.eax存放从esi里面获取的数据按照 lodsb lodsd losw等指令拷贝一个字节还是多个字节
3.loads 是通用的,后面只需要给定你拷贝的字节个数即可. 例如 lods byte ptr[esi] word ptr[esi]
三丶stos的作用
stos作用于 edi,和 eax. 把eax的值拷贝到edi所指向的内存中.
根据ecx的长度决定,配合rep指令.
相应的也有
stosb
stosw
stosd
__declspec(naked) int RetValue()
{
__asm
{
push ebp; ;保存栈低,老ebp
mov ebp,esp ;老ebp等于当前的栈顶,便于寻址
sub esp,0x20; ;开辟局部变量空间
lea edi,[esp]; ;取得栈顶地址,进行拷贝.首先获取一下,否则如果写在下方则要 ebp - xxx进行获取局部变量空间
pushad ;保存寄存器环境
mov ecx,0x20 ;赋值ecx 0x20个字节. rep循环20次.以byte 的形式
mov eax,0xcc; ;eax给cc,进行初始化
rep stos byte ptr[edi]; ;根据ecx个数,将局部eax的值赋值到edi中,给局部变量初始化为cc
popad ;恢复寄存器环境
mov esp,ebp ;恢复局部变量空间, 栈顶跟原栈顶一样.
pop ebp ;恢复栈低.
ret ;返回.
}
}
总结
总结来说. stos(stosb sw sd)就是把eax的值,拷贝到edi所指向的内存中,使用rep循环指令.拷贝大小.
1.获取局部变量空间.
2.给eax赋值你要初始化的值
3.给ecx赋值,计数的值
4.rep 配合stos将 eax值赋值给edi所指向的内存
汇编实现: C库常见函数,串操作指令作用的更多相关文章
- 汇编3栈帧,参数传递,串操作,混合汇编,x64,asm文件
基础知识2 选择结构 通过判断 + 条件跳转指令来实现 循环结构 通过判断 + 条件跳转指令来实现(会有一个向上跳转的语句) 函数调用约定 C调用约定: 由外部平衡栈 标准调用约定 : 由函数内部平衡 ...
- DF标志和串移动指令(movsb/movsw)
1.标志寄存器的第10位DF,方向标志位.在串处理指令中,控制每次操作后si,di的增减 DF=0,每次操作后,si.di添加 DF=1,每次操作后,si.di减小 我们能够用汇编语法描写叙述movs ...
- ARM指令集——条件执行、内存操作指令、跳转指令
ARM 汇编指令条件执行 在ARM模式下,任何一条数据处理指令可以选择是否根据操作的结果来更新CPSR寄存器中的ALU状态标志位.在数据处理指令中使用S后缀来实现该功能. 不要在CMP,CMN,TST ...
- DF标志和串传送指令
DF标志和串传送指令 flag的第10位是DF,方向标志位.在串处理指令中,控制si.di的递减. df = 0 每次操作后si.di递增 df = 1 每次操作后si.di递减 串传送指令 格式1: ...
- 计算机系统之汇编---IA32处理器数据格式及数据操作
计算机系统之汇编---IA32处理器数据格式及数据操作 IA32数据格式: Intel用术语"字"表示16位数据类型,因此.称32位数为"双字",称64位数为& ...
- ARM汇编初探---汇编代码中都有哪几类指令---ARM伪指令介绍
要学习一个东西首先要把概念搞清楚,以下仅仅是自己的一些关于汇编的理解. 可运行文件里的01码是机器码,机器码不等于汇编码,尽管机器码能够非常easy翻译成汇编码. 汇编码中包括非常多汇编指令.伪指令和 ...
- git操作指令,以及常规git代码操作
安装git后操作指令如下:可以查阅git安装使用操作指南详情git安装使用操作图示详情.note 线上可参考指南:http://www.bootcss.com/p/git-guide/ 所有操作在 ...
- 高级运维(六):源码安装Redis缓存服务、常用Redis数据库操作指令、配置Redis主从服务器
一.源码安装Redis缓存服务 目标: 本案例要求先快速搭建好一台Redis服务器,并测试该缓存服务器: 1> 设置变量test,值为123 2> 查看变量test的值 3> 设置计 ...
- 第24篇-虚拟机对象操作指令之getfield
getfield指令表示获取指定类的实例域,并将其值压入栈顶.其格式如下: getstatic indexbyte1 indexbyte2 无符号数indexbyte1和indexbyte2构建为(i ...
随机推荐
- 如何优化UI布局?
Android系统中填充布局是一个开销巨大的过程,每一个额外的嵌套布局和包含的View,都直接影响到应用程序的性能和响应能力.为了使应用程序流畅地运行和快速地响应,重要的是尽可能地保持布局的简单和避免 ...
- 用ttBulkCp把excel中的数据导入到timesten数据库中
最近要做数据预处理,需要用到数据库.而且是以前从来没听说过的TimesTen. 首要目标是要把Excel里的数据,导入到TimesTen数据库中.而TimesTen在win10里用不了,于是我就在虚拟 ...
- ubuntu显卡驱动安装
1.确定显卡型号 网上有些使用lspci | grep -i nvidia可以查看显卡型号,但是我的好像查不到具体型号,如下图. 但是后来我知道了安装的是1080Ti,所以也就明确了型号.驱动在(ht ...
- 分享使用tcb-router路由开发的云函数短信平台SDK
上篇文章我们分享了如何使用纯的云函数开发的榛子短信短信(http://smsow.zhenzikj.com)SDK,由于微信对于未付费云函数个数的限制,这种方法存在缺陷,经过改进,使用tcb-rout ...
- Object-C 编程问题汇总
Object-C 编程问题汇总 Cocopods 安装时遇见的问题: error: RPC failed; curl 56 LibreSSL SSL_read: SSL_ERROR_SYSCALL, ...
- HBuilder git使用-环境配置
HBuilder中使用的是Egit插件,但提供的相关资料太少,这是目前遇到的一些问题的总结 1. 安装好egit插件后,本机需要安装Git windows的安装程序,并配置好相关的环境变量(理论上是自 ...
- return和throw某些特性相似
拷贝构造函数的调用拷贝构造函数会在以下三中情况下被调用(1)当类的一个对象去初始化该类的另一个对象时 int main(){ Point a(1,2); Point b(a);//用对象a初始化对象b ...
- emWin洗衣机简易操作界面,含uCOS-III和FreeRTOS两个版本
第3期:洗衣机简易操作界面 配套例子:V6-904_STemWin提高篇实验_洗衣机简易操作界面(uCOS-III)V6-905_STemWin提高篇实验_洗衣机简易操作界面(FreeRTOS) 例程 ...
- emWin酿造机过程演示,含uCOS-III和FreeRTOS两个版本
第2期:酿造机过程演示 配套例子:V6-902_STemWin提高篇实验_酿造机过程演示(uCOS-III)V6-903_STemWin提高篇实验_酿造机过程演示(FreeRTOS) 例程下载地址:h ...
- Trie树(字典树)的介绍及Java实现
简介 Trie树,又称为前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串.与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定.一个节点的所有子孙都有相同的前缀,也 ...