0和dword 0之间的区别是什么?

时间:2015-12-17 02:23:38

标签: assembly nasm

正如问题所述, (例如)mov eax, 0mov eax, dword 0之间的区别是什么?

我一直在使用cmp语句,但我无法发现差异。 一个是地址,另一个是数值吗?

3 个答案:

答案 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; } } 通常是首选,因为它生成一个小得多的双字节指令。