发布时间:2015-11-06 16:48:51作者:知识屋
static inline int strcmp(const char * cs,const char * ct) { int d0, d1; register int __res; __asm__ __volatile__( "1:/tlodsb/n/t" "scasb/n/t" "jne 2f/n/t" "testb %%al,%%al/n/t" "jne 1b/n/t" "xorl %%eax,%%eax/n/t" "jmp 3f/n" "2:/tsbbl %%eax,%%eax/n/t" "orb $1,%%al/n" "3:" :"=a" (__res), "=&S" (d0), "=&D" (d1) :"1" (cs),"2" (ct)); return __res; }
1: lodsb | //装入串操作数,即从DS段中esi位置的字符传送到 al 寄存器,然后 esi 根据DF指向串中下一个元素 ,DF=0,增加;DF=1,减少 |
Scasb | //扫描串操作数,即从 al 中减去ES段中edi位置的字符,不保留结果,只改变标志 CF,AF,PF,SF,OF,ZF,若字符相等,ZF=1,否则ZF=0。若DS段中字符小于ES段中串,则CF=1,后面sbb运算会出现-1 |
Jne2f | //如果两个字符不相等,则转到标号 |
testb %al %al | //如果al中全是0,则ZF=1(逻辑与结果为0),如果字符串结束遇到null零 |
jne 1b | //如果ZF=0(逻辑与结果不为0)即字符串未结束,则继续比较 |
xorl %eax %eax | //自身异或,结果为0,CF=0,eax清空 |
jmp 3f | //向前跳至3:,退出,返回值为0 |
2: sbbl %eax %eax | //32位sbb src,dest;dest-src-CF,存入dest,如果CF=1,则结果为-1(全是1);否则为0。(结果为-1时标志位:CF=1,SF=1,OF=1,ZF=0,PF=1) |
orb $1 %al | //对0位或1,保证结果为-1或者1。如果结果为0,或1之后为1,即字符大,返回1,字符小,返回-1 |
3: |
|
linux一键安装web环境全攻略 在linux系统中怎么一键安装web环境方法
Linux网络基本网络配置方法介绍 如何配置Linux系统的网络方法
Linux下DNS服务器搭建详解 Linux下搭建DNS服务器和配置文件
对Linux进行详细的性能监控的方法 Linux 系统性能监控命令详解
linux系统root密码忘了怎么办 linux忘记root密码后找回密码的方法
Linux基本命令有哪些 Linux系统常用操作命令有哪些
Linux必学的网络操作命令 linux网络操作相关命令汇总
linux系统从入侵到提权的详细过程 linux入侵提权服务器方法技巧
linux系统怎么用命令切换用户登录 Linux切换用户的命令是什么
在linux中添加普通新用户登录 如何在Linux中添加一个新的用户
2012-07-10
CentOS 6.3安装(详细图解教程)
Linux怎么查看网卡驱动?Linux下查看网卡的驱动程序
centos修改主机名命令
Ubuntu或UbuntuKyKin14.04Unity桌面风格与Gnome桌面风格的切换
FEDORA 17中设置TIGERVNC远程访问
StartOS 5.0相关介绍,新型的Linux系统!
解决vSphere Client登录linux版vCenter失败
LINUX最新提权 Exploits Linux Kernel <= 2.6.37
nginx在网站中的7层转发功能