免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: zylthinking
打印 上一主题 下一主题

[其他] 什么叫非显式的整型立即数 [复制链接]

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
31 [报告]
发表于 2012-10-15 16:47 |只看该作者
sonicling 发表于 2012-10-15 16:39
回复 27# zylthinking


int g = 0;

int main (int argc, const char * argv[])
{

    int result = 10;
    register int n = 23;
LABEL:
    __asm__ (
             ""
             :
             :"s"(&g)  // 不行
             );
   
    __asm__ (
             "movl %1, %0\n"
             :"=r"(result)
             :"s"(g) // 也不行
             );
   
    printf("%d\n", result);

    return 0;
}


都不行啊, 我打算让第一个来创建 label, 第二个使用; 但无论单独创建, 还是直接使用, 或者第一个创建, 第二个使用, 都不行。
干脆你写个能通过的例子代码可否?

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
32 [报告]
发表于 2012-10-15 16:48 |只看该作者
zhaohongjian000 发表于 2012-10-15 16:35
我的理解是s是不能单独用的,你加上r,变成rs试试。
也不行                 

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
33 [报告]
发表于 2012-10-15 16:49 |只看该作者
sonicling 发表于 2012-10-15 16:39
回复 27# zylthinking


__asm__ (
        "0:"
        "movl %1, %0\n"
        :"=r"(result)
        :"s"(0b)
    );

这个 0 总该是 asm 的 label 了吧, 也不行

论坛徽章:
0
34 [报告]
发表于 2012-10-15 16:52 |只看该作者
回复 33# zylthinking


    你不可能在这里使用asm的label,因为括号里面必须是C语言的名字,asm的东西必须放在字符串里面。

论坛徽章:
0
35 [报告]
发表于 2012-10-15 16:55 |只看该作者
回复 31# zylthinking


    我不是已经举例子了吗

"s"("string")

"s"(&global)

注意要对全局变量取地址啊

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
36 [报告]
发表于 2012-10-15 16:57 |只看该作者
sonicling 发表于 2012-10-15 16:55
回复 31# zylthinking
  1. int g = 0;

  2. int main (int argc, const char * argv[])
  3. {

  4.     int result = 10;
  5.     register int n = 23;
  6. LABEL:
  7.    
  8.     __asm__ (
  9.              "0: movl %1, %0\n"
  10.              :"=r"(result)
  11.              :"s"(&g)
  12.              );
  13.    
  14.     printf("%d\n", result);

  15.     return 0;
  16. }
复制代码
这个 g 就是全局变量啊, 还是不行啊

论坛徽章:
0
37 [报告]
发表于 2012-10-15 17:00 |只看该作者
你用gcc试试

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
38 [报告]
发表于 2012-10-15 17:03 |只看该作者
sonicling 发表于 2012-10-15 17:00
你用gcc试试


试出来了, 64位不行, -m32 可以;
这玩意优点是什么来着, 应该不是防止指令长度不够吧, example 中的Ks至今觉得云里雾里

论坛徽章:
0
39 [报告]
发表于 2012-10-15 17:15 |只看该作者
回复 38# zylthinking


    优点是可以符号连接了,不必指定值。

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
40 [报告]
发表于 2012-10-15 17:41 |只看该作者
  1
  2 #include <stdio.h>
  3
  4
  5 int main(int argc, char** argv){
  6     int result = 10;
  7     const int n = 0;
  8     
  9     __asm__ (
10             "0:"
11             "movl %1, %0\n"
12             :"=r"(result)
13             :"s"("0b")
14     );
15     
16     printf("%s\n", (char *) result);
17     return 0;
18 }   

倒是可以运行, 虽然几乎是毫无意义的。
现在返回去琢磨文档上的那个 Ks 的例子, 似乎是文档说错了?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP