让我们假设变量a
放在地址0xDEADBEEF
中,其值为42
。
如何比较a
(42
)与另一个int的值?
目前我有(英特尔语法):
mov rax, 0xDEADBEEF;
mov rdi, 1;
cmp [rax], rdi;
这是对的吗?
答案 0 :(得分:1)
Little endian处理器(与大多数现代桌面处理器一样)向后排列内存中的值。例如,如果0xDEADBEEF处的值为42
,即0x0000002A
,则它将存储为
2A 00 00 00
您可以通过增加byte / word / double来强制cmp [rax], rdi;
命令比较多少字节。例如在nasm
cmp BYTE [rax], rdi;
只会比较指针rax
指向的第一个字节。
检查汇编程序的文档以获取准确的语法。还要检查汇编程序默认与cmp
命令比较的字节数。
修改强> 无视我上面写的所有内容。
由于您的问题被标记为x86-64
,我认为您的程序是64位。
rdi
长度为8个字节。如果0xDEADBEEF
的值也长达8个字节,那么您的代码可以正常运行:
2A 00 00 00 00 00 00 00
否则,如果只将前4个或2个或字节设置为正确值,则您的程序可能正常工作,也可能无法正常工作。例如,如果0xDEADBEEF
的值为4个字节长,那么它将如下所示
2A 00 00 00 ?? ?? ?? ??
其余的记忆将包含一些其他随机信息。你的程序将有最糟糕的错误 - 随机发生的错误。 cmp指令仍将比较8个字节,因为rdi
长度为8个字节。
回答你对Gunner的问题的评论(因为我没有权利发表评论):
mov rax, [0xDEADBEEF]
cmp rax, 1
与
相同mov rax, 0xDEADBEEF
cmp [rax], 1
答案 1 :(得分:0)
哪个汇编程序?对于天然气,假设.intel_syntax noprefix
:
cmp QWORD PTR ds:0xdeadbeef, 1
请注意,0xdeadbeef
将进行符号扩展。您可能更愿意明确并包含ff
以明确说明。
通常您不需要指定ds:
因为您将引用标签而汇编程序将处理事情。那就是:
cmp DWORD PTR [foo], 1
cmp DWORD PTR foo, 1 # same thing
答案 2 :(得分:-1)
您mov
0xDEADBEEF
rax
rax
,而 > A 地址lea rax, [SomeAddress]
不确定你的汇编程序,但是在NASM中:
mov rax, [SomeAddress]
或者:
{{1}}