导航
  • 全部
...

C语言的汇编代码运算问题,word还是dword?

jack_wq 2009-12-17 02:51:31
变量定义如下:
short test = -96;
unsigned short testdata = 512,result = 97;

语句如下:
temp = result * testdata + test1 * testdata;

VC中的汇编执行:
0040EBB4 mov edx,dword ptr [ebp-58h]
0040EBB7 and edx,0FFFFh
0040EBBD mov eax,dword ptr [ebp-54h]
0040EBC0 and eax,0FFFFh
0040EBC5 imul edx,eax
0040EBC8 movsx ecx,word ptr [ebp-48h] //这里为什么使用word而不是dword呢?为什么其他的使用的是dword呢?
0040EBCC mov eax,dword ptr [ebp-54h]
0040EBCF and eax,0FFFFh
0040EBD4 imul ecx,eax
0040EBD7 add edx,ecx
0040EBD9 mov word ptr [ebp-5Ch],dx

记得以前有人说过,C语言在运算的时候,汇编中会使用int类型运算的,实际上,使用的应该是dword类型,但是上面的汇编代码中对于short变量使用的是word,而unsigned short变量使用的是dword,哪位大侠能给解释一下吗?
...全文
给本帖投票
349 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
2009-12-18
  • 打赏
  • 举报
回复
注意 unsigned short 和 short 都先转换成 int 再进行计算
;result * testdata,无符号数运算
;读入 DWORD 进行 and 0xFFFF 截断相当于对低 16 位作零扩展
0040EBB4 mov edx,dword ptr [ebp-58h]
0040EBB7 and edx,0FFFFh
0040EBBD mov eax,dword ptr [ebp-54h]
0040EBC0 and eax,0FFFFh
0040EBC5 imul edx,eax

;test1 * testdata,有符号运算,test1 用 movsx 作符号扩展
;testdata 由于是 unsigned short 依旧是零扩展
0040EBC8 movsx ecx,word ptr [ebp-48h]
0040EBCC mov eax,dword ptr [ebp-54h]
0040EBCF and eax,0FFFFh
0040EBD4 imul ecx,eax

0040EBD7 add edx,ecx
0040EBD9 mov word ptr [ebp-5Ch],dx
haohaokingXP 2009-12-17
  • 打赏
  • 举报
回复
1 不可能存在 movsx ecx,dword ptr [ebp-48h]
第一 因为对于dword ptr [ebp-48h]会丢失符号,
第二 movsx ecx,X, 中X支持小于等于16位的值。
2 也不能使用 mov ecx,dword ptr [ebp-48h]
因为丢失符号位
haohaokingXP 2009-12-17
  • 打赏
  • 举报
回复
而无符号数没有这个限制的~,所以使用dword ptr没有任何问题!
haohaokingXP 2009-12-17
  • 打赏
  • 举报
回复


一个负数 * 一个正数的话,肯定得负数。

所以使用movsx ecx,word ptr [ebp-48h]
保持 ecx针对word ptr [ebp-48h]进行有符号扩展。

-96 二进制补码是 11111111 10100000
如果使用mov ecx,dword ptr [ebp-48h]这样的话
那么ecx为 00000000 00000000 11111111 10100000
等于65440
实际上已经丢失符号了。
而使用
movsx ecx,word ptr [ebp-48h]的话
ecx为 11111111 11111111 11111111 10100000
还是-96
过去的我 2009-12-17
  • 打赏
  • 举报
回复
完全和编译器有关无法解释。。
这里word ptr ,配合前面的movsx

70,006

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧

手机看
关注公众号

关注公众号

客服 返回
顶部