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

如题所述

第1个回答  2017-08-16
据高人说这是因为程序在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 的功能了。相当于一个暂时保存数据的地方。 ...

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

汇编语言中,出栈后 出栈的那个数值在栈中会被清零吗?
因为这是不必要的,正常使用栈的话,出栈后那个位置的数值对栈没有影响,在栈增长后,那个位置可能会被新的值覆盖掉(即通过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...

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

帮忙看看这段汇编代码意思
前一句已经把SPSR读到R0中去了,这句话的意思是把R0中的内容压栈,SP带个叹号,说明是回写指令。由于SPSR中的内容智能用MRS和MSR指令进行读写,所以要先用MRS读出来才能将其保存。第一句R0已经保存了,这里就不算是覆盖了,因为后面R0可以恢复的 5:这句指令时先变址不回写指令,意思是,如果R0中...

汇编中如何将中文压栈
比如push 0x00216F6C 是压如一个地址啊 那也就是说你的“Test Hello!” 字符串是放在这个地址的(如果是的话)你直接去看看这个地址里面的ASCII码不就行了 要改成中文不就是把相应的ASCII码换成中文的ASCII码得了

相似回答
大家正在搜