了解masm32和Visual Studio 2013的程序集语法问题

时间:2014-01-21 05:10:45

标签: visual-studio assembly masm32

经过多次反复试验,我仍然无法理解为什么使用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,IBM PC Family第3版的汇编语言。

2 个答案:

答案 0 :(得分:0)

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

e.g。

ml /c /Fl filename.asm

- 然后 -

link16 filename.obj

答案 1 :(得分:0)

16位和32位地址模式之间的区别是我们的代码段内的操作数/寄存器和地址的默认大小,以及汇编程序如何使用operandsize和addresssize前缀。

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

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

如果我们想要为两个地址模式提供不同的代码部分,还有两个汇编程序指令(use16和use32)用于确定编写代码的地址模式。

...

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

...

最后,底层操作系统的体系结构为我们提供了对目标的需求,我们必须汇编代码以及哪些软件中断可供使用。

德克