比较指针指向的值

时间:2013-12-22 20:11:25

标签: assembly x86-64

让我们假设变量a放在地址0xDEADBEEF中,其值为42。 如何比较a42)与另一个int的值?

目前我有(英特尔语法):

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

这是对的吗?

3 个答案:

答案 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}}