正如问题所述,
(例如)mov eax, 0
和mov eax, dword 0
之间的区别是什么?
我一直在使用cmp语句,但我无法发现差异。 一个是地址,另一个是数值吗?
答案 0 :(得分:4)
如上所述,MOV指令没有区别。对于CMP,你会有区别
qword的CMP存储器地址,即时32位
与
不同qword的CMP存储器地址,即时8位
因为比较将在符号扩展后进行,因此,使用较小的立即数,特别是当它为负数时,建议谨慎。
玩得开心......
答案 1 :(得分:2)
它与寄存器没有区别,因为寄存器的名称已经告诉汇编程序"有多大"数据项(在本例中为0
)为:
mov eax, dword 0 ; move a 4-byte 0 into eax
mov eax, 0 ; move a 0 into eax (eax is 4 bytes, so move 4 bytes)
但是,在某些情况下,您可能希望能够指定值的大小,因为可以选择。在x86 32位汇编中,以下内容将在堆栈上推送一个4字节0
值:
push 0 ; push 4-byte 0 onto the stack
如果你想推送一个2字节的0
值,你可以使用:
push word 0
如果你想要明确,那么对于4字节的立即推送很清楚,你可以使用dword
:
push dword 0
如果要将立即值移动到内存中,则必须使用大小说明符,因为汇编程序不知道数据项的大小。例如,请考虑nasm
程序集中的以下代码:
section .bss
num resb 4
...
section .text
...
mov [num], 0
这会产生错误:
error: operation size not specified
所以你需要指定大小,比方说,4字节:
mov [num], dword 0
答案 2 :(得分:1)
它们完全相同,它只是汇编语法。
作为旁注,public partial class MainWindow : Window, Interfaces.IMainWindow
{
public MainWindow()
{
InitializeComponent();
}
public MainWindow(Interfaces.IMainWindowViewModel context)
{
InitializeComponent();
this.DataContext = context;
}
}
通常是首选,因为它生成一个小得多的双字节指令。