求助:使用TASM 1.4实现整数除法程序(栈警告+无输出问题)
TASM 1.4 整数除法程序实现与问题解决
问题说明
需使用TASM 1.4编写整数除法程序(例:14÷2=7),仅能通过记事本编写,无汇编语言基础,参考YouTube教程无果。现有代码编译时出现Warning: no stack警告,生成的exe运行无任何输出。
现有代码
DATA SEGMENT A DB 9 B DB 6 C DB ? D DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX,DATA MOV DS,AX MOV AX,0 MOV AL,A MOV BL,B DIV BL MOV C,AL MOV D,AH MOV AH,4CH INT 21H CODE ENDS END START
问题分析
no stack警告原因:TASM默认要求程序定义栈段,原代码缺少栈段定义,编译时会触发该警告。虽不影响程序执行,但规范写法需添加栈段。- 无输出原因:原代码仅完成除法计算并将商、余数存入变量,但没有将结果输出到屏幕的逻辑。DOS程序需调用系统中断实现屏幕输出,且数字需转换为ASCII码才能正确显示(比如数字7的ASCII码是
30H+7=37H)。
修改后的完整代码
; 定义栈段,解决no stack警告 STACK SEGMENT STACK DW 100H DUP(?) ; 分配256字节的栈空间 STACK ENDS DATA SEGMENT A DB 14 ; 被除数,可修改为其他8位整数 B DB 2 ; 除数,需确保不为0 C DB ? ; 存储商 D DB ? ; 存储余数 MSG1 DB '商:$' ; 提示文本1 MSG2 DB 0AH,0DH,'余数:$' ; 提示文本2(换行后显示) DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACK START: ; 初始化数据段 MOV AX, DATA MOV DS, AX ; 执行8位除法:AX = AL / BL,商存AL,余数存AH MOV AX, 0 ; 清空AX,确保AH为0(8位除法要求AH=0) MOV AL, A ; AL = 被除数A MOV BL, B ; BL = 除数B DIV BL ; 执行除法:AL = A/B的商,AH = 余数 MOV C, AL ; 商存入变量C MOV D, AH ; 余数存入变量D ; 输出"商:"提示 MOV AH, 09H ; DOS中断功能:输出字符串(以$结尾) LEA DX, MSG1 ; DX指向MSG1的地址 INT 21H ; 输出商(将数字转换为ASCII) MOV AH, 02H ; DOS中断功能:输出单个字符 MOV DL, C ; DL = 商的数值 ADD DL, 30H ; 转换为ASCII码(数字0-9对应ASCII 30H-39H) INT 21H ; 输出"余数:"提示(先换行) MOV AH, 09H LEA DX, MSG2 INT 21H ; 输出余数 MOV AH, 02H MOV DL, D ADD DL, 30H INT 21H ; 程序退出 MOV AH, 4CH INT 21H CODE ENDS END START
编译与运行步骤
- 把上述代码复制到记事本,保存为
divide.asm(注意保存类型选“所有文件”,编码选ANSI) - 打开命令提示符,切换到文件所在目录,执行以下命令:
- 编译:
tasm divide.asm - 链接:
tlink divide.obj - 运行:
divide.exe
- 编译:
运行后会在屏幕上显示商和余数,比如示例中14÷2会显示:
商:7
余数:0
内容的提问来源于stack exchange,提问作者Lucash
相关产品推荐
相关产品推荐

