gpt4 book ai didi

assembly - 汇编代码解释

转载 作者:行者123 更新时间:2023-12-02 06:43:41 24 4
gpt4 key购买 nike

我开始学习汇编了。我遇到了这些问题。

;*************************************************;
; 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com