【发布时间】:2025-12-20 10:50:09
【问题描述】:
我是汇编程序的新手,想弄清楚这段代码:
072A:100 mov word ptr [0107], 4567
072A:106 mov ax, 1234
072A:109 add ax, dx
据我了解,第一条指令将两个字节的值 67 45 放在地址 072A:107 上。最后AX = 4567。
我不明白的是,为什么较新的指令 mov ax, 1234 不会更改先前 mov word ptr [0107] 指令的地址 072A:107 处的值,为什么不更改转储?
提前谢谢你。
【问题讨论】:
-
您的问题到底是什么?为什么
mov ax, 1234不显示为mov ax, 4567而是..?您是否尝试过执行一次代码然后再次生成反汇编? -
注意片段。 'word ptr [107]' 不一定是 CS:[107]
-
自修改代码很久以前就不再实用了。现代处理器在执行指令之前就预取和预解码指令。照原样,此代码需要两者之间的特殊指令,如
cpuid之类的序列化指令。 -
@Pooshkis 改写问题的标题怎么样?像“为什么后面的指令,由前一个修改,在执行时不会重置”之类的东西?您当前的似乎更像是在问为什么
mov ax,1234不修改先前的指令,希望很清楚,它不写入任何内存,因此根本无法修改任何指令。还是您有其他想法而提议的标题没有说明? -
@HansPassant:有趣的事实:x86 的实际硬件实现比纸上要求的 i-cache 一致性更强,因为正如 Andy Glew 解释的那样,与纸上规范一样弱会很慢 @987654321 @。我认为任何 x86 最需要的就是采取跳转以避免过时的指令获取,但是现代 OoO-exec 机器窥探已经在管道中的地址。 (导致自我修改代码的机器清除速度非常慢。)
标签: assembly word instructions mov