2010-11-20 74 views
2

我最近开始学习masm程序集,我一直在拆解我的许多程序,只是为了看看。我注意到,当你使用__int16(word)时,它的值首先被复制到eax中,然后到达变量本身,但是使用int(dword/32)它被直接复制到变量中:继承了为什么__int16和int(32)用C++生成不同的asm?

的拆开代码
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网站你会推荐?

感谢您的输入

+0

哪个编译器?什么优化级别? – 2010-11-20 17:55:42

回答

1

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

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

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

1

与您的cpu架构匹配的字号总是最快的。任何其他事情都被迫在每个操作中来回转换。

TLDR:除非您有一个非常具体的原因,请使用int

0

我在做这件事,因为我没有特别的了解。

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

通过先移入eax(在第一个赋值中),CPU将符号扩展到32位寄存器。

编译器在32位(与寄存器一起工作)中完成所有数学运算,并透明地给你遗体(即ax),这也是很好的选择。

这就是它对我来说的样子。

+2

从技术上讲,“现代”处理器可以在64位模式下工作,并使用'rax'而不是'eax'。 – Blindy 2010-11-20 17:56:35

相关问题