使用GCC的内联asm来学习汇编的问题在于你花了一半的时间来学习gcc的内联汇编是如何工作的,而不是实际学习汇编.例如,这是我如何编写相同的代码:

#include

int getStringLength(const char *pStr){

int len;

__asm__ (

"repne scasb

"

"not %%ecx

"

"dec %%ecx"

:"=c" (len), "+D"(pStr) /*Outputs*/

:"c"(-1), "a"(0) /*Inputs*/

/* tell the compiler we read the memory pointed to by pStr,

with a dummy input so we don't need a "memory" clobber */

, "m" (*(const struct {char a; char x[];} *) pStr)

);

return len;

}

将此与您的示例进行比较

>我没有初始化len,因为asm将它声明为输出(= c).

>没有必要复制pStr,因为它是一个局部变量.根据规范,我们已经允许更改它(虽然因为它是const我们不应该修改它指向的数据).

>没有理由告诉内联asm将Ptr放入eax,只是让你的asm将它移动到edi.我只是把edi中的值放在第一位.请注意,由于edi中的值正在发生变化,我们不能仅将其声明为“输入”(按规范,内联asm不得更改输入值).将其更改为读/写输出可解决此问题.

>没有必要让asm零eax,因为你可以有限制为你做.作为附带好处,gcc将“知道”它在eax寄存器中有0,并且(在优化版本中)它可以重用它(想想:检查2个字符串的长度).

>我也可以使用约束来初始化ecx.如上所述,不允许更改输入值.但是由于我将ecx定义为输出,gcc已经知道我正在改变它.

>由于ecx,eax和edi的内容都是明确指定的,因此不再需要破坏任何内容.

所有这些都使得(略微)更短和更有效的代码.

但这太荒谬了.怎么了(我能说’哎呀’吗?)你应该知道这一切吗?

如果目标是学习asm,那么使用inline asm并不是你最好的方法(实际上我会说在大多数情况下,inline asm是bad idea).我建议您将getStringLength声明为extern并将其完全写入asm,然后将其与您的C代码链接.

通过这种方式,您可以了解参数传递,返回值,保留寄存器(以及学习哪些寄存器必须保留以及哪些可以安全地用作划痕),堆栈帧,如何将asm与C链接等等.所有对于内联asm而言,这比gobbledygook更有用.

linux汇编字符长怎么看,linux – 在内联GNU汇编程序中获取字符串长...相关推荐

  1. linux汇编指令输出到屏幕,Linux 汇编语言(GNU GAS汇编)开发指南

    三.Hello World! 真不知道打破这个传统会带来什么样的后果,但既然所有程序设计语言的第一个例子都是在屏幕上打印一个字符串 "Hello World!",那我们也以这种方式 ...

  2. python列表中获取最长的字符串

    从列表中找出最长的字符串,有两种方式,一种用for循环比较,另一种是python的max方法. 使用的txt文件格式: 方法一. 使用for循环代码: def get_longest_name():s ...

  3. Unity中获取字符串长度、Unicode字符数量和编码ASCII,UTF,GBK的区别

    1.String.Length,String.ToCharArray,StringInfo,Encoding.UTF8.GetByteCount的区别: String.Length:获取的是字符串中C ...

  4. linux 脚本$字符,一文看懂shell脚本中$0 $1 $# $@ $* $? $$ 的各种符号意义

    概述 shell中有两类字符,一类是普通字符,在Shell中除了本身的字面意思外没有其他特殊意义,即普通纯文本:另一类即元字符,是Shell的保留字符,在Shell中有着特殊的含义. 今天主要介绍一下 ...

  5. linux系统字符设备文件类型,Linux文件类型以及颜色标识

    1.Linux文件类型介绍 Linux系统不同于window系统,两者文件类型也有很大的差异.Linux文件类型和Linux文件的文件名所代表的意义是两个不同的概念.我们通过一般应用程序而创建的比如f ...

  6. 红旗linux系统字符无法闪烁,红旗 Linux 6.0无法开机

    红旗 Linux 6.0无法开机 更新时间:2019-10-25 21:29 最满意答案 根据 Mounting root filesystem. Mount:   could not find fi ...

  7. linux系统字符设备文件类型,Linux文件类型

    Linux文件类型教程 Linux七种文件类型详解 文件属性 文件类型 - 常规文件,即 file d 目录文件 b block device 即块设备文件,如硬盘;支持以 block 为单位进行随机 ...

  8. linux系统的编码怎么看,linux查看系统编码和修改系统编码

    警告:虚拟机不要轻易修改系统默认编码,会出问题的我告诉你. 1.查看linux系统默认编码: 使用locale命令 [root@localhost ~]# locale LANG=en_US.UTF- ...

  9. linux 编译字符设备驱动错误,linux字符设备驱动框架及编写流程

    流程: init { } exit { } 申请设备号 (动态注册/静态注册) 创建一个字符设备 cdev_alloc 初始化字符设备 cdev_init 设备号和字符设备关联 cdev_add 销毁 ...

最新文章

  1. oracle本地连接地址,关于Oracle本地连接出现与监听有关的问题的解决方法探讨,oracle本地连接...
  2. 23种设计模式的基本介绍
  3. python requests 异步调用_带有Python请求的异步请求
  4. php和java之间rsa加密互通
  5. 如何快速正确的安装 Ruby, Rails 运行环境
  6. 单选按钮步骤流程向导 js_创建令人愉快的按钮的6个步骤
  7. Flutter 页面托动按钮 DraggableFloatingActionButton
  8. ffmpeg filter 实现画面旋转
  9. 力扣每日一刷--验证回文串
  10. msgpack使用 php_如何使用msgpack进行读写?
  11. 最长递增子序列 两种做法
  12. newifi3 高恪魔改_newifi 3 四大路由器固件优劣分析
  13. java后台截图_Java+Selenium实现后台截图网页,可运行在树莓派上
  14. css基础知识 -- 颜色渐变
  15. SATA,SAS,SSD 读写性能测试结果
  16. mac_m4a转mp3
  17. Java实现 LeetCode 718 最长重复子数组(动态规划)
  18. Linux卸载搜狗输入法
  19. linux环境安全配置,Linux系统安全配置方案
  20. 丁真人设崩塌?吸烟事件后,又爆深夜热聊女网红丨国仁网络

热门文章

  1. python 判断一个点(坐标)是否在一个多边形内利用射线法
  2. 从Encoder到Decoder实现Seq2Seq模型
  3. PHP逐行解析文件,并写入数据库
  4. 阿里云SLB负载均衡与使用SSL域名证书
  5. bzoj1532: [POI2005]Kos-Dicing
  6. 『.NET Core CLI工具文档』(二).NET Core 工具遥测(应用信息收集)
  7. JDK内置的进制转换
  8. 设置easyui input默认值
  9. 实现了HTTP多线程下载
  10. 2.3_ 1_ 进程同步、进程互斥