全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

CeraNetworks网络延迟测速工具IP归属甄别会员请立即修改密码
查看: 1016|回复: 10

这段汇编语言翻译对了吗

[复制链接]
发表于 2023-2-16 15:54:58 | 显示全部楼层 |阅读模式
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

我翻译成
int g(int x) { return x+8; }
int main(void) { return g(8)+8; }

不知道翻译对了没
发表于 2023-2-16 16:16:04 | 显示全部楼层
这段汇编语言是一个简单的函数调用示例,包含两个函数 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 并返回。
发表于 2023-2-16 16:08:23 | 显示全部楼层
sub 那个是减去8吧
 楼主| 发表于 2023-2-16 16:27:01 | 显示全部楼层
daizuan 发表于 2023-2-16 16:16
这段汇编语言是一个简单的函数调用示例,包含两个函数 g 和 main。下面是每个函数的功能和代码含义:

函数 ...

感谢汇编大佬解析
 楼主| 发表于 2023-2-16 16:28:02 | 显示全部楼层
acpp 发表于 2023-2-16 16:08
sub 那个是减去8吧

所以是
在g中加8又在main中减8对吧
发表于 2023-2-16 16:28:34 | 显示全部楼层
int g(int a) {
    int b = a + 8;
    return b;
}
int main() {
    int c = g(8) - 8;
    return 0;
}
发表于 2023-2-16 16:36:04 | 显示全部楼层
现在都要来LOC写作业了啊,以后上课不要玩手机了
 楼主| 发表于 2023-2-16 16:38:35 | 显示全部楼层
dsusu 发表于 2023-2-16 16:28
int g(int a) {
    int b = a + 8;
    return b;

感谢
发表于 2023-2-16 16:40:50 | 显示全部楼层
以后loc冷不丁地冒出一个图灵奖
发表于 2023-2-16 17:08:02 | 显示全部楼层
全球汇编论坛
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|全球主机交流论坛

GMT+8, 2026-1-25 20:34 , Processed in 0.061017 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表