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
相关产品推荐
相关产品推荐

