V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
mekingname
V2EX  ›  问与答

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

  •  
  •   mekingname · 2022-03-30 10:15:11 +08:00 · 797 次点击
    这是一个创建于 970 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    4 条回复    2022-03-30 10:37:29 +08:00
    icyalala
        1
    icyalala  
       2022-03-30 10:17:53 +08:00
    context switch
    Origami404
        2
    Origami404  
       2022-03-30 10:25:27 +08:00 via Android
    有操作系统的话操作系统会保存吧
    LLaMA2
        3
    LLaMA2  
       2022-03-30 10:27:31 +08:00
    可能不正确的回答: 因为这取决与操作系统啊,写汇编的人不在乎冲突是应为他知道他用的是多任务的操作系统,操作系统会帮助他调度。对于他来说,就是独占的啊
    mekingname
        4
    mekingname  
    OP
       2022-03-30 10:37:29 +08:00
    @ye4tar 因为我之前理解的多个汇编程序读写同一个寄存器,就跟多个高级语言读写同一个磁盘文件一样,所以会觉得有冲突。但是寄存器在时间片切换的时候,里面的值会跟着上下文一起被保存,而磁盘文件不会。因此,汇编程序切换回去后,操作系统会恢复寄存器原来的值,因此就不会有问题了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2499 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 15:45 · PVG 23:45 · LAX 07:45 · JFK 10:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.