正如我们所知,C ++中的一个高级语言指令如“counter ++”将被翻译成几个汇编语言指令。
我的问题是单个汇编语言指令怎么样?某些汇编语言指令是否也会被转换为硬件可以直接读取的多个机器指令?
如果是肯定的,当发生线程/进程调度时,一旦CPU完成执行当前的机器指令,就会发生上下文切换(或其他需要在调度期间完成的事情),即使有多个指令也是如此左边哪个形成一个汇编语言指令和当前的一个?
例如, 一个汇编语言指令A可以被翻译成机器指令a1,a2,a3。上下文切换可以在a2,a3之间发生吗?
单个汇编语言指令的相应机器指令A:
a1(已执行) a2(执行..)< ---下一个上下文切换即将发生 a3(尚未执行)< ---我能在下一次上下文切换之前执行吗?
我的猜测是a3不会被执行,因为硬件只知道它的机器指令而且不知道汇编语言。因此每条指令都是分开执行的。我是对的吗?
答案 0 :(得分:2)
实际上,在很多机器上,counter++
会转换为单个指令(例如inc counter
)。
汇编语言的定义几乎就是你所编写的内容只是实际机器代码的助记符,因此一个汇编指令转换为一个机器指令。
某些CPU(x86)是微编码的,因此您作为单个指令输入的内容实际上是作为一系列微操作执行的。从指令到微操作的确切映射通常没有记录(例如,英特尔在奔腾Pro /奔腾II时间框架周围进行了测试,但大部分都没有了。)
中断分为两类。大多数只会在当前机器指令完成执行后执行。但是,一些指令在执行单个指令时可能会中断。一个典型的例子是尝试访问不存在的内存页面。如果这样做,机器将中断当前指令,并跳转到异常处理程序。异常处理程序通常会在该地址的数据中进行分页。返回时,地址的数据 。指令重新启动,并且可以成功执行。
答案 1 :(得分:1)
有时在组装过程中,组装者可能潜入NOP以便填充或保持对齐。取决于处理器和各种各样的东西。但是几乎所有的汇编指令都将1:1翻译成机器指令。
通常,CPU将完成当前指令,然后响应中断。我唯一的资格是,在某些CPU中有一些指令实际上可能需要很长时间。例如,Z80有一个块移动指令,可能需要很长时间,特别是在CPU术语中,x86有它的向量指令等。所以我不知道这些指令是否在中间停止并在以后重新启动或者如果CPU等待它们完成。
但是对于一般的中断,是的,它们发生在机器指令之间。