【发布时间】:2019-11-27 02:49:19
【问题描述】:
我最近开始学习使用 MASM 语言的 x86 汇编。
我正在使用 Isreal Gbati 的 Udemy 课程“x86 Assembly Language From Ground Up”来学习。
下面的代码来自课程中的一节课,(这不是我想出的代码)。此函数由 C 程序中的 main 调用。这里是:
#include <stdio.h>
#include <stdlib.h>
extern int AdderASM(int a, int b, int c);
int main(void)
{
int a = 17;
int b = 11;
int c = 14;
int sum = AdderASM(a, b, c);
printf("A = %d\n", a);
printf("B = %d\n", b);
printf("C = %d\n", c);
printf("SUM FROM ASSEMBLY FUNCTION = %d\n", sum);
return 0;
}
这是程序集:
.386
.model flat, c
.code
AdderASM PROC
PUSH EBP
MOV EBP, ESP
MOV EAX, [EBP+8]
MOV ECX, [EBP+12]
MOV EDX, [EBP+16]
ADD EAX, ECX
ADD EAX, EDX
POP EBP
RET
AdderASM ENDP
END
我不明白以下内容:
当我们使用pop 时,据我了解有点像在C 中使用free()。如果我错了,请纠正我
那么为什么我们只在 EBP 寄存器上使用 pop 呢?我们不应该同时弹出 ECX 和 EDX 寄存器吗?
我知道在 C 函数中,由malloc() 分配内存的指针需要在函数结束之前释放。使用的寄存器都是通用的 32 位寄存器,但 EBP 作为堆栈帧指针有特殊用途。这就是它需要被释放的原因吗?
另外,我知道ret 是在过程结束时使用的,但是我们怎么知道这个函数是在返回一个值呢?
为了更好地解释我的问题,这里是用 C 编写的相同函数:
int AdderClang(int a, int b, int c)
{
return a + b + c;
}
如果我只输入return; 而不是return a + b + c;,我不知道会发生什么,但这不会是预期的结果。我们也可以知道这个 C 函数返回一个 int,因为它在声明中告诉我们。
所有这些都可能在课程后面进行解释,我相信我的问题的答案很简单。但是,我试图慢慢来,以确保我明白我在做什么。是的,我知道 Assembly 不是 C,因此像我这样比较这两种语言可能不是正确的方法,但我正在学习 Assembly 以更好地理解 C 中的内存管理内容。
感谢大家的宝贵时间!
【问题讨论】:
标签: c memory-management x86 masm cpu-registers