[原创]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*/);



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大熊猫侯佩

赏点钱让我买杯可乐好吗 ;)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值