You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TASM执行tasm /zi编译报Operand types do not match,求代码修改方法

报错原因与修改方案

你的报错Operand types do not match出在mov bx,d这一行,具体修改点如下:

  • 修正变量d的定义与读取不匹配问题
    你题目说明d是word类型,但代码里定义为d dd 4(dd是双字32位),导致16位寄存器bx无法直接接收32位变量的值,引发类型不匹配报错。如果你确认d为word类型,直接将d的定义改为d dw 4即可;如果确实需要d为双字,将报错行改为mov bx, word ptr d,手动指定读取d的低16位存入bx。
  • 补充DS段寄存器初始化代码
    程序启动时没有给DS赋值,直接读取数据段的变量会拿到错误值,在start:标签下第一行添加以下代码:
mov ax, data_
mov ds, ax
  • 可选优化:代码中所有注释的分号前建议加空格,避免部分旧版TASM识别异常,比如把mov bl,2;改为mov bl,2 ;

修改后可正常编译运行的完整代码

ASSUME cs:text_,ds:data_
data_ SEGMENT
a db 2
d dw 4 ; 修正为word类型,符合题目要求
res dd ?
data_ ENDS

text_ SEGMENT
start:
; 新增DS初始化
mov ax, data_
mov ds, ax
mov bl,2 ;
mov al,a ;
imul bl ; ax=2*a
mov bx,d ; bx=d,现在d是word类型,类型匹配
sub bx,ax ; bx=d-2*a
mov ax,5 ;
imul bx ; dx:ax = 5*(d-2a)
sub ax,1 ;
sbb dx,0 ; dx:ax = 5*(d-2a)-1
mov bx,300 ; 
mov cx,0 ; cx:bx = 300
sub bx,ax ; 
sbb cx,dx ; cx:bx = 300-[5*(d-2*a)-1]
mov word ptr res+0,bx ; 
mov word ptr res+2,cx ;
mov ax, 4c00h
int 21h
text_ ENDS

END start

修改完成后重新执行tasm /zi 文件名即可消除编译报错。

内容的提问来源于stack exchange,提问作者Zotta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 00:36:03