我正在编写一个简单的程序,使用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行。
我不知道为什么会这样。
你的代码中有几个错误:
-
您正在混合16位和32位代码。指令
.model tiny
通常用于16位DOS.COM
文件,其中所有代码+数据在一个64kb段中。这种方法是古老的,现在已经不使用了。 -
因为您使用了
.386
指令,所以可以假设您想使用32位代码。(反对这种假设的一个有效论据是工具集的选择。这个答案只部分适用于16位代码)。为此,上面的.model
指令应该是.model flat, stdcall
这指定了一个具有STDCALL调用约定的FLAT内存模型,有关这方面的更多信息,请参阅MS。
FLAT
表示线性和平面地址空间,STDCALL
表示特定的调用约定(这与您无关,因为您不进行任何调用)。 -
所以,因为你使用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
当然,这段代码不包括任何输出或退出代码。
但它可以在调试器中工作。