Assembly 使用带空寄存器的add?

Assembly 使用带空寄存器的add?,assembly,x86-64,Assembly,X86 64,我看到的汇编代码如下所示: addl %eax, -8(%rbp) 我知道寄存器%eax中有一个值,但在这行之前没有触及-8(%rbp)。我是否可以假设它是空的,并且只将%eax+0的值放入-8(%rbp)?正如@Jester在评论中指出的,它应该在该行之前的某个地方有一个赋值,否则您将看到一个潜在的未定义行为 让我们考虑以下C源代码和各自的程序集输出(使用GCC编译,无优化): 文件添加noinit.c: int main(void) { int a;

我看到的汇编代码如下所示:

addl   %eax, -8(%rbp)

我知道寄存器%eax中有一个值,但在这行之前没有触及-8(%rbp)。我是否可以假设它是空的,并且只将%eax+0的值放入-8(%rbp)?

正如@Jester在评论中指出的,它应该在该行之前的某个地方有一个赋值,否则您将看到一个潜在的未定义行为

让我们考虑以下C源代码和各自的程序集输出(使用GCC编译,无优化):

文件添加noinit.c

int main(void) {
        int a;

        return a += 1;
}
int main(void) {
        int a = 0;

        return a += 1;
}
文件添加noinit.s(gcc-O0-s添加noinit.c):

如您所见,add_1_noinit.c不会初始化变量a,从而导致未定义的行为(main()的返回值未知)

现在让我们看一下初始化的变量的输出:

文件添加\u 1\u init.c

int main(void) {
        int a;

        return a += 1;
}
int main(void) {
        int a = 0;

        return a += 1;
}
文件add_1_init.s(gcc-O0-s add_1_init.c):


如您所见,在本例中,我们知道main()的返回值是什么,并且在添加1之前,将值0设置为-4(%rbp)指向的内存区域。

正如@Jester在注释中指出的,它应该在该行之前的某个位置具有赋值,否则,您将看到潜在的未定义行为

让我们考虑以下C源代码和各自的程序集输出(使用GCC编译,无优化):

文件添加noinit.c

int main(void) {
        int a;

        return a += 1;
}
int main(void) {
        int a = 0;

        return a += 1;
}
文件添加noinit.s(gcc-O0-s添加noinit.c):

如您所见,add_1_noinit.c不会初始化变量a,从而导致未定义的行为(main()的返回值未知)

现在让我们看一下初始化的变量的输出:

文件添加\u 1\u init.c

int main(void) {
        int a;

        return a += 1;
}
int main(void) {
        int a = 0;

        return a += 1;
}
文件add_1_init.s(gcc-O0-s add_1_init.c):


如您所见,在本例中,我们知道main()的返回值是什么,并且在添加1之前,将值0设置为-4(%rbp)指向的内存区域。

通常硅存储位只有两种状态0和1,因此,即使您没有看到设置寄存器的代码,它也不是“空的”,它包含一个模式,指令将使用该模式,崩溃或正确执行。现在,在逻辑模拟中,对于位0,1,x,可以有三个或更多的状态,其中任何与x结合的是x,或者任何与x结合的是x。在这种情况下,您可以有一个“空”或至少未初始化的寄存器。Xes就像瘟疫一样,它们会感染你的模拟,并最终将整个事情变成Xes。所以你必须非常小心,总是在阅读之前先写。包括登记册

我确信在这种情况下,如果这是有效的代码,那么在指令之前的某个时刻,rbp是用一个sane值编写的。根据您是如何反汇编或查看它的,它可能是一些您已反汇编为代码的数据模式。作为x86很难正确地反汇编,所以如果这是分离的代码,您必须假设某些百分比可能是错误的,也可能是错误的。如果这只是编译器的直接汇编,或者是手工编写的,那么假设它不是糟糕的代码,那么您在代码或调用中的回溯距离不够远,无法看到正在编写寄存器


注:寄存器不能为“空”,位将有一个状态,而对于位存储,不存在空状态,只有0或1。

通常在硅中,存储位只有两种状态0和1,因此即使您没有看到将寄存器设置为非“空”的代码,它也包含一个模式,指令将使用该模式,崩溃或正确执行。现在,在逻辑模拟中,对于位0,1,x,可以有三个或更多的状态,其中任何与x结合的是x,或者任何与x结合的是x。在这种情况下,您可以有一个“空”或至少未初始化的寄存器。Xes就像瘟疫一样,它们会感染你的模拟,并最终将整个事情变成Xes。所以你必须非常小心,总是在阅读之前先写。包括登记册

我确信在这种情况下,如果这是有效的代码,那么在指令之前的某个时刻,rbp是用一个sane值编写的。根据您是如何反汇编或查看它的,它可能是一些您已反汇编为代码的数据模式。作为x86很难正确地反汇编,所以如果这是分离的代码,您必须假设某些百分比可能是错误的,也可能是错误的。如果这只是编译器的直接汇编,或者是手工编写的,那么假设它不是糟糕的代码,那么您在代码或调用中的回溯距离不够远,无法看到正在编写寄存器


注:寄存器不能为“空”,位将有一个状态,对于位存储,没有空状态,只有0或1。

否。它肯定是以前分配的,您需要仔细查看。它可能是使用不同的指针编写的,例如相对于
rsp
。请注意,内存通常不会归零,尤其是
rbp
经常指向的堆栈。这肯定是以前分配的,你需要仔细看看。它可能是使用不同的指针编写的,例如相对于
rsp
。请注意,内存通常不会归零,尤其是
rbp
经常指向的堆栈。因此在该行之前没有提到-8(%rbp),也没有使用%rsp的任何引用,但是,有一个数组指针存储在-24(%rbp)处。-8(%rbp)会在该数组中存储第5个元素吗?我不认为这是正确的,因为我认为指针会poi