经过多次反复试验,我仍然无法理解为什么使用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版的汇编语言。
答案 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的段部分和偏移部分一起计算以构建地址。对于保护模式,我们必须使用全局和/或本地描述符表来指定我们想要使用的段的大小。
...
最后,底层操作系统的体系结构为我们提供了对目标的需求,我们必须汇编代码以及哪些软件中断可供使用。
德克