汇编实现: C库常见函数,串操作指令作用

目录

  • 汇编实现: C库常见函数

    • 一丶汇编实现Strncpy拷贝函数

汇编实现: 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个字拷贝.

原文地址:https://www.cnblogs.com/iBinary/p/9835948.html

时间: 2024-10-01 07:35:53

汇编实现: C库常见函数,串操作指令作用的相关文章

串操作汇编笔记

movs  串传送指令 stos  串存入指令

汇编-串操作-字符串拷贝

 一.实习题目:串操作 二.实习目的:掌握串操作程序设计的基本方针 三.实习内容:将首地址DATA1按字节存储的数据块通过使用字符串操作将其移动到首地址为 DATA2的数据块中. 四.代码: <strong> </strong>data segment dataOne db 'It is a temp string',0ah,0dh,'$' dataTwo db 50 dup(?) msgOne db 0ah,0dh,'source string:','$' msgTwo db

DF标志和串移动指令(movsb/movsw)

1.标志寄存器的第10位DF,方向标志位.在串处理指令中,控制每次操作后si,di的增减 DF=0,每次操作后,si.di增加 DF=1,每次操作后,si.di减小 我们可以用汇编语法描述movsb的功能如下: mov es:[di],byte ptr ds:[si]   ;8086不支持这样的指令,仅做描述之用 如果DF=0:inc si inc di 如果DF=1:dec si dec di 可以看出,movsb的功能是将ds:si指向的内存单元中的字节送入es:di中,然后根据标志寄存器D

计算机系统之汇编---IA32处理器数据格式及数据操作

计算机系统之汇编---IA32处理器数据格式及数据操作 IA32数据格式: Intel用术语"字"表示16位数据类型,因此,称32位数为"双字",称64位数为"四字". Char*这里指的是所有指针类型,注意:c语言新增加的long long是八字节,但是硬件IA32不支持这个类型. 寄存器(8个32位的寄存器,均以%e开头) %eax.%ecx.%edx:调用者保存(数据)寄存器,当过程p调用q,q可以覆盖这些寄存器,但是不会改变p中的数据.

Git大法好——2.Git本地操作指令详解

Git大法好--2.Git本地操作指令详解 引言 上节给大家讲解了有关于Git的一些概念,Git的引入,Git的四个组成部分,Git文件的状态,以及 Git的下载安装:前面也讲过Git和SVN有个明显的差别就是,Git可以不需要网络就可以进行版本 控制,这是因为Git中每个电脑都拥有一个本地的版本库,而远程的仓库仅仅是作为我们交换修改 的一个工具!即使失去这个工具,我们也可以干活,只是交换修改不方便罢了,假如是SVN,远程 服务器挂了-所以,我们使用Git的时候大部分时间都是在进行Git的一些本

git 入门操作指令

git add [commit file list] 将已经修改的代码添加索引 git commit -m [commit message] 将已经索引的代码修改提交至本地的库 git push origin [branch_name] 将分支 branch_name 的代码推送至服务器 git pull origin [branch_name] 获取分支 branch_name上的最新代码 git pull --rebase origin [branch_name] 将当前 branch 从

mysql的基础操作指令整理|环境redhat6

1.安装 yum-y install mysql mysql-server service mysqld start|stop|restart        ##启动|停止|重启 chkconfig mysqld on|off                  ##开机启动|关闭 此时输入:mysql就能启动进入(记得是start状态) 2.改密 mysqladmin –uroot password             ##创建密码 mysqladmin–uroot –pxxoo passw

ARM汇编初探---汇编代码中都有哪几类指令---ARM伪指令介绍

要学习一个东西首先要把概念搞清楚,下面只是自己的一些关于汇编的理解. 可执行文件中的01码是机器码,机器码不等于汇编码,虽然机器码可以很容易翻译成汇编码. 汇编码中包含很多汇编指令.伪指令和宏指令等,这些是不可以直接在机器上运行的. 机器指令是ARM指令集和Thumb指令集这些arm硬件支持的指令集组成的. 汇编码中的伪指令和宏指令这些都是汇编语言这个级别的指令,在汇编文件编译的时候汇编编译器as会去处理这些指令,在编译期间也会对宏进行展开,类似于gcc编译的时候对C代码中的宏展开一样.个人感觉

DF标志和串传送指令

DF标志和串传送指令 flag的第10位是DF,方向标志位.在串处理指令中,控制si.di的递减. df = 0 每次操作后si.di递增 df = 1 每次操作后si.di递减 串传送指令 格式1: movsb 功能描述 1. ((es)*16+di) = ((ds)*16+si) 2. 如果 df=0 则: (si)=(si)+1 (di)=(di)+1 如果 df=1 则: (si)=(si)-1 (di)=(di)-1 C语言描述 // si,di 相当于C语言循环中 i,j 变量的功能