2

我最近开始学习 masm 汇编,我一直在反汇编我的许多程序只是为了看看。我注意到,当您使用 __int16 (字)时,它的值首先复制到 eax 然后复制到变量本身,但是使用 int (dword/32) 它直接复制到变量中:这是两者的反汇编代码

int y = 5;
0040101E  mov         dword ptr [y],5 

    y += 7;
00401025  mov         eax,dword ptr [y] 
00401028  add         eax,7 
0040102B  mov         dword ptr [y],eax 

    __int16 x = 3;
0040102E  mov         eax,3 
00401033  mov         word ptr [x],ax 

    x += 6;
00401037  movsx       eax,word ptr [x] 
0040103B  add         eax,6 
0040103E  mov         word ptr [x],ax 

我注意到 __int16 的大小为 16 ......这是 eax 大小的一半,这就是为什么它先放入 eax 然后才将 ax 放入 x 的原因吗?

另外,哪个最快?

有什么好的masm网站可以推荐吗?

感谢您的输入

4

3 回答 3

1

与您的 cpu 架构相匹配的字长总是最快的。对于每个操作,其他任何内容都被迫来回转换。

TLDR:除非您有非常具体的原因,否则请使用int.

于 2010-11-20T17:51:15.670 回答
1

如果指令是 ,则确实会给出相同的结果mov ax,3,但编译器可能会选择mov eax,3,因为机器代码更短,在这种特殊情况下效果是相同的。mov ax,3会有一个额外的前缀字节告诉 CPU 这是一个 16 位操作。(两条指令的编码在其他方面是相同的。)

如果您使用的是 Visual C++,您可以在反汇编窗口中打开机器代码字节的显示,并查看每条指令的大小。

在某一时刻,16 位指令(或更准确地说,使用当前 CPU 模式中的“其他”字长的指令)效率较低;这可能会或可能不再是这种情况,我不确定。(我的猜测是,这种效果通常很难被发现,你必须设计一些代码片段让它变得明显。)

于 2010-11-20T18:17:04.620 回答
0

我正在编造这个,因为我不知道。

但似乎在现代处理器上,使用 eax 比使用更小的 ax 寄存器更有效。

通过首先移入 eax(在第一个分配中),CPU 会将常量符号扩展至 32 位寄存器。

编译器在 32 位(使用寄存器)中完成所有数学运算并透明地为您提供剩余部分(即 ax)的可能性也很好。

这就是我的样子。

于 2010-11-20T17:54:57.570 回答