gpt4 book ai didi

assembly - 16 位汇编器 (x86) 中数据段的 32 位语法字

转载 作者:行者123 更新时间:2023-12-02 19:25:51 32 4
gpt4 key购买 nike

在 16 位 x86 程序集中,您可以编写:

mov ax, @DATA
mov ds, ax

32位的精确代码如何转换?我不知道32位的数据段。

mov eax, @DATA
mov ? , eax

感谢您的回答!

最佳答案

简单的答案

32 位代码看起来与 16 位代码完全相同:

mov ax, @DATA
mov ds, ax

...因为选择器注册了 (cs, ds, es, ss, fsgs)在 32 位代码中仍然只有 16 位宽。因此,“段值”也是 16 位宽,并且通用寄存器(例如 ax)的低 16 位尚未重命名。

更复杂的答案

只有少数目标文件格式支持 32 位代码中的段选择器!

mov ax, @DATA 将被汇编器拒绝,因为根本不可能在目标文件中表示该行!

大多数 32 位操作系统使用“平面”内存布局。这意味着csdsesss指向物理地址0并且限制为4GiB 。换句话说:整个内存可以直接寻址,而不需要改变选择器寄存器的值。

因此,大多数目标文件格式甚至不支持此功能。

很少有操作系统真正在 32 位代码中使用选择器寄存器。对于此类系统,您必须使用使用支持此功能的目标文件格式的开发软件(汇编器、编译器、链接器...)!

如果您有此类软件(并且使用此类操作系统),则代码与 16 位代码相同(如上所示)。

编辑

读完评论后,我想澄清以下这句话:

There are few operating systems that really use the selector registers in 32-bit code...

这里的意思是:只有少数 32 位操作系统使用不同的选择器寄存器值来访问可执行文件中的不同部分(代码、数据、const、BSS...)。 (然而,选择器寄存器中的不同值还有其他用途。)

大多数操作系统对可执行文件中的所有段/节使用相同的选择器值,并且这些操作系统已经将选择器寄存器初始化为正确的值。因此指令 mov ax, @DATA 并没有真正的意义。与指令 mov ax, ds (在这些条件下具有相同的效果)不同,指令 mov ax, @DATA 还需要特殊功能(特殊的“重定位”)在目标文件格式中,这将根本不会被实现,因为这样的指令没有任何意义。

但是,很少有 32 位操作系统使用“平面”内存布局,而是为程序中的不同数据段使用不同的选择器值。当然,这样的操作系统必须使用不同的目标文件格式。对于此类操作系统,绝对支持指令 mov ax, @DATA。不过,我怀疑是否有汇编器允许将选择器值分配给 32 位寄存器(mov eax, @DATA)。

关于assembly - 16 位汇编器 (x86) 中数据段的 32 位语法字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46559399/

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