为什么我的汇编代码中会出现这些错误(选项案例图: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 中,内存模型可以是 smallmediumcompactlargehugeflat 不适用于 DOS 程序。在 GUI Turbo Assembler 环境下使用 flat 将导致链接器错误。

对于 DOS,您还需要添加堆栈并指定其大小。这样的事情应该有效:

.stack 256          ; Set stack size to 256 bytes