| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 528 人关注过本帖
标题:求汇骗高手解释个问题,
只看楼主 加入收藏
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
结帖率:94.72%
收藏
已结贴  问题点数:20 回复次数:5 
求汇骗高手解释个问题,
int a = (short)88888.88;

1:    #include <stdio.h>
2:
3:    int main(void)
4:    {
00401010   push        ebp
00401011   mov         ebp,esp
00401013   sub         esp,44h
00401016   push        ebx
00401017   push        esi
00401018   push        edi
00401019   lea         edi,[ebp-44h]
0040101C   mov         ecx,11h
00401021   mov         eax,0CCCCCCCCh
00401026   rep stos    dword ptr [edi]
5:        int a = (short)88888.88;
00401028   mov         dword ptr [ebp-4],5B38h
6:        return 0;
0040102F   xor         eax,eax
7:    }

为什么我用 Vc6.0反汇编出来的信息对我毛用都没? 我想知道的是 88888.88 存储在哪里, 占用了多少个字节?
怎么赋值给a的?


[ 本帖最后由 BlueGuy 于 2010-10-16 22:04 编辑 ]
搜索更多相关主题的帖子: 解释 
2010-10-16 21:46
WDMfans
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:86
专家分:168
注 册:2010-9-19
收藏
得分:6 
眼花。呵呵难免
ebp-4
4b


88888 mod 65536 = 0x5b38

[ 本帖最后由 WDMfans 于 2010-10-16 22:58 编辑 ]
2010-10-16 22:55
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:6 
编译是时候就可以确定 88888.88 转成 short 的结果。所以它生成汇编语言之前就以经化简了。
2010-10-17 01:03
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
回复 3楼 pangding
哦这样子的啊, 我前几天反转字节序的时候遇到一个类似的问题,
short s = ?;
int t;
t = (s <<8) | (s >> 8);
当时很奇怪, 为什么没有截断?

后来改为
int low, high;
low = s & 0xFF;
high = s >> 8;
t = low << 8 + high;
就运行正常了,

再后来我又改为
short s = ?;
short t;
t = (s <<8) | (s >> 8);
运行也正常,  我就开始想当然了: 整数应该是先存储在 32位的内存中, 然后再根据需要 截断,
我对浮点数运算也不熟悉,,就顺便问了这个问题了。

还有啊, 当时写成 s = low << 8 + high 直接崩溃, 因为 s 是一个字符串常量, 哈哈。

我就是真命天子,顺我者生,逆我者死!
2010-10-17 11:58
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
呵呵,intel 提供了一个 bswap 指令用于翻转寄存器的字节序。这个指令可以方便的用于 little-endian 和 big-endian 之间转化的。
但是不能用于反转 16 位的东西。要想反转 16 位的数据,直接用 xchg 就行。

浮点数的话,在内存里没什么特别的。但是读取它或做运算,要用到另外一套寄存器,一共八个,st(0)-st(7)。读取、运算用的指令也不一样。
2010-10-17 22:44
cacker
该用户已被删除
收藏
得分:6 
提示: 作者被禁止或删除 内容自动屏蔽
2010-10-17 23:10
快速回复:求汇骗高手解释个问题,
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024536 second(s), 7 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved