我知道我没有说清楚。我认为,我的疑问可归纳为:
在可执行文件(机器代码)中,“变量”是如何表示的?它们是静态内存地址吗?编译器是否为每个人提供了一个特定的“名称”(或只保留你给他们的名字)?
在代码中表示:
int x=5;
//Bunch of code
cin>>y;
cout<<x+1;
每台机器中的程序如何知道哪个地址将保持值5,保持输入的值,将1加到现有的值,最后打印相同的值。
- 若昂
答案 0 :(得分:7)
这是特定于实现的。
通常,变量的位置将基于各种因素和优化。它们可能根本不存在于RAM中,因为它们可能被优化为完全存在于寄存器中,或完全优化。
运行时不存在变量名称;它们在编译期间被丢弃。但是,编译器可能会发出存储在应用程序二进制文件中的调试信息,以允许开发人员调试应用程序。但是,这通常会在发布版本中删除。
我不知道Gameshark的具体细节。但在许多情况下,可以通过查看应用程序的机器代码来计算特定变量的位置。
答案 1 :(得分:7)
这是C中的一个简单程序:
int main() {
int a = 5;
int b = 7;
int c = a + b;
return 0;
}
如果你在Linux下用gcc -m32 -S -O0 -o main.s main.c
编译它,你会得到类似的东西
.file "main.c"
.text
.globl main
.type main, @function
main:
.LFB0:
/* %ebp is a Base Pointer Register */
pushl %ebp
movl %esp, %ebp
/* Here we reserve space for our variables */
subl $16, %esp
/* a's address is %ebp - 4 */
movl $5, -4(%ebp)
/* b's address is %ebp - 8 */
movl $7, -8(%ebp)
/* a + b */
movl -8(%ebp), %eax
movl -4(%ebp), %edx
addl %edx, %eax
/* c's address is %ebp - 12 */
movl %eax, -12(%ebp)
/* return 0 */
movl $0, %eax
leave
ret
如您所见,在这种情况下,变量的地址被计算为函数的基指针的偏移量。如果启用优化,则变量的值可以存储在寄存器中。
答案 2 :(得分:1)
所以这有两个部分,我会尽我所能。
编译时,编译器会将C ++代码转换为内部表示形式。然后将其转换为尽可能高效地使用CPU寄存器,并将其余数据推送到RAM中。当程序执行时,来自ram的数据将被来回复制到寄存器中。
关于你的另一个问题,我见过人们使用的一种方法是用户拥有的黄金。程序可以占用游戏的整个存储空间并复制它。然后,用户做一些事情(一个最小的动作)来获得或失去金币。然后,外部应用程序在整个存储空间中搜索已更改的值,以及之前的原始金量,以及现在的当前金量。一旦找到这个位置,他们就可以编辑内存位置并用他们想要的任何值更新它。
一般来说,游戏越复杂,方法就越难。