Assembly 如何在汇编程序中测试变量的相等性?

Assembly 如何在汇编程序中测试变量的相等性?,assembly,nasm,Assembly,Nasm,我在测试变量的相等性方面有问题。在这种情况下,它起作用了,它跳过了这个“做点什么”,它按照我想要的方式转到下一步: b dw 5 mov eax, [b] cmp eax, 5 je next ;do something next: 但是,如果我将例6设置为例6而不是例5,则不会跳过“做某事”: (使用NASM)变量的大小相对于使用它的方式是错误的: b dw 6 mov eax, [b] cmp eax, 6 当您使用dw时,您声明了一个字大小的变量,在x86上为16位。eax

我在测试变量的相等性方面有问题。在这种情况下,它起作用了,它跳过了这个“做点什么”,它按照我想要的方式转到下一步:

b dw 5

mov eax, [b]
 cmp eax, 5
 je next
 ;do something
 next:
但是,如果我将例6设置为例6而不是例5,则不会跳过“做某事”:


(使用NASM)

变量的大小相对于使用它的方式是错误的:

b dw 6

mov eax, [b]
cmp eax, 6
当您使用
dw
时,您声明了一个字大小的变量,在x86上为16位。
eax
寄存器是32位(一个双字),因此使用
mov eax,[b]
您将在
b
处加载该字,并在内存中直接在
b
之后加载该字,不管它可能包含什么


b
的声明更改为
b dd 6
,或使用零扩展
mov
movzx eax,word[b]
)。

变量的大小相对于使用它的方式是错误的:

b dw 6

mov eax, [b]
cmp eax, 6
当您使用
dw
时,您声明了一个字大小的变量,在x86上为16位。
eax
寄存器是32位(一个双字),因此使用
mov eax,[b]
您将在
b
处加载该字,并在内存中直接在
b
之后加载该字,不管它可能包含什么


b
的声明更改为
b dd 6
,或使用零扩展
mov
movzx eax,word[b]
)。

变量的大小相对于使用它的方式是错误的:

b dw 6

mov eax, [b]
cmp eax, 6
当您使用
dw
时,您声明了一个字大小的变量,在x86上为16位。
eax
寄存器是32位(一个双字),因此使用
mov eax,[b]
您将在
b
处加载该字,并在内存中直接在
b
之后加载该字,不管它可能包含什么


b
的声明更改为
b dd 6
,或使用零扩展
mov
movzx eax,word[b]
)。

变量的大小相对于使用它的方式是错误的:

b dw 6

mov eax, [b]
cmp eax, 6
当您使用
dw
时,您声明了一个字大小的变量,在x86上为16位。
eax
寄存器是32位(一个双字),因此使用
mov eax,[b]
您将在
b
处加载该字,并在内存中直接在
b
之后加载该字,不管它可能包含什么


要么将
b
的声明更改为
b dd 6
,要么使用零扩展
mov
movzx eax,word[b]
)。

我发现了错误。我刚跳过“
bd6
”它就工作了

我发现了错误。我刚跳过“
bd6
”它就工作了

我发现了错误。我刚跳过“
bd6
”它就工作了

我发现了错误。我只要跳过“
bd6
”它就可以工作了

这个?
b dd 6 mov ax,[b]cmp ax,6 je next;接下来做些什么:
它不会再次跳过“做点什么”我没有意识到在变量声明和
mov
之间确实没有任何东西。代码路径中不应包含数据。关于您的评论:如果您将
b
加载到
ax
而不是
eax
中,您可以继续使用
dw
作为
b
,因为
ax
是16位的(假设您在代码的其他地方没有对
b
的任何32位访问)。这是什么?
b dd 6 mov ax,[b]cmp ax,6 je next;接下来做些什么:
它不会再次跳过“做点什么”我没有意识到在变量声明和
mov
之间确实没有任何东西。代码路径中不应包含数据。关于您的评论:如果您将
b
加载到
ax
而不是
eax
中,您可以继续使用
dw
作为
b
,因为
ax
是16位的(假设您在代码的其他地方没有对
b
的任何32位访问)。这是什么?
b dd 6 mov ax,[b]cmp ax,6 je next;接下来做些什么:
它不会再次跳过“做点什么”我没有意识到在变量声明和
mov
之间确实没有任何东西。代码路径中不应包含数据。关于您的评论:如果您将
b
加载到
ax
而不是
eax
中,您可以继续使用
dw
作为
b
,因为
ax
是16位的(假设您在代码的其他地方没有对
b
的任何32位访问)。这是什么?
b dd 6 mov ax,[b]cmp ax,6 je next;接下来做些什么:
它不会再次跳过“做点什么”我没有意识到在变量声明和
mov
之间确实没有任何东西。代码路径中不应包含数据。关于您的评论:如果您将
b
加载到
ax
而不是
eax
中,您可以继续为
b
使用
dw
,因为
ax
是16位的(假设您在代码的其他地方没有对
b
的任何32位访问)。