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

16位TASM程序编译错误求助:(a*b+c*d)/(a-d)求值程序问题

解决你的16位TASM表达式计算程序编译错误

我帮你排查了代码里的语法问题,这些是导致编译失败的核心原因,一步步来修正:

1. ASSUME语句的语法错误

你的ASSUME行多写了冗余的SEGMENT关键字,而且SS段没有指定合法的段名:

ASSUME CS:SEGMENT MyCode, DS:SEGMENT MyCode, SS:SEGMENT

正确写法要去掉多余的SEGMENT,并给SS指定和CS/DS一致的段名(因为是COM风格程序,所有段共用一个):

ASSUME CS:MyCode, DS:MyCode, SS:MyCode

2. 操作数类型匹配的逻辑优化(避免潜在结果错误)

原代码里用BYTE PTR c读取16位变量c,只会取低8位值,若后续c的数值超过255,结果就会出错。应该直接把c加载到16位寄存器,同时调整计算逻辑确保16位结果的正确累加:

修正后的完整代码

MyCode SEGMENT
ORG 100h
ASSUME CS:MyCode, DS:MyCode, SS:MyCode
Start: jmp Beginning
a DB 20
b EQU 10
c DW 5
d = 3
Result DB ?
Beginning:
; 计算 a*b,结果暂存到dx
mov al, a
mov bl, b
mul bl          ; ax = a*b(20*10=200)
mov dx, ax

; 计算 c*d,结果累加到dx
mov ax, c       ; ax = c(5)
mov bl, d       ; bl = d(3)
mul bl          ; ax = c*d(5*3=15)
add dx, ax      ; dx = a*b + c*d(200+15=215)

; 计算 a-d,结果存到bl作为除数
mov al, a
sub al, d       ; al = 20-3=17
mov bl, al

; 执行除法,商存入Result
mov ax, dx      ; ax = 被除数215
div bl          ; al = 215/17=12,ah=余数11
mov Result, al

mov ax, 4C00h
int 21h
MyCode ENDS
END Start

额外说明

修正后的代码既解决了编译语法错误,也保证了逻辑正确性——哪怕c是大于255的16位数值,也能正确完成计算。另外用div bl时,被除数是16位的ax,商存在8位的al里,刚好匹配你定义的8位Result变量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:24:34