【问题标题】:Why am I getting these errors in my assembly code (Option casemap: none)?为什么我的汇编代码中出现这些错误(选项 casemap:无)?
【发布时间】:2020-06-15 02:55:24
【问题描述】:

我正在使用GUI Turbo Assembler(Windows 的 Turbo Assembler GUI 环境,生成在 DOSBox 中运行的 DOS 程序)编写汇编代码。当我运行程序时,汇编器给出了这个错误:

x.asm 错误 x.asm(3) 非法指令

第 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

【问题讨论】:

  • 应该是.option 之前? (只是猜测)
  • @Eraklon :不,在 MASM 和 TASM 语法中,option 是一个前面没有 : 的指令
  • @Michael Petch 我尝试写 (.data) ,但没有帮助,也许你知道另一个问题?)
  • @Michael Petch 我删除它并尝试运行,但也有错误组装文件:x.asm 错误消息:无警告消息:无通过:1 剩余内存:467k 从 - C:\ 构建可执行文件Users\Admin\Desktop\x.obj,使用开关:'/3 /x /v' Turbo Link 版本 7.1.30.1。版权所有 (c) 1987, 1996 Borland International 致命:模块 X.ASM 中的错误对象文件记录靠近模块文件偏移量 0x0000013E
  • @Michael Petch 汇编文件:x.asm 错误消息:无 警告消息:无通过:1 剩余内存:467k 从 - C:\Users\Admin\Desktop\x.obj 构建可执行文件,使用开关:'/3 /x /v' Turbo Link 版本 7.1.30.1。版权所有 (c) 1987, 1996 Borland International 致命:模块 X.ASM 中的错误对象文件记录靠近模块文件偏移量 0x0000013E 类似这样的东西

标签: assembly dos x86-16 tasm


【解决方案1】:

根据change logs,直到 TASM 5 才引入 OPTION 关键字。 GUI Turbo Assembler 当前使用 TASM 4.1。您不需要 OPTION CASEMAP 功能,因为您的代码对代码中的标签使用所有相同的大小写。解决方法是删除:

option casemap:none

由于 GUI Turbo Assembler 的目标是运行 DOS 程序,因此您需要进行更改:

.model flat,stdcall

类似于:

.model small,stdcall

在 DOS 中,内存模型可以是 smallmediumcompactlargehugeflat 不适用于 DOS 程序。在 GUI Turbo Assembler 环境下使用flat 会导致链接器错误。

对于 DOS,您还需要添加一个堆栈并指定其大小。这样的事情应该可以工作:

.stack 256          ; Set stack size to 256 bytes

【讨论】:

  • 非常感谢))
猜你喜欢
  • 1970-01-01
  • 2016-01-28
  • 1970-01-01
  • 1970-01-01
  • 2011-12-27
  • 2014-03-24
  • 1970-01-01
  • 2016-07-10
相关资源
最近更新 更多