免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2898 | 回复: 2
打印 上一主题 下一主题

寄存器溢出--如何控制寄存器的大小? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-03-07 11:48 |只看该作者 |倒序浏览
本帖最后由 dxcheng 于 2016-03-07 13:12 编辑

运行如下demo,本来以为会出现寄存器溢出的问题,不过实际结果却不是,还请大牛们多多指教,谢谢!

// test.c
int main()
{
    short c = 327;
    short a = c * 2;
    char r = (c + 1) * 100 / (a + 1); // (c+1)*100 本来以为这里的寄存器会产生溢出,事实上没有溢出
    printf("sizeof(short):%d, sizeof(char):%d, sizeof(int):%d\n",
        sizeof(short), sizeof(char), sizeof(int));
    printf("r:%d\n", r);
    return 0;
}

运行结果:
$gcc --version
gcc (GCC) 4.4.6 20120305 (Red Hat 4.4.6-4)
$gcc test.c -o test -g
$./test   
sizeof(short):2, sizeof(char):1, sizeof(int):4
r:50

反汇编的结果:
int main()
{
80483f4:       55                      push   %ebp
80483f5:       89 e5                   mov    %esp,%ebp
80483f7:       83 e4 f0                and    $0xfffffff0,%esp
80483fa:       83 ec 30                sub    $0x30,%esp
    short c = 327;
80483fd:       66 c7 44 24 2a 47 01    movw   $0x147,0x2a(%esp)
    short a = c * 2;
8048404:       0f b7 44 24 2a          movzwl 0x2a(%esp),%eax
8048409:       01 c0                   add    %eax,%eax
804840b:       66 89 44 24 2c          mov    %ax,0x2c(%esp)
    char r = (c + 1) * 100 / (a + 1);
8048410:       0f bf 44 24 2a          movswl 0x2a(%esp),%eax
8048415:       83 c0 01                add    $0x1,%eax
8048418:       6b c0 64                imul   $0x64,%eax,%eax
804841b:       0f bf 54 24 2c          movswl 0x2c(%esp),%edx
8048420:       83 c2 01                add    $0x1,%edx
8048423:       89 54 24 1c             mov    %edx,0x1c(%esp)
8048427:       89 c2                   mov    %eax,%edx
8048429:       c1 fa 1f                sar    $0x1f,%edx
804842c:       f7 7c 24 1c             idivl  0x1c(%esp)
8048430:       88 44 24 2f             mov    %al,0x2f(%esp)

我的疑问:
short类型的c变量,为什么在运算(c+1)*100中使用%eax寄存器,而不使用%ax寄存器?
有什么方法可以控制使用寄存器的类型吗?例如编译选项之类的。

谢谢!

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
2 [报告]
发表于 2016-03-24 13:46 |只看该作者
这属于C语言标准里的东西

论坛徽章:
2
2017金鸡报晓
日期:2017-01-10 15:19:562017金鸡报晓
日期:2017-02-08 10:39:42
3 [报告]
发表于 2016-04-05 08:12 |只看该作者
这个可能要看编绎器了吧,可能换过一种编绎器的会出现问题呢!一般编程都不会犯这种错误吧,呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP