assembly - 汇编代码解释

标签 assembly x86 push bootloader

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

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

相关文章:

linux - 为什么 yasm 生成不正确的调试信息?

c++ - 编译为 C++ 与 C 时 GCC 代码生成的巨大差异

c - C 编译器是否保证两个八字节字段结构将在 SysV x64 上作为 INTEGER 传递?

c - 进程页表

c++ - 谁能帮我从一个简单的 Hello World 中解释这个 MSVC Debug模式反汇编?

Windows 10 上的 Android 虚拟设备 - 无尽的 "VCPU shutdown request"- 无法启动

ios - 如何返回导航堆栈?

linux - 在 Debian 上链接依赖于位置的程序集

git - 推送后更改 git 提交消息(假设没有人从远程 pull )

git - 致命: the remote end hung up unexpectedly on initial push to bitbucket