繁体   English   中英

将 memory 操作数移动到段寄存器,程序集 (x86)

[英]moving memory operand to segment register,assembly(x86)

我们是否能够使用汇编(x86)语言中的 MOV 指令以这些方式将 memory 操作数移动到段寄存器?

1.

MOV DS,[BX]

2.

MOV DS,[6401H]

是的,英特尔支持mov ds, reg/mem ,但不支持例如mov ds, imm16

验证1) gcc -c foo.s; objdump -d foo.o

mov (%bx), %ds
mov 1231(%bx), %ds

 d:   67 8e 1f                mov    (%bx),%ds
10:   67 8e 9f cf 04          mov    0x4cf(%bx),%ds

验证2)会比较棘手,因为 PE 386 中的指令在 gcc/cygwin 中转换为mov 0x7b, %reg 但对于任何寄存器也是如此。 在80286 OTOH,一个寻址模式mov [0x1111], reg

mov (123), %ds               // the target is protected mode 386
mov (123), %bx
15:   8e 1d 7b 00 00 00       mov    0x7b,%ds  
1b:   66 8b 1d 7b 00 00 00    mov    0x7b,%bx

paulsm4 可能对问题 2) 来说是正确的——虽然例如 Flat Assembler 能够在 8086 模式下编译mov ax,[123] ,但它不允许mov ds,[123]

但是,如果你允许一些规则的弯曲,例如如果 bx/bp/[sp]/di/si 中的任何一个为零,那么mov ds, [1234 + reg]是允许的。

是的,两种寻址模式都有效。

您已经将这个问题标记为 Masm 和 Nasm。 他们不一样,你知道! 为了说服 Masm 你想要一个内存引用,你可能需要执行mov ds, ds:[6401h] - 我知道这很奇怪,但这是汇编程序的语法 - 或者是我最后一次使用 Masm(很久以前! )。 冗余ds:在 Masm 中被优化掉了,Nasm 会发出它。 如果 Fasm 不这样做,那么 Fasm 就坏了(我怀疑!Tomasz 是个天才!)...只是用 Fasm 尝试过 - 工作正常!

顺便说一句,32 位地址确实涉及一个段寄存器——操作系统设置了它们,并且很少在“用户空间”代码中使用它们,但它们仍然存在! (64 位代码,不 - 但我不太确定)。

老兄 - 本世纪甚至没有人使用 DS 寄存器 :)!

我强烈建议您学习 32 位汇编程序。 如果您可以访问 Linux,这是一个很好的资源:

回答你的问题 - 我相信“不”。 您通常从 AX 寄存器加载 DS(尽管您当然可以使用其他三个通用寄存器中的任何一个)。

为了绝对确定,您应该在 Intel 参考手册中查找它(您应该可以在 Google 上找到它)。

PS:

当我说“32 位”时,我赶紧补充说,您为 x86-32 学习的任何内容都可以直接适用于 x86-64。 但大部分(?最),你学习的16位DOS的东西是不是适用于任何现代(阅读:虚拟内存/线性地址空间)系统。

恕我直言...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM