2013-12-22 77 views
1

让我们假设变量a被放置在地址0xDEADBEEF中,它的值是42。 如何比较a42)与另一个int的值?比较指针指向的值

目前,我有(Intel语法):

mov rax, 0xDEADBEEF; 
mov rdi, 1; 
cmp [rax], rdi; 

是正确的吗?

+0

它会失败吗? –

+0

@KerrekSB不,但它没有做我期望的,而且我也不确定这个bug是因为这个代码还是因为别的。 – alexandernst

+0

单元测试:-) –

回答

1

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 
+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

+1

@alexandernst是的,'rax'将指向'2A 00 00 00 00 00 00 00'。在我的帖子中还有一个类型 - 写了24而不是2A。值以自然顺序存储在寄存器中,因此'rdi'将为'00 00 00 00 00 00 00 01'。是的,操作数的大小应该无关紧要 - 无视我原来的文章:) –

+0

的确,我想到了一些有趣的事情,那些4字节的int整理成8字节的寄存器......(因为,是的,0xDEADBEEF指向了一个int)。我想我应该转向eax。 :) – alexandernst

-1

您是mov荷兰国际集团的价值0xDEADBEEF成您需要LE有效A个ddress为rax

不知道你的汇编程序,但在NASM:

lea rax, [SomeAddress] 

或者:

mov rax, [SomeAddress] 
+0

为什么?我真的想在''''rax'''内获得'''0xDEADBEEF''的*值*。或者我错过了什么? – alexandernst

+0

根据你所说的:“让我们假设变量a放在地址0xDEADBEEF中,它的值是42”,你的标题是:“比较指针指向的值”。 – Gunner

+0

mov rax,[0xDEADBEEF]''与mov rax,0xDEADBEEF'''相同,然后是''cmp [rax],1'''吗? – alexandernst

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