代码之家  ›  专栏  ›  技术社区  ›  Terry

将32位和16位代码与nasm混合

  •  5
  • Terry  · 技术社区  · 18 年前

    这是一个低级系统问题。

    总之,我在我的程序集中使用了[BITS 32]和[BITS 16]来告诉nasm它应该使用哪种类型的操作,但是当我测试代码时,bochs似乎没有执行我编写的代码。看来装配工在插入额外的东西 0x66 和 0x67 这让博克斯很困惑。

    4 回复  |  直到 9 年前
        1
  •  6
  •   Terry    18 年前

    问题是我没有正确设置描述符表。我有一个位翻转错误,所以我没有进入16位模式,而是改为32位模式(段恰好有一个兆欧的限制)。

    谢谢你的建议!

    特里

        2
  •  4
  •   Curt Hagenlocher    18 年前

    this link ),

    “当NASM处于16位模式时,使用32位数据的指令以0x66字节作为前缀,而那些引用32位地址的指令有一个0x67前缀。在位32模式下,情况正好相反:32位指令不需要前缀,而使用16位数据的指令需要0x66,而在16位地址上工作的指令需要0x67。”

    这表明是博克斯的错。

        3
  •  0
  •   Neall    18 年前

    你不是在开玩笑说这是低级的!

    您是否检查了生成的操作码/操作数,以确保nasm正确执行您的位指令?还要检查以确保跳转目标是正确的-也许nasm使用了错误的偏移量。

    如果不是nasm中的bug,可能bochs中有bug。我无法想象人们会经常从32位模式切换回16位模式。

        4
  •  0
  •   Nathan Fellman    18 年前

    如果你在实模式下,你的默认大小是隐式的16位,所以你应该使用16位模式。这样,如果需要32位操作数大小,则添加0x66前缀,而对于32位地址大小,则添加0x67前缀。

    请参阅“英特尔IA-32软件开发人员指南”,第3卷,第16章(混合使用16位和32位代码;章节号可能会根据本书的版本更改):

    实地址模式、虚8086模式和SMM是本机16位模式。

    只有在保护模式或长模式之外使用bits32指令时,它才会混淆汇编器。

    推荐文章