请教汇编里面多个程序操作同一个寄存器数据冲突的问题

2022-03-30 10:15:11 +08:00
 mekingname

请教一下汇编里面的“寄存器”是物理意义上的 CPU 里面的寄存器还是逻辑意义上的寄存器?如果是物理意义上的,那么,为什么多个程序同时操作同一个寄存器的时候,他们的数据不会冲突呢?

因为操作系统里面肯定有很多程序在运行的,在微观上,不同的指令应该是串行运行的。通过时间片来切换。

例如 A 程序要执行两个指令:CMP 判断寄存器 rdi 里面的数字是不是 0 ,如果不是 0 ,就用寄存器 rsp 里面的数除以 rdi 。

当 A 程序刚好 CMP 完成以后,时间片切换到 B 程序,此时 B 程序执行 mov 指令,把 0 放到了 rdi 寄存器里面,然后时间片再切换回 A 程序,那么这个时候 A 程序做除法不就会报错了吗?

为什么写汇编的人,似乎从来没有考虑过这种冲突?看起来就像是每个寄存器都是这个程序独占的一样。

722 次点击
所在节点    问与答
4 条回复
icyalala
2022-03-30 10:17:53 +08:00
context switch
Origami404
2022-03-30 10:25:27 +08:00
有操作系统的话操作系统会保存吧
LLaMA2
2022-03-30 10:27:31 +08:00
可能不正确的回答: 因为这取决与操作系统啊,写汇编的人不在乎冲突是应为他知道他用的是多任务的操作系统,操作系统会帮助他调度。对于他来说,就是独占的啊
mekingname
2022-03-30 10:37:29 +08:00
@ye4tar 因为我之前理解的多个汇编程序读写同一个寄存器,就跟多个高级语言读写同一个磁盘文件一样,所以会觉得有冲突。但是寄存器在时间片切换的时候,里面的值会跟着上下文一起被保存,而磁盘文件不会。因此,汇编程序切换回去后,操作系统会恢复寄存器原来的值,因此就不会有问题了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/843792

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX