关于Linux ATT Asm的零星小结

2024-03-22 16:48
文章标签 linux 小结 att 零星 asm

本文主要是介绍关于Linux ATT Asm的零星小结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文作者:sodme
本文出处: http://blog.csdn.net/sodme
声明:本文可以不经作者同意任意转载、复制、传播,但任何对本文的引用均须保留本文的作者、出处及本行声明信息!谢谢!

前段时间作性能优化时, 研究过一段时间的linux AT&T asm, 一点体会写出来与大家共享.

我们知道linux的asm采用的是AT&T汇编语法, 关于它的详细文档在以下的地址可以获得:
http://asm.sourceforge.net/articles/linasm.html

看文档虽然是比较规矩的作法, 但对于诸如我等对未知世界好奇心过盛而又心急易上火的人类而言, 看代码要远来得轻松和契意:

#include
int main(void)
{
    int result, input;
    input = 2;
    result = 3;
    __asm__
    (

    "movl %1, %0/n"
    "subl $1, %1/n"
    "movl %1, %0"
   
    : "=r"(result)
    : "m"(input)
    );
   
    std::cout << "result=" << result << std::endl;
    return 0;
}

形如以上形式, 加两个":", 是很多AT&T asm教程里都会说到的方法, 其作用在于规定输入输出参数, 而在汇编里会以%1和0%之类的来代替这些参数, 这样就实现了参数传递和计算结果的返回. 但是, 我一向比较少采用这种作法.

个人认为, 对于性能优化而言, gcc -O3选项所作的确实已经非常牛X了, 但对于不便采用-O3优化处理的, 手动优化还是有必要的. 而在手动优化这方面, 一般都会比较关注如何在C或C++里嵌入汇编, 直接使用汇编语言的方法写算法我觉得没必要而且编码时间较长也复杂. 所以, 一般我会这么干: 先用高级语言写出函数原型, 对于已有算法, 我会先gcc -S编译生成汇编代码, 然后在这个代码的基础之上再作优化. 这样作的另一个好处是, 对于参数和局部变量的地址引用可以通过分析编译后的汇编代码而轻易获得, 这样也方便我们在自己的汇编算法里来引用它们. 当然, 另外遇到的一种问题是, 可能有时我们会直接写汇编, 比如进行一些简单且快速运算之类的.

我所使用的内嵌汇编形式, 一般会直接这么写:

int func( int a, int b)
{
    ...
   
    __asm__
    (
       ...

        "movl $1, %eax/n"

       ...
    );

    ...
}

想把哪段代码进行优化, 就直接将那段代码用__asm__()的方式括起来, 但不用加":"的方式规定输入输出参数, 因为我觉得%1和%0这样的方式更象是机器所看的东西, 而不是人类应该看的, 人类最起码也要看个"以字母开头的, 字母和数字的集合"这样定义出来的东西. 我一般会使用经过对ebp修正的地址来间接寻址访问变量, 也就是一般情况下, 函数变量访问的最普通方式[ebp + xx].

为了有一个更加感性的认识, 下面再贴段AT&T asm代码:

.LFB1411:
    pushl    %ebp
.LCFI0:
    movl    %esp, %ebp
.LCFI1:
    subl    $4, %esp
.LCFI2:
    movl    %eax, -4(%ebp)
    movl    -4(%ebp), %eax
    movl    (%eax), %eax
    movl    %eax, %edx
    shrl    $31, %edx
    movl    -4(%ebp), %eax
    movl    (%eax), %eax
    shrl    $6, %eax
    xorl    %eax, %edx
    movl    -4(%ebp), %eax
    movl    (%eax), %eax
    shrl    $4, %eax
    xorl    %eax, %edx
    movl    -4(%ebp), %eax
    movl    (%eax), %eax
    shrl    $2, %eax
    xorl    %eax, %edx
    movl    -4(%ebp), %eax
    movl    (%eax), %eax
    shrl    %eax
    xorl    %eax, %edx
    movl    -4(%ebp), %eax
    movl    (%eax), %eax
    xorl    %edx, %eax
    andl    $1, %eax
    movl    %eax, %edx
    sall    $31, %edx
    movl    -4(%ebp), %eax
    movl    (%eax), %eax
    shrl    %eax
    orl    %eax, %edx
    movl    -4(%ebp), %eax
    movl    %edx, (%eax)
    leave
    ret

由这段代码来看AT&T asm与intel asm的不同点可能印象更深刻一些:
1.源操作数与目的操作数,在两种语法下截然相反, AT&T asm中, 左边的是源, 右边的是目的;
2.几乎所有的数据操作指令都会有intel asm指令字后加个l, 表示的是long;
3.立即数用$开头;
4.寄存器是以%开头;
5.间接寻址符号是"()", 而不是intel asm的"[]";

从形式上来看, 似乎两种语法的不同之处也就这么多. 但实际的应用中, 可能还存在很多的不一样, 比如:

intel asm下的:
mov ebx, dword ptr [LABLE_TEST]

到了AT&T asm下可能就不得不换成:

lea LABLE_TEST, %ebx
movl (%ebx), %ebx

(未完待续, 想起来再加)


这篇关于关于Linux ATT Asm的零星小结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/835722

相关文章

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

Linux中SSH服务配置的全面指南

《Linux中SSH服务配置的全面指南》作为网络安全工程师,SSH(SecureShell)服务的安全配置是我们日常工作中不可忽视的重要环节,本文将从基础配置到高级安全加固,全面解析SSH服务的各项参... 目录概述基础配置详解端口与监听设置主机密钥配置认证机制强化禁用密码认证禁止root直接登录实现双因素

在Linux终端中统计非二进制文件行数的实现方法

《在Linux终端中统计非二进制文件行数的实现方法》在Linux系统中,有时需要统计非二进制文件(如CSV、TXT文件)的行数,而不希望手动打开文件进行查看,例如,在处理大型日志文件、数据文件时,了解... 目录在linux终端中统计非二进制文件的行数技术背景实现步骤1. 使用wc命令2. 使用grep命令

Linux如何快速检查服务器的硬件配置和性能指标

《Linux如何快速检查服务器的硬件配置和性能指标》在运维和开发工作中,我们经常需要快速检查Linux服务器的硬件配置和性能指标,本文将以CentOS为例,介绍如何通过命令行快速获取这些关键信息,... 目录引言一、查询CPU核心数编程(几C?)1. 使用 nproc(最简单)2. 使用 lscpu(详细信

linux重启命令有哪些? 7个实用的Linux系统重启命令汇总

《linux重启命令有哪些?7个实用的Linux系统重启命令汇总》Linux系统提供了多种重启命令,常用的包括shutdown-r、reboot、init6等,不同命令适用于不同场景,本文将详细... 在管理和维护 linux 服务器时,完成系统更新、故障排查或日常维护后,重启系统往往是必不可少的步骤。本文

Redis分片集群、数据读写规则问题小结

《Redis分片集群、数据读写规则问题小结》本文介绍了Redis分片集群的原理,通过数据分片和哈希槽机制解决单机内存限制与写瓶颈问题,实现分布式存储和高并发处理,但存在通信开销大、维护复杂及对事务支持... 目录一、分片集群解android决的问题二、分片集群图解 分片集群特征如何解决的上述问题?(与哨兵模

SpringBoot中使用Flux实现流式返回的方法小结

《SpringBoot中使用Flux实现流式返回的方法小结》文章介绍流式返回(StreamingResponse)在SpringBoot中通过Flux实现,优势包括提升用户体验、降低内存消耗、支持长连... 目录背景流式返回的核心概念与优势1. 提升用户体验2. 降低内存消耗3. 支持长连接与实时通信在Sp

基于Linux的ffmpeg python的关键帧抽取

《基于Linux的ffmpegpython的关键帧抽取》本文主要介绍了基于Linux的ffmpegpython的关键帧抽取,实现以按帧或时间间隔抽取关键帧,文中通过示例代码介绍的非常详细,对大家的学... 目录1.FFmpeg的环境配置1) 创建一个虚拟环境envjavascript2) ffmpeg-py

Python打印对象所有属性和值的方法小结

《Python打印对象所有属性和值的方法小结》在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值,然而,Python并没有像PHP的print_r那样直接提... 目录python中打印对象所有属性和值的方法实现步骤1. 使用vars()和pprint()2. 使

HTML5 getUserMedia API网页录音实现指南示例小结

《HTML5getUserMediaAPI网页录音实现指南示例小结》本教程将指导你如何利用这一API,结合WebAudioAPI,实现网页录音功能,从获取音频流到处理和保存录音,整个过程将逐步... 目录1. html5 getUserMedia API简介1.1 API概念与历史1.2 功能与优势1.3