请教一下汇编里面的“寄存器”是物理意义上的 CPU 里面的寄存器还是逻辑意义上的寄存器?如果是物理意义上的,那么,为什么多个程序同时操作同一个寄存器的时候,他们的数据不会冲突呢?
因为操作系统里面肯定有很多程序在运行的,在微观上,不同的指令应该是串行运行的。通过时间片来切换。
例如 A 程序要执行两个指令:CMP 判断寄存器 rdi 里面的数字是不是 0 ,如果不是 0 ,就用寄存器 rsp 里面的数除以 rdi 。
当 A 程序刚好 CMP 完成以后,时间片切换到 B 程序,此时 B 程序执行 mov 指令,把 0 放到了 rdi 寄存器里面,然后时间片再切换回 A 程序,那么这个时候 A 程序做除法不就会报错了吗?
为什么写汇编的人,似乎从来没有考虑过这种冲突?看起来就像是每个寄存器都是这个程序独占的一样。
1
icyalala 2022-03-30 10:17:53 +08:00
context switch
|
2
Origami404 2022-03-30 10:25:27 +08:00 via Android
有操作系统的话操作系统会保存吧
|
3
LLaMA2 2022-03-30 10:27:31 +08:00
可能不正确的回答: 因为这取决与操作系统啊,写汇编的人不在乎冲突是应为他知道他用的是多任务的操作系统,操作系统会帮助他调度。对于他来说,就是独占的啊
|
4
mekingname OP @ye4tar 因为我之前理解的多个汇编程序读写同一个寄存器,就跟多个高级语言读写同一个磁盘文件一样,所以会觉得有冲突。但是寄存器在时间片切换的时候,里面的值会跟着上下文一起被保存,而磁盘文件不会。因此,汇编程序切换回去后,操作系统会恢复寄存器原来的值,因此就不会有问题了。
|