gpt4 book ai didi

c - 使用 x86 ASM 设置存储在地址的值

转载 作者:行者123 更新时间:2023-12-02 01:52:40 25 4
gpt4 key购买 nike

我正试图了解一些内联 ASM,但出于某种原因,这并没有像我预期的那样运行。为什么这个设置 x 的值不等于 62?

#include <stdio.h>

int main()
{
int x = 525;
int* y = &x;

_asm
{
mov eax, 62
mov [y], eax
}

printf("%i", x);
getchar();
return 0;
}

该代码导致输出 525。我预计它是 62。

最佳答案

这里有一个完全可以原谅的误解:

surely [y] would mean [0xCCCCCCCC] (assuming the address of x was 0xCCCCCCCC)

在高级理论中,是的。问题是,在实际汇编中 [0xCCCCCCCC] 没有意义 - CPU 不能直接取消引用内存地址 - 它只能加载那个地址的值到注册,然后取消引用那个

同样,由于 y 是一个变量,而不是一个寄存器,它被隐式地视为一个地址1asm block 内的 y 等同于 2 外的 C 代码中的 &y。正如您在调试器中逐步执行所看到的那样,发生的事情是汇编程序只是忽略了没有意义的括号(而不是抛出一个有用的错误)并汇编了 mov y, eax 的等价物.

获得你期望的方式是这样的:

asm {
mov eax, 62
mov edx, y
mov [edx], eax
}

[1] 这显然不是 GCC。 GCC 扩展 asm 是一个完全不同的球类游戏...

[2] 有点简化 - 从 C 的角度来看,它是一个“地址”,但在汇编上下文中,它是一个内存操作数,实际上更像是地址的使用。当我编译它时,y[ebp-20] 的形式出现,从高级 View 来看是“堆栈上的地址”。

关于c - 使用 x86 ASM 设置存储在地址的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21841008/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com