让我们假设变量a
被放置在地址0xDEADBEEF
中,它的值是42
。 如何比较a
(42
)与另一个int的值?比较指针指向的值
目前,我有(Intel语法):
mov rax, 0xDEADBEEF;
mov rdi, 1;
cmp [rax], rdi;
是正确的吗?
让我们假设变量a
被放置在地址0xDEADBEEF
中,它的值是42
。 如何比较a
(42
)与另一个int的值?比较指针指向的值
目前,我有(Intel语法):
mov rax, 0xDEADBEEF;
mov rdi, 1;
cmp [rax], rdi;
是正确的吗?
Little endian处理器(如大多数现代桌面处理器)将内存值向后排列。例如,如果在0xDEADBEEF值42
,又名0x0000002A
,那么它将被存储为
2A 00 00 00
您可以强制多少字节的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 ?? ?? ?? ??
的memooryy的其余部分将包含一些其他的随机信息。你的程序会有最糟糕的错误 - 一种随机发生的错误。 cmp指令仍将比较8个字节,因为rdi
的长度为8个字节。
并回答到枪手的问题,您的评论(因为我没有权限评论):
mov rax, [0xDEADBEEF]
cmp rax, 1
相同
mov rax, 0xDEADBEEF
cmp [rax], 1
在rax里面移动''0xDEADBEEF'''的值会使rax变成'''24 00 00 00 00 00 00 00'''。将rdi移动到rdi中,会使rdi变成''01 00 00 00 00 00 00 00'''。比较这些值作为单词,dword或qword应该返回相同的结果,对吧? – alexandernst
@alexandernst是的,'rax'将指向'2A 00 00 00 00 00 00 00'。在我的帖子中还有一个类型 - 写了24而不是2A。值以自然顺序存储在寄存器中,因此'rdi'将为'00 00 00 00 00 00 00 01'。是的,操作数的大小应该无关紧要 - 无视我原来的文章:) –
的确,我想到了一些有趣的事情,那些4字节的int整理成8字节的寄存器......(因为,是的,0xDEADBEEF指向了一个int)。我想我应该转向eax。 :) – alexandernst
您是mov
荷兰国际集团的价值0xDEADBEEF
成您需要L和E有效A个ddress为rax
不知道你的汇编程序,但在NASM:
lea rax, [SomeAddress]
或者:
mov rax, [SomeAddress]
为什么?我真的想在''''rax'''内获得'''0xDEADBEEF''的*值*。或者我错过了什么? – alexandernst
根据你所说的:“让我们假设变量a放在地址0xDEADBEEF中,它的值是42”,你的标题是:“比较指针指向的值”。 – Gunner
mov rax,[0xDEADBEEF]''与mov rax,0xDEADBEEF'''相同,然后是''cmp [rax],1'''吗? – alexandernst
哪个汇编?对于气体,假设.intel_syntax noprefix
:
cmp QWORD PTR ds:0xdeadbeef, 1
注意,0xdeadbeef
将被符号扩展。您可能更愿意明确说明并包含ff
以明确说明。
通常您不需要指定ds:
,因为您将引用标签并且汇编器将处理事情。那就是:
cmp DWORD PTR [foo], 1
cmp DWORD PTR foo, 1 # same thing
它会失败吗? –
@KerrekSB不,但它没有做我期望的,而且我也不确定这个bug是因为这个代码还是因为别的。 – alexandernst
单元测试:-) –