共计 862 个字符,预计需要花费 3 分钟才能阅读完成。
g: pushl %ebp movl %esp,%ebp movl 8(%ebp),%eax addl $8,%eax popl %ebp ret main: pushl %ebp movl %esp,%ebp pushl $8 call g subl $8,%eax movl %ebp,%esp ret 我翻译成 不知道翻译对了没 |
网友回复:
注册 : 这段汇编语言是一个简单的函数调用示例,包含两个函数 g 和 main。下面是每个函数的功能和代码含义:函数 g:保存当前函数的栈帧指针 %ebp 到栈中,使其成为前一个栈帧的基址 将当前栈指针 %esp 复制到 %ebp,成为当前栈帧的基址 从 %ebp 指向的地址加上 8 的偏移,将结果保存到 %eax 中 将栈中保存的前一个栈帧的基址弹出到 %ebp,恢复前一个栈帧的状态 通过 ret 指令返回函数调用,返回地址存储在栈中的 %eip 中 函数 main:保存当前函数的栈帧指针 %ebp 到栈中,使其成为前一个栈帧的基址 将当前栈指针 %esp 复制到 %ebp,成为当前栈帧的基址 将常数值 8 压入栈中 调用函数 g,g 函数返回后将返回值保存到 %eax 中 将 %eax 中的返回值减去 8,保存结果到 %eax 中 恢复当前函数栈指针 %esp 为之前保存的 %ebp 通过 ret 指令返回函数调用,返回地址存储在栈中的 %eip 中 总体来说,这段代码的作用是在函数 main 中调用函数 g,将 8 传递给 g 函数并获得返回值,最终将返回值减去 8 并返回。
rkidc: sub 那个是减去 8 吧
daizuan: 感谢汇编大佬解析
acpp: 所以是 在 g 中加 8 又在 main 中减 8 对吧
rkidc: int g(int a) {int b = a + 8; return b;} int main() { int c = g(8) – 8; return 0; }
rkidc: 现在都要来 LOC 写作业了啊,以后上课不要玩手机了
dsusu: 感谢
HOH: 以后 loc 冷不丁地冒出一个图灵奖
rkidc: 全球汇编论坛
注册 : 喜欢上课摸 jj