请问高手...

Kernel_Don 2003-03-11 04:47:15
在学汇编,发现书中有一部分的汇编语言程序的开头有如下三行语句:

PUSH DS
MOV AX,0
PUSH AX

这三行语句的作用是什么?
似乎是用于保护当前状态,但为什么在程序结束时没有用POP出栈?
又为什么有些程序有这三行而有些程序没有?
...全文
48 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
clumsy 2003-03-12
  • 打赏
  • 举报
回复
psp 是程序段前缀(Program Segment Prefix)的缩写.
执行指令RETF不是程序刚开始是压栈的0c6a弹到ds, 而是此时堆栈中的0c6a:0000弹出到cs:ip中, 从而将程序的运行转移到那里的int20h指令上, 完成"程序结束并返回到dos".

Format of PSP:
Offset Size Description
00h 2 BYTEs program exit point (INT 20h instruction)
02h WORD memory size in paragraphs
04h BYTE unused
05h 5 BYTEs CP/M entry point (FAR jump to 000C0h)
BUG: (DOS 2+) PSPs created by INT 21/AH=4Bh point at 000BEh
06h WORD CP/M compatibility--size of first segment for .COM files
0Ah DWORD terminate address (old INT 22h)
0Eh DWORD break address (old INT 23h)
12h DWORD critical error handler (old INT 24h)
16h WORD parent PSP segment
18h 20 BYTEs DOS 2+ open file table, FFh = unused
2Ch WORD DOS 2+ environment segment (see below)
2Eh DWORD DOS 2+ process's SS:SP on entry to last INT 21 call
32h WORD DOS 3+ max open files
34h DWORD DOS 3+ open file table address
38h DWORD DOS 3+ pointer to previous PSP (default FFFFFFFFh in 3.x)
used by SHARE in DOS 3.3
3Ch 20 BYTEs unused by DOS versions <= 4.01
50h 3 BYTEs DOS function dispatcher (FAR routine)--CDh 21h CBh
53h 9 BYTEs unused
5Ch 16 BYTEs FCB 1 (see AH=0Fh), filled in from first commandline
argument (when opened, overwrites following FCB)
6Ch 20 BYTEs FCB 2 (see AH=0Fh), filled in from second commandline
argument (when opened, overwrites part of command tail)
80h 128 BYTEs command tail / default DTA buffer
command tail is BYTE for length of tail, N BYTEs for the tail,
followed by a BYTE containing 0Dh
Kernel_Don 2003-03-11
  • 打赏
  • 举报
回复
在debug中调试了一下,
发现刚装入内存时DS=0C6A
0C6A:0000 正是CD20 即int 20
有点明白了。
再问一下
psp是什么意思?
执行指令RETF是不是先把在程序开始时压入堆栈的0C6A再弹
出到DS中,然后再跳到0C6A:0000执行?
clumsy 2003-03-11
  • 打赏
  • 举报
回复
程序开始初的那三条指令是和程序结尾处的 RETF (如果已经定义过程为FAR的话, 可以直接用 RET) 配合使用的, 这样 RETF 指令就会转移到 DS:0000 处, 那里在程序刚载入内存时是 psp 的开始, 有一条指令:
CD 20 int 20
通过 int 20h 中断返回到 dos 的.

不过, 现在一般不建议使用这样的方法返回到dos. 现在一般用:
mov AX, 4c??h ; 其中的 ?? 就是程序的的结束返回代码
int 21h
可以通过程序的结束返回代码告诉调用者本程序的运行状况, 这个在批处理和用作overlay程序的时候作用比较突出. 一般的程序也就设 ?? 为 00 了.
Kernel_Don 2003-03-11
  • 打赏
  • 举报
回复
DATA SEGMENT
STRING DB 'Hello world!$'
DATA ENDS
STACK SEGMENT PARA STACK 'STACK'
DB 100 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
MAIN PROC FAR
PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET STRING
MOV AH,9
INT 21H
RET
MAIN ENDP
CODE ENDS
END MAIN

---------------------
以上是书中的一个例子,作用是用09号功能调用输出显示一指定字符串
看了两本汇编的书,有部分程序的头三行都是这样
LittleStar 2003-03-11
  • 打赏
  • 举报
回复
看不出意义所在,要把整个程序贴出来看一下才清楚。
mov ax,0 ;ax清0
push ax ;然后在保存ax(ax=0)这个没必要。
;下次想用的时候没必有pop ax,只要mov ax,0不就行了。
chougoushi 2003-03-11
  • 打赏
  • 举报
回复
关注
内容概要:本文详细介绍了一种基于Simulink仿真实现的单相交流电压控制器,该控制器采用两个背靠背连接的晶闸管结构,用于实现对交流电压的有效调节。通过构建完整的系统仿真模型,深入阐述了晶闸管的触发控制机制与移相触发原理,实现了对输出电压幅值的精确控制。文中系统分析了控制器在不同负载条件下的动态响应与稳态性能,验证了其在交流调压应用中的可行性与可靠性,涵盖了从理论建模、控制策略设计到仿真验证的全过程,具有较强的工程实践指导意义和教学参考价值。; 适合人群:电气工程、自动化、电力电子等相关专业的高校学生、科研人员及从事电力系统控制与仿真工作的工程师;具备电路理论基础和Simulink仿真操作经验的技术人员。; 使用场景及目标:①深入理解晶闸管在交流调压中的工作机理与相位控制方法;②掌握基于Simulink的电力电子系统建模与仿真技术;③应用于课程设计、科研项目或工业场合中对交流电压进行精确调控的技术开发与方案验证。; 阅读建议:建议结合Simulink模型同步运行与调试,重点关注触发角与输出电压之间的关系曲线,通过调整参数观察系统响应变化,强化对控制规律的理解与实际应用能力。

21,499

社区成员

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

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