错误A2105:预期:指令或指令- MASM



我正在编写一个简单的程序,使用MASM检查给定集合中最大的32位数字。目前我在Mac BigSur上运行DOSBOX。我有一个8086文件夹,其中有MASM.exe, TASM.exe, TD.exe, BIN2HEX.exe, DEBUG.exe, EDIT.COM, EXE2BIN.exe LINK.exe。我的代码是

.model tiny
.386
.data
dat1 dd 45687902h,89177688h,9008123dh,842943abh,93649571h
max1 dd ?
.code
.startup
lea si,dat1
mov cx,5
lodsd
X1: cmp eax,[si]
jae x2
mov eax,[si]
X2: add si,4
loop x1
mov max1,eax
.exit
end

我得到的错误是-
asm(7): error A2105: Expected: instruction or directive
asm(17): error A2105: Expected: instruction or directive
对应于。startup和。exit行。
我不知道为什么会这样。

你的代码中有几个错误:

  1. 您正在混合16位和32位代码。指令.model tiny通常用于16位DOS.COM文件,其中所有代码+数据在一个64kb段中。这种方法是古老的,现在已经不使用了。

  2. 因为您使用了.386指令,所以可以假设您想使用32位代码。(反对这种假设的一个有效论据是工具集的选择。这个答案只部分适用于16位代码)。为此,上面的.model指令应该是

    .model flat, stdcall
    

    这指定了一个具有STDCALL调用约定的FLAT内存模型,有关这方面的更多信息,请参阅MS。FLAT表示线性和平面地址空间,STDCALL表示特定的调用约定(这与您无关,因为您不进行任何调用)。

  3. 所以,因为你使用32位代码,你的指针也必须是32位。因此将SI更改为ESI。同时将CX更改为ECX,因为(遗留的)LOOP指令由于32位地址大小也假定为32位值。

修复代码中其他一些小的逻辑错误,一个可行的方法是:

.386
.model flat,stdcall
.data
dat1 dd 45687902h,89177688h,9008123dh,842943abh,93649571h
.data?
max1 dd ?
.code
start:
lea esi, dat1
mov ecx, 5     ; number of elements in the array
mov edx, 0     ; EDX = MAX VALUE starts with the lowest possible value 0
X1: lodsd          ; load current value
cmp edx, eax
jae X2         ; value is not greater or equal
mov edx, eax   ; set new greatest value
X2: loop X1        ; decrement ECX and loop if greater than 0
mov max1, edx  ; set variable 'max1' to largest value in EDX
end start

当然,这段代码不包括任何输出或退出代码。
但它可以在调试器中工作。

相关内容

  • 没有找到相关文章

最新更新