V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  amiwrong123  ›  全部回复第 1 页 / 共 36 页
回复总数  717
1  2  3  4  5  6  7  8  9  10 ... 36  
@vituralfuture #10
不过 1 楼那个问题,要是 函数调用时参数是通过栈来传递参数的话(不然可以直接通过寄存器传参),没有 rbp 的话,会不会有点不好办。

不过我想,有 rbp 的话(在刚进入函数时),就是 rbp 减一个数来 获得传参;如果没有 rbp ,那就通过 rsp 加一个数 来获得传参。好像一样能解决问题。
@adoal #12
嗯嗯,你的主要意思是:
如果没有 BP ,那么用其他 通用寄存器来当 BP 来用,也是一样的。

在 RISC 里,甚至 SP 都可以用 其他通用寄存器 来代替。
@vituralfuture #10
谢谢。这就是我想要的答案。
也就是说,默认编译出来的汇编,每个函数都会去使用 rbp 的。
但是如果加了-fomit-frame-pointer 参数,那么每个函数就不会去使用 rbp 了。

所以结论就是:函数调用过程中,可以不使用 rbp 。
这里写错了
@amiwrong123 #6
这里写了,比如一个函数的汇编里面:
sub $0x30, %rsp
之后取局部变量时,都是用-0x10(%rbp)、-0x20(%rbp)、-0x30(%rbp)来取 各个局部变量的。
@shawnsh #5
嗯,确实。
很多时候,可能必须用栈 来传递参数。这个时候,只有 rbp 记录了 上一个函数的栈帧基地址(刚进入下一个函数时),如果没有 rbp 就不好办了还。
@shawnsh #1
@ThirdFlame #2
我好像懂你俩的意思了,比如一个函数的汇编里面:
sub $0x10, %rsp
之后取局部变量时,都是用-0x10(%rsp)来取 局部变量的。

是这个意思吧?
@shawnsh #1
你是指,函数调用传参,不是通过寄存器传递;而是通过栈来传递参数的情况呗?
@XiaoxiaoPu #3
OK ,大概理解了。还有个问题,我这不是纯 c 编译吗,怎么还有左值右值的概念。

我一直以为只有 c++有左值右值的概念。

原来纯 c 也有啊
@hello2090 #1
写成+1 没问题?

是的,不会报错的。我只是在想,为啥这样写会报错。
@MrMissBlack #5
“第一种是 gdbinit 里面加绝对路径,第二种是把这个文件改名,riscv 版本是这么做的”
嗯嗯,你说的这种方法肯定是可以的。

不过感觉是 VSCode 的 gdb 没有处理好 这个相对路径问题,毕竟直接使用 gdb 命令,都是可以正常读取 gdbinit 文件的这个相对路径 obj/boot/boot.out 的。

感觉就像是 VSCode 的 gdb 没有先 cd 到${workspaceFolder}再执行一样,估计还有什么参数我没设置。

“最后可以在 VSCode 里面手动加载符号文件,搜索 setupCommands”
是的,这个我自己加好了:
{
"text": "symbol-file ${workspaceFolder}/obj/boot/boot.out",
"ignoreFailures": true
}
@MrMissBlack #1
哈哈,老哥,vscode 我好像也搞定了。

我把 vscode 的 gdb 插件的 log 全部打开,发现有一些报错信息:
1: (307) ->&"/home/liu/6.828/lab/.gdbinit:33: Error in sourced command file:\n"
1: (307) ->&"obj/boot/boot.out: No such file or directory.\n"
1: (307) ->(gdb)
1: (308) ->1001^done,threads=[{id="1",target-id="Thread 1",details="CPU#0 [running]",frame={level="0",addr="0x0000fff0",func="??",args=[],arch="i8086"},state="stopped"}]

总结,它去读了 lab 文件夹下的.gdbinit ,这个文件只能在 gdb 命令加了-n -x .gdbinit 参数后(也就是 make gdb 的做法),才能去读取的。

但是不知道为什么,vscode 的 gdb 插件开始的时候,也会去读取这个.gdbinit 文件,明明我在 launch.json 里没有加-n -x .gdbinit 参数的啊?

我通过删掉.gdbinit 文件后,vscode 就好了。。我现在需要解决的是,如何改 launch.json ,让 vscode 的 gdb 不去自动读这个文件。
@MrMissBlack #1
符号信息 肯定是生成了的。目前实验的结果:
1. 另一个终端 make gdb(这样是读工作目录下的.gdbinit 配置文件),是可以的。
2. 另一个终端手动进 gdb ,然后再手动设置参数也是可以的。(昨天不知道为啥不行,但是今天你一说我一试,然后都好了。我两个符号文件 obj/boot/boot.out obj/kern/kernel 都试了,都是可以的了。而且都试了 直接打断点在代码地址、函数名称 都是可以的了)
3. 唯独这个 vscode 的 gdb ,我是没有弄好。刚才试了一下,还是不行。哎
@MrMissBlack #1
![]( https://s3.bmp.ovh/imgs/2024/05/26/182008722285f021.png)

试了一下,打断点是可以的。b bootmain 这样打断点也是可以 的了。
10 天前
回复了 amiwrong123 创建的主题 跑步 哪个跑步软件可以提示 超速了?
@Bown #7
今天试了一下“目标跑”的功能。很好用,会提示“降低配速”,“提高配速”,“保持配速”三种情况。

然后今天的配速就基本保持在了我 想要的配速了,而且公里数也到 4 公里了,关键保持配速后,跑完之后的状态感觉很好,怎么说呢:就是好像自己能很快恢复下来。

最近体检一直提示我“窦性心律过缓”,我看过,好像是 51bpm 。所以不知道我这种 心律过缓的情况的话,用心率作为指导 还准吗
11 天前
回复了 amiwrong123 创建的主题 跑步 哪个跑步软件可以提示 超速了?
@Bown #3
是不是用那个“目标跑”的功能
11 天前
回复了 amiwrong123 创建的主题 跑步 哪个跑步软件可以提示 超速了?
@stefanDan #2
一般 心率不要超过多少啊
@phew #1
我觉得挺好听的,但就是不知道 歌曲名字 歌曲信息。
@NoOneNoBody #3
@cnbatch #4
我笔记本是 Windows ,但一般学习环境我都是在 Vmware 的 Linux 虚拟机里呀。
然后现在刚好有个项目学习( MIT 6.828 Lab ),是在 Linux 下运行 qemu 的。
@kenvix #1
就是我图里的,虚拟化引擎的第一个可选项吗
1  2  3  4  5  6  7  8  9  10 ... 36  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   849 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 23ms · UTC 21:58 · PVG 05:58 · LAX 14:58 · JFK 17:58
Developed with CodeLauncher
♥ Do have faith in what you're doing.