【问题标题】:Understanding assembly syntax issues with masm32 and Visual Studio 2013了解 masm32 和 Visual Studio 2013 的程序集语法问题
【发布时间】:2014-01-21 05:10:44
【问题描述】:

经过多次尝试和错误,我仍然无法理解为什么我的教科书中使用的汇编语法在使用 Windows 8 时会引起这么多问题。

    .MODEL  SMALL
    .586

    .STACK 100h

    .DATA
    Message DB  'Hello, my name blank', 13, 10, '$'

    .CODE
Hello PROC
    mov ax, @data
    mov ds, ax
    mov dx, OFFSET Message
    mov ah, 9h 
    int 21h 
    mov al, 0 
    mov ah, 4ch
    int 21h
Hello ENDP

    END Hello 

起初我尝试使用 masm32 运行代码,使用命令提示符和正确的链接器。然后我尝试使用 Visual Studio 2013 Ultimate;即使在 Visual Studio 中使用 masm32,我每次都会遇到类似的问题。汇编器的 @data 行存在问题,并且没有前导下划线作为 Hello。修复后者只会导致块不匹配的问题。

我确实找到了使用 MS-DOS 虚拟环境的解决方法,并且在删除 .586 指令后代码运行良好。

我怀疑主要问题是尝试在 x64 操作系统环境中运行此代码,但我仍在学习该语言,所以我想听听其他意见,了解为什么我最初无法让它运行。

我们使用的书是 Jones, Assembly Language for the IBM PC Family 3rd edition。

【问题讨论】:

  • 您的代码是 16 位的,在 64 位架构上不再原生支持。你需要一个 DOS 模拟器。
  • 究竟是什么让这段代码成为 16 位和 32 位的?是什么让某些指令在较新的架构中不合格?老实说,我才刚刚开始学习汇编,所以这似乎是一些微不足道的问题,但我对理解语法用法真的很着迷。
  • 如果您编写了代码,您应该知道。无论如何,使用int 21h 意味着您很可能正在编写一个 16 位的 DOS 程序。

标签: visual-studio assembly masm32


【解决方案1】:

您正在使用 32 位链接器。您需要使用 masm32/bin 中名为 link16 的 16 位链接器来链接代码。

例如

ml /c /Fl filename.asm

-然后-

link16 filename.obj

【讨论】:

    【解决方案2】:

    16 位和 32 位地址模式的区别在于代码段内操作数/寄存器和地址的默认大小以及汇编器如何使用操作数大小和地址大小前缀。

    在 16 位地址模式中,默认大小是 16 位,如果我们想在 16 位地址模式中使用 32 位寄存器/操作数和/或 32 位地址,那么我们的汇编器必须放置一个操作数大小和/或地址大小所有这些 32 位指令的前缀。但是如果我们在 16 位地址模式中只使用 16 位指令,那么我们不需要那些操作数大小和/或地址大小前缀。

    在 32 位地址模式中,默认大小是 32 位,如果我们想在 32 位地址模式中使用 32 位寄存器/操作数和/或 32 位地址,那么我们的汇编器不必放置操作数大小和/或我们所有 32 位指令的地址大小前缀。 (如果我们主要使用 32 位指令,这有利于最小化代码的字节数。)但是如果我们在 32 位地址模式中使用 16 位指令,那么我们的汇编器必须放置操作数大小和/或地址大小前缀.

    另外还有两个汇编器指令(use16 和 use32)用于确定代码是针对哪个地址模式编写的,如果我们想为两种地址模式使用不同的代码部分。

    ..

    除了两种地址模式之外,实模式和保护模式之间也存在很大差异。 对于实模式与 16 位地址模式(启动时默认)相结合,我们成为 64 KB 段的默认段大小,所有地址将与段寄存器的段部分和偏移部分一起计算以构建地址。对于保护模式,我们必须使用全局和/或本地描述符表来指定我们想要使用的段的大小。

    ...

    最后,底层操作系统的架构为我们提供了对目标的要求,即我们必须组装我们的代码以及哪些软件中断可以使用。

    德克

    【讨论】:

      猜你喜欢
      • 2023-01-30
      • 2017-11-21
      • 1970-01-01
      • 2015-03-30
      • 1970-01-01
      • 2015-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多