[原创]gcc内联汇编语法的一个缺陷

首先要说的是,这个所谓的"缺陷"可能早已有官方的处理办法,可能我还不知
道罢了-_-b,如果哪位知道请告知,感谢!

gcc的at&t 中关于间接寻址的语法和intel语法有些不同,比如:

intel:        mov [offset str + ebx * 4 + 20],011223344h

at&t:         movl $0x11223344,20[str,ebx,4]

注意在这里at&t语法有个例外,即一般的在at&t中立即数前要加字符$,比如上面
的$0x11223344,但在disp和scale中的立即数中一定不能加$!

就是条给了gcc中的嵌入汇编带来点小麻烦。对于(i)(4)类型的输入形变量,会
在生成的asm中加上一个$,即变成$4。这在一般的情形是对的,但在上面
谈到的情况下就会导致错误。

还是采用变通的方法吧:

    char str[BUFSIZE]={0};
    int index=100,scale=4;
   
    //sim movl $0x11223344,disp(base,index,scale)
    __asm__ __volatile__("addl %0,%1;"
                        "addl %2,%1;"
                        "movl $0x11223344,(%1)"
                        ::"i"(11)/*disp*/,"D"(str)/*base*/,"b"(index*scale)/
                        /*sim index,scale*/);

时间: 2024-10-26 08:53:23

[原创]gcc内联汇编语法的一个缺陷的相关文章

最牛X的 GCC 内联汇编

正如大家知道的,在C语言中插入汇编语言,其是Linux中使用的基本汇编程序语法.本文将讲解 GCC 提供的内联汇编特性的用途和用法.对于阅读这篇文章,这里只有两个前提要求,很明显,就是 x86 汇编语言和 C 语言的基本认识. 1. 简介 1.1 版权许可 Copyright (C) 2003 Sandeep S. 本文档自由共享;你可以重新发布它,并且/或者在遵循自由软件基金会发布的 GNU 通用公共许可证下修改它;也可以是该许可证的版本 2 或者(按照你的需求)更晚的版本. 发布这篇文档是希

GCC 内联汇编 HOWTO

v0.1, 01 March 2003. 本 HOWTO 文档将讲解 GCC 提供的内联汇编特性的用途和用法.对于阅读这篇文章,这里只有两个前提要求,很明显,就是 x86 汇编语言和 C 语言的基本认识. 1. 简介 1.1 版权许可 Copyright (C) 2003 Sandeep S. 本文档自由共享:你可以重新发布它,并且/或者在遵循自由软件基金会发布的 GNU 通用公共许可证下修改它:也可以是该许可证的版本 2 或者(按照你的需求)更晚的版本. 发布这篇文档是希望它能够帮助别人,但是

GCC的内嵌汇编语法

1 Overview 开发一个OS,尽管绝大部分代码只需要用C/C++等高级语言就可以了,但至少和硬件相关部分的代码需要使用汇编语言,另外,由于启动部分的代码有大小限制,使用精练的汇编可以缩小目标代码的Size.另外,对于某些需要被经常调用的代码,使用汇编来写可以提高性能.所以我们必须了解汇编语言,即使你有可能并不喜欢它.     如果我们选择的OS开发工具是GCC以及GAS的话,就必须了解AT&T汇编语言语法,因为GCC/GAS只支持这种汇编语法.  本文只讨论AT&T的汇编语法,以及G

通过两个场景向初学者介绍内联汇编的基本用法和基本语法

对于 C++/C++ 程序员来说,内联汇编并不是一个新特性,它可以帮助我们充分利用计算能力.然而,大多数程序员很少有机会实际使用该特性.事实上,内联汇编只为特定的要求提供服务,在涉及先进的高层编程语言时尤其如此. 本文介绍了 IBM Power 处理器架构的两个场景.使用本文提供的示例,我们可以发现在什么地方应用了内联汇编. 场景 1:更好的库 C/C++ 编程语言支持逻辑运算.在本例中,http://www.aliyun.com/zixun/aggregation/6579.html">

asm-内联汇编语法问题 输出操作数

问题描述 内联汇编语法问题 输出操作数 编译器用的是devc++,编译时报错[Error] invalid 'asm': operand number out of range. 出错语句为:asm ("movl %1, %%eax"::"r"(no):"%eax"); 如果加上一个输出操作数就能通过编译,这是为什么?对于不需要输出操作数的语句应该怎么处理? 解决方案 http://bbs.csdn.net/topics/390752749

内联汇编基础知识

几天看了孙原等几位仁兄关于汇编语言的几篇文章,颇感兴趣.于是查了查98版的MSDN中,其中也有几篇关于内联汇编的基础,索引字是asm.讲得不算太难,于是试着将其内容写下来了,特此贴来. 一.内联汇编简述 Visual C++ 6.0编译器下,内联汇编可以使用所有的Intel486处理器指令集.而且可以对目标处理器建立起伪指令来实现附加指令功能.内联汇编可以使用MASM编译器所允许的表达式,其中的一些表达式可以通过操作符和操作数的组合,对单精值进行运算. 虽然内联汇编可以访问C\C++中的数据变量

vc++-VC++内联汇编 变量未初始化问题

问题描述 VC++内联汇编 变量未初始化问题 char input; int input1=input; 我是这么写的..然后出现了代码未初始化的问题..input是需要输入的值.input1是输入的值中的整数.这么运行的话我之后的输出会是任意一个负的整数..求教 解决方案 没太搞明白你说的问题.你是想把input里的数字字符变成整数赋给input1吗? 如果是,可以这样: input1=input-'0'; 解决方案二: 一个字符型的值赋值给整型能对么- 解决方案三: push input1;

在Visual C++中使用内联汇编

一.内联汇编的优缺点 因为在Visual C++中使用内联汇编不需要额外的编译器和联接器,且可以处理Visual C++中不能处理的一些事情,而且可以使用在C/C++中的变量,所以非常方便.内联汇编主要用于如下场合: 1.使用汇编语言写函数: 2.对速度要求非常高的代码: 3.设备驱动程序中直接访问硬件: 4."Naked" Call的初始化和结束代码. //(."Naked",理解了意思,但是不知道怎么翻译,大概就是不需要C/C++的编译器(自作聪明)生成的函数初

关于内联汇编的几个技巧

有时我们的程序需要一些很高的执行效率或者执行系统底层的功能模块,这些关键的部分我们可以采用内联汇编直接插入汇编指令来达到我们的要求,以下是几个技巧与大家共同探讨. 1.内联汇编嵌入VC语句: 在VC中内联汇编非常方便,只需要按照如下格式 __asm{ //汇编语句 } 请看如下示例代码 void CAlcmemDlg::OnButton3() { DWORD d=(m_size*1024*1024)/sizeof(DWORD); DWORD*p=(DWORD*)m_p; DWORD s; m_p