为什么我的汇编代码中会出现这些错误(选项案例图:none)?
Why am I getting these errors in my assembly code (Option casemap: none)?
我正在使用 GUI Turbo Assembler(用于 Windows 的 Turbo 汇编器 GUI 环境编写汇编代码,它生成的 DOS 程序在 DOSBox 中 运行)。当我 运行 程序时,汇编程序给出了这个错误:
x.asm Error x.asm(3) Illegal instruction
第 3 行是 option casemap: none
。我的代码是:
.586
.model flat,stdcall ;
option casemap:none ; Line that is giving an error
.DATA ;
x db 2 ;
y db 1
z db 1
.data?
a db ? ;
b db ? ; b=2
c db ? ; c=2
d db ? ; d=2
e db ? ; e=23,5
f db ? ; f=4
g db ? ; g=-18,5
.code ;
beg: ;
mov ah,x ; AH:=x
mov bh,z ; BH:=z
imul bh ; AH:=xz:=2
mov b,ah ; b:=2
mov ah,x ; AH:=x
mov ch,y ; CH:=y
idiv ch ; AH:=AH/CH:=x/y:=2
mov ch,ah ; CH:=2
mov c,ch ; c=2
mov ah,y ; AH:=y
mul ah ; AH=1^2=1
mov bh,z ; BH:=z
imul bh ; AH:=yz:=1
mov ch,x ; CH=x
imul ch ; AH=AHCH=1x=2
mov d,ah ; d=2
mov AH,45 ; AH=45
mov BH, d ; BH=2
idiv BH ; AH=45/2=22,5
mov e, AH ; e=22,5
mov ah,b ; AH=b
mov ch,c ; CH=c
add ah,ch; AH=b+c=2+2=4
mov f, ah; AH=f
mov ah,f ; AH=f
mov ch, e ; CH=e
sub ah,ch; AH=4-22,5=-18,5
mov g,ah ; g=-18,5
mov ah,g ; AH=g
mov ch,5 ; CH=5
sub ah,ch; AH=-18,5-5=-23,5
mov a,ah ; a=AH=-23,5
end beg
根据 change logs,直到 TASM 5 才引入 OPTION
关键字。 GUI Turbo Assembler 当前使用 TASM 4.1。您不需要 OPTION CASEMAP
功能,因为您的代码对代码中的标签使用了所有相同的大小写。解决方法是删除:
option casemap:none
由于 GUI Turbo 汇编程序面向 运行 DOS 程序,您需要更改:
.model flat,stdcall
类似于:
.model small,stdcall
在 DOS 中,内存模型可以是 small
。 medium
、compact
、large
和 huge
。 flat
不适用于 DOS 程序。在 GUI Turbo Assembler 环境下使用 flat
将导致链接器错误。
对于 DOS,您还需要添加堆栈并指定其大小。这样的事情应该有效:
.stack 256 ; Set stack size to 256 bytes
我正在使用 GUI Turbo Assembler(用于 Windows 的 Turbo 汇编器 GUI 环境编写汇编代码,它生成的 DOS 程序在 DOSBox 中 运行)。当我 运行 程序时,汇编程序给出了这个错误:
x.asm Error x.asm(3) Illegal instruction
第 3 行是 option casemap: none
。我的代码是:
.586
.model flat,stdcall ;
option casemap:none ; Line that is giving an error
.DATA ;
x db 2 ;
y db 1
z db 1
.data?
a db ? ;
b db ? ; b=2
c db ? ; c=2
d db ? ; d=2
e db ? ; e=23,5
f db ? ; f=4
g db ? ; g=-18,5
.code ;
beg: ;
mov ah,x ; AH:=x
mov bh,z ; BH:=z
imul bh ; AH:=xz:=2
mov b,ah ; b:=2
mov ah,x ; AH:=x
mov ch,y ; CH:=y
idiv ch ; AH:=AH/CH:=x/y:=2
mov ch,ah ; CH:=2
mov c,ch ; c=2
mov ah,y ; AH:=y
mul ah ; AH=1^2=1
mov bh,z ; BH:=z
imul bh ; AH:=yz:=1
mov ch,x ; CH=x
imul ch ; AH=AHCH=1x=2
mov d,ah ; d=2
mov AH,45 ; AH=45
mov BH, d ; BH=2
idiv BH ; AH=45/2=22,5
mov e, AH ; e=22,5
mov ah,b ; AH=b
mov ch,c ; CH=c
add ah,ch; AH=b+c=2+2=4
mov f, ah; AH=f
mov ah,f ; AH=f
mov ch, e ; CH=e
sub ah,ch; AH=4-22,5=-18,5
mov g,ah ; g=-18,5
mov ah,g ; AH=g
mov ch,5 ; CH=5
sub ah,ch; AH=-18,5-5=-23,5
mov a,ah ; a=AH=-23,5
end beg
根据 change logs,直到 TASM 5 才引入 OPTION
关键字。 GUI Turbo Assembler 当前使用 TASM 4.1。您不需要 OPTION CASEMAP
功能,因为您的代码对代码中的标签使用了所有相同的大小写。解决方法是删除:
option casemap:none
由于 GUI Turbo 汇编程序面向 运行 DOS 程序,您需要更改:
.model flat,stdcall
类似于:
.model small,stdcall
在 DOS 中,内存模型可以是 small
。 medium
、compact
、large
和 huge
。 flat
不适用于 DOS 程序。在 GUI Turbo Assembler 环境下使用 flat
将导致链接器错误。
对于 DOS,您还需要添加堆栈并指定其大小。这样的事情应该有效:
.stack 256 ; Set stack size to 256 bytes