为什么汇编程序要将AX清零后压栈?

DATA SEGMENT
MESS1 DB 'COMPUTER$'
DATA ENDS
EXTRA SEGMENT
MESS2 DB 8 DUP(?)
EXTRA ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:EXTRA
MAIN PROC FAR
START:PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV AX,EXTRA
MOV ES,AX
LEA SI,MESS1
LEA DI,MESS2
MOV CX,8
CLD
REP MOVSB
RET
MAIN ENDP
CODE ENDS
END START

PUSH DS
MOV AX,0
PUSH AX
……
RET
上述指令是配对出现的,和中断调用MOV AX,4C00H/INT 21H功能相似,实现返回DOS系统的操作。
要详细回答这个问题,就要涉及到程序的执行原理:简单来讲,作为DOS程序,每个EXE文件在执行时被看成DOS的一个子程序,所以有子程序的入口,此时EXE文件的入口地址CS值和DS值相同,而IP值等于0,所以前面的PUSH DS相当于CS入栈,而把AX值赋0然后入栈,相当于IP入栈。这样当程序最后再执行RET后,就可以返回原DOS系统了。
温馨提示:内容为网友见解,仅供参考
无其他回答

为什么汇编程序要将AX清零后压栈?
据高人说这是因为程序在DOS中被装载的时候,程序最开始的256个字节是PSP区域(这里面是与系统交互的数据),刚开始DS自动指向PSP区域开头。而PSP区域一开头的地方存放着返回DOS系统的指令。所以以下代码完成返回DOS的功能 push ds mov ax,0 push ax ...ret ...

汇编考试的一些问题:
汇编语言编写的程序,是在 DOS 环境下运行的。运行结束后,还应该返回 DOS。在程序的一开始,写入这些指令,目的是为了使用 RET 指令退出程序,返回 DOS。但是,现在多用 MOV AH, 4CH INT 21H 退出程序,上述代码,就没有用了。

汇编语言的程序开始都有 PUSH DS MOV AX,0 PUSH AX 这三段有什么作用...
在程序的开始,在堆栈中压入了两次,分别是DS和0;在程序的末尾,使用了RET,就用到了压入的内容,这样就能结束程序,安全的返回DOS。想要弄清这几个操作,就必须了解“磁盘操作系统”,即DOS才行。这已经不是“汇编语言”的内容了。

汇编里的PUSH功能是压栈但为什么要压栈的呢?
因为这些地址都是临时的,所以在栈的出栈和进栈的时候可以动态的进入和删除。调用函数和中断的时候,临时变量和返回地址就暂存在栈中。函数调用完了,临时变量和返回地址就从栈删除了。所以栈一般来说是临时变量,调用函数会自动回收内存。这就是PUSH 和 POP 的功能了。相当于一个暂时保存数据的地方。 ...

汇编中遇到的程序题看不懂
PUSH AX ;PUSH CX ;压栈这些数据 PUSH SI ;即保存 目的怕数据被修改因为 ;下 面 可 能用到 LEA SI,ARY ;将ary的偏移地址放到si中,使si指向ary MOV CX,COUNT ;cx 中放的是循环的次数 XOR AX,AX ;很常用的寄存器清零操作 NEXT: ADD AX,[SI] ;SI指向的数...

汇编语言中,出栈后 出栈的那个数值在栈中会被清零吗?
因为这是不必要的,正常使用栈的话,出栈后那个位置的数值对栈没有影响,在栈增长后,那个位置可能会被新的值覆盖掉(即通过Push压栈),所以没有必要清空它。而且,处理器和指令集设计的时候,必然会十分注重效率,不会做多余的事情,清不清零对栈的使用完全没有影响,所以设计师当然也不会让pop做这...

程序开头push ds mov ax,0 push ax 什么意思
这三条是是压栈指令,把返回操作系统的入口压入堆栈,使用这方法,你的程序结束的地方一定有一条返回指令,而MOV AH,4CH INT 20H 这种方法是通过DOS调用返回操作系统,他们的目的相同,只是用的方法不同,所以只要选一个就可以,现在用的比较多是后面一种 ...

用汇编语言怎么表示有参数的函数,比如 fun(int n)
在汇编语言中表示有参数的函数,如fun(int n),主要通过寄存器来传递参数。通常做法是,传参前将原来的寄存器内容压栈,确保不会覆盖函数内部的数据。接着,将函数参数写入寄存器,以便目标函数在运行时直接读取寄存器获取参数。以函数fun(int n)为例,假设我们使用eax寄存器来传递整数n。首先,需要将eax...

请问汇编语言中,当进行压栈操作时,ss会随着sp的改变而改变吗
1、汇编语言中,进行压栈操作,ss段寄存器(ss段选择子)的值不会随sp(ESP\/RSP)的改变而改变。2、在实模式或虚拟8086模式,压栈操作是压入两个字节数据,SP==SP-2.3、在32位保护模式,压栈操作是压入四个字节数据,ESP==ESP-4 4、例如同样是PUSH ES指令,在实模式或虚拟8086模式,SP==SP-...

汇编call指令:
问题在于 没弄清楚 1.call指令2.dword,word。两段代码差别在于第一段的call后面是word ptr ds:[0],而第二段是dword。首先call会把返回地址压栈,导致栈顶指针sp减小,减少量由地址长度定。然后第一段代码压的是word,16位的地址,于是sp-2,第二段dword,32位地址故sp-4。

相似回答