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

