博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
汇编实现: C库常见函数,串操作指令作用
阅读量:5346 次
发布时间:2019-06-15

本文共 2463 字,大约阅读时间需要 8 分钟。

目录

汇编实现: 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所指向的内存

转载于:https://www.cnblogs.com/iBinary/p/9835948.html

你可能感兴趣的文章
web@h,c小总结
查看>>
java编程思想笔记(一)——面向对象导论
查看>>
Data Structure 基本概念
查看>>
Ubuntu改坏sudoers后无法使用sudo的解决办法
查看>>
NEYC 2017 游记
查看>>
[搬运] 写给 C# 开发人员的函数式编程
查看>>
Python之旅Day14 JQuery部分
查看>>
core--线程池
查看>>
redux-effect
查看>>
Android轻量级的开源缓存框架ASimpleCache
查看>>
他山之石:加载图片的一个小问题
查看>>
shell - 常识
查看>>
mssql sqlserver 使用sql脚本 清空所有数据库表数据的方法分享
查看>>
分层图最短路【bzoj2763】: [JLOI2011]飞行路线
查看>>
linux下编译复数类型引发的错误:expected unqualified-id before '(' token
查看>>
codeforces 1041A Heist
查看>>
Spring Cloud Stream消费失败后的处理策略(三):使用DLQ队列(RabbitMQ)
查看>>
bzoj1048 [HAOI2007]分割矩阵
查看>>
Java中的编码
查看>>
PKUWC2018 5/6
查看>>