关于堆栈段的问题[汇编语言]

SleepCoding 2020-10-04 11:57:22
有些汇编程序答案里面没有定义 STACK SEGMENT
而有些程序答案里面却定义了
去网上搜索(得到的答案不尽人意-->有些说是调用int n时需要定义堆栈段,问题是有些题调用了int n却没有定义堆栈段,所以就很懵逼)

比如说这个题:
编程实现将键盘连续输入的小写字母用大写字母显示出来,中间用'-'分隔,当输入非小写字母时程序停止处理
参考答案:
STACK SEGMENT STACK ;定义堆栈段
DB 100DUP(?) ;开辟 100 个存储单元
STACK ENDS ;堆栈段结束

CODE SEGMENT ;定义代码段
ASSUME CS:CODE,SS:STACK
START: MOV AH,01H ;1 号调用,从键盘输入一字符存入 AL
INT 21H ;输入并回显
MOV BL,AL ;保存从键盘输入字符
CMP AL,’a’ ;与“a”的 ASCII 码比较
JB L3 ;低于“a”的 ASCII 码,转 L3(退出)。
CMP AL,’z’ ;与“z”的 ASCII 码比较
JA L3 ;高于“a”的 ASCII 码,转 L3(退出)。
SUB AL,20H ;将 AL 中字符的 ASCII 码减去 20H 变成大写字母。
MOV BL,AL ;保存结果
MOV DL,‘-’ ;显示字符‘-’送 DL
MOV AH,02H ;2 号调用,在显示器上显示字符‘-’。
INT 21H ;显示‘-’
MOV DL,BL ;结果(大写字母)送 DL。
MOV AH,02H ;2 号调用,在显示器上显示 DL 中的内容(大写字母)。
INT 21H ;显示大写字母
MOV DL,20H ;空格送 DL。()
MOV AH,02H ;2号调用,在显示器上显示DL中的内容(大写字母) 。
INT 21H ;显示空格(使两结果用空格隔开)
JMP START ;不是“回车符”,转 START(继续)
L3: MOV AH,4CH ;是“回车符”,设置返回 DOS 功能码。
INT 21H ;返回 DOS
CODE ENDS ;代码段结束
END START ;程序汇编结柬


所以到底什么情况下需要定义STACK SEGMENT
...全文
262 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
zara 2020-10-05
  • 打赏
  • 举报
回复 2
一般的小程序,不对内存有管理要求的,不需要设置堆栈,因为 dos16环境有个默认堆栈的设置,就是在程序所在 64K段的末尾,你用 debug加载个不设堆栈段的程序后,看看 ss:sp 的指向就知道了。程序小,又没有内存方面操作(释放、重新申请等),这部分内存就不会被影响到,所以可以给堆栈使用。如果自己设置了堆栈段,就要给大些,有些示例代码自己一堆的 push指令,堆栈却只给 16字节,无疑是自寻烦恼;实际会用到多少,可以运行下,在程序结束前停下来看看堆栈区有多少被使用过。
SleepCoding 2020-10-04
  • 打赏
  • 举报
回复
抱歉了,因为着急,答案的缩进没有设置好,sorry~~~~~~~~~~

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧