我开始学习汇编了。我遇到了这些问题。
;*************************************************;
; Second Stage Loader Entry Point
;************************************************;
main:
cli ; clear interrupts
push cs ; Insure DS=CS
pop ds
在第二行代码中,代码段被压入堆栈(我认为是这样)。我在许多代码中都看到过它。为什么我们应该这样做以及它如何确保 DS = CS?在第三行,DS 从堆栈中弹出(我认为是这样)。为什么完成?它从堆栈中弹出意味着它之前被压入堆栈。没有代码。谁能向我解释这一切?提前致谢。
最佳答案
确保这一点的不是push cs
,而是push cs; pop ds;
的组合。
第一条指令将 cs
的当前值复制到堆栈上,第二条指令将该值从堆栈中拉出并将其放入 ds
寄存器中。
为了响应您对更多信息的请求,让我们从以下堆栈和寄存器开始:
stack=[1,2,3], cs=7, ds=6
在push cs
之后,将cs
寄存器的值压入栈中:
stack=[1,2,3,7], cs=7, ds=6
在 pop ds
之后,从堆栈中弹出一个值并将其放入 ds
寄存器:
stack=[1,2,3], cs=7, ds=7
基本上就是这样。
我不记得是否可以使用 mov
指令在段寄存器之间传输(我不认为是,但我可能错了,并且这将需要推/弹出序列)。这link似乎可以确认:没有 mov
选项将段寄存器同时作为源 和 目标。
但即使是这样,汇编编码器也经常选择更合适的指令,无论是为了速度还是代码紧凑(或两者兼而有之),比如使用 xor ax, ax
而不是 mov ax, 0
例如。
关于assembly - 汇编代码解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4104038/