Assembly 汇编和逻辑分析器-执行顺序

Assembly 汇编和逻辑分析器-执行顺序,assembly,Assembly,我有一个关于低级事物的问题。我们在分析微处理器如何执行简单的汇编程序,我们在使用逻辑分析器,所以我有.law文件。这是我们使用的代码(在我放置操作码的注释中): 我们在调试程序中编写,组装并观察输出。图为: 现在,有一件奇怪的事(至少对我来说是这样): 突然,他将CX寄存器中的值写入内存中的某个位置(我怀疑1EF6A是SS:SP的物理地址)。是因为天气原因吗 push CX? 如果是的话,他为什么在会议结束后这样做 mov [bx],al 为什么写信给[bx]这么晚 我认为应该在push指

我有一个关于低级事物的问题。我们在分析微处理器如何执行简单的汇编程序,我们在使用逻辑分析器,所以我有.law文件。这是我们使用的代码(在我放置操作码的注释中):

我们在调试程序中编写,组装并观察输出。图为:

现在,有一件奇怪的事(至少对我来说是这样):

突然,他将CX寄存器中的值写入内存中的某个位置(我怀疑1EF6A是SS:SP的物理地址)。是因为天气原因吗

push CX?
如果是的话,他为什么在会议结束后这样做

mov [bx],al
为什么写信给[bx]这么晚

我认为应该在push指令之后立即将值推送到堆栈

(对不起,我还没有足够的代表发表评论,所以我只好写下这个答案。)

@这是8088,对吗?这就是为什么analyzer跟踪中的内存访问是逐字节的。因此,您看到的是8088预取单元的结果,它从内存中盲目读取指令字节,并将它们保存在一个短的(4字节)预取队列中,希望执行单元以后会使用它们

执行单元实际执行的指令产生的数据操作将在一段时间后出现在总线上。这就是为什么写入内存的CX值在读取
push CX
指令后不会立即显示,也就是为什么直到读取
MOV AX[BX]
指令后,AL写入才会出现在总线上。这也是为什么在循环结束时(不幸的是,此跟踪快照中没有显示),您将看到循环指令之后的预取单元读取指令。但是,执行单元不会执行这些指令

您担心预取单元的readahead可能会产生不良副作用是正确的,但只有在处理预取单元已从该位置收集以前的值之后写入的内存位置时,才会出现危险,只有在处理当前程序执行点上方的内存位置时,才会发生这种情况。如果您曾经遇到过这种情况,那么在尝试读取新写入的位置之前,您必须采取措施使预取队列的内容无效。执行
JMP
就可以做到这一点

@扎克:这里没有无序执行,没有多核或多线程,甚至没有任何缓存。只是少量的盲目的推测性预取。是的,预回迁确实使跟踪跟踪变得比8085稍微复杂一些。

(对不起,我还没有足够的代表发表评论,所以我只好写下这个答案。)

@这是8088,对吗?这就是为什么analyzer跟踪中的内存访问是逐字节的。因此,您看到的是8088预取单元的结果,它从内存中盲目读取指令字节,并将它们保存在一个短的(4字节)预取队列中,希望执行单元以后会使用它们

执行单元实际执行的指令产生的数据操作将在一段时间后出现在总线上。这就是为什么写入内存的CX值在读取
push CX
指令后不会立即显示,也就是为什么直到读取
MOV AX[BX]
指令后,AL写入才会出现在总线上。这也是为什么在循环结束时(不幸的是,此跟踪快照中没有显示),您将看到循环指令之后的预取单元读取指令。但是,执行单元不会执行这些指令

您担心预取单元的readahead可能会产生不良副作用是正确的,但只有在处理预取单元已从该位置收集以前的值之后写入的内存位置时,才会出现危险,只有在处理当前程序执行点上方的内存位置时,才会发生这种情况。如果您曾经遇到过这种情况,那么在尝试读取新写入的位置之前,您必须采取措施使预取队列的内容无效。执行
JMP
就可以做到这一点


@扎克:这里没有无序执行,没有多核或多线程,甚至没有任何缓存。只是少量的盲目的推测性预取。是的,预取确实使得跟踪跟踪比8085稍微复杂一些。

可能是无序执行的产物。我建议你先研究一个更简单的CPU,比如一个顺序ARM芯片。那只是微处理器类的一部分,所以我家里没有任何逻辑分析仪。你说这种行为不正常?因为我在考虑后果,如果有人试图用mov[bx]之后的一条指令读取内存的某个部分,他读取的是未更新的值,因为写入时间较晚。不,对于现代x86芯片来说,这种行为是完全正常的。如果你没有预料到这一点,这会让人感到困惑,并且会产生各种各样令人毛骨悚然的后果——当你想知道如果有人试图在写完后阅读会发生什么时,你的思路是正确的。(CPU保证同一线程中的一条指令会看到内存,就好像写入发生了一样,但另一个内核上的另一个线程可能不会看到内存——为了进一步的启发,请阅读,但我警告您,这可能会让您的头爆炸。)Grr,我的意思是错误的URL检测。无论如何,我想通过“让你的手在一个更简单的CPU上”得到的是,我认为x86太复杂了,不能成为你的类要求你使用逻辑探测器的第一个CPU。理想情况下,应该从有序运行并具有直写缓存的东西开始,然后逐步升级。你可以告诉你的朋友
push CX?
mov [bx],al