汇编语言调用子程序前为什么要push ax,之后再pop ax?

;代码段(主程序)
mov ax,wvar
mov cx,4 ;共4位十六进制数
again: rol ax,4
push ax
call htoasc ;调用子程序
mov ah,2
mov dl,al
int 21h ;显示一个字符
pop ax
loop again

push ax ; ax 的数据压入堆栈
pop ax ; 出栈 恢复 ax 数据
调用子程序前为了 保存 ax 的数据 不 受到影响,返回时 恢复原来的数据。
如果子程序不用到 ax 则可以 省去上述操作。
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-06-24
在调用子程序前,ax里有一个值,而且是有用的。
在调用子程序之后,要输出什么结果,有一句mov ah, 2,这里改变了ax里的值。当然,在调用子程序的过程中,可能也改变ax中的值了。
程序希望在调用子程序、打印结果之后,还要用原来的ax值,所以就在调用之前把ax的值存到栈中,之后又恢复ax原来的值。
第2个回答  推荐于2017-09-22
在此段汇编语言程序中,虽然给出的程序不完全,但分析是将wvar这个数据以16进制字符方式从高位开始输出到屏幕上。
mov ax,wvar ;读取数据到AX
mov cx,4 ;设置循环次数,一个字共4位十六进制数
again: rol ax,4 ;循环左移4次,高4位到低4位,可能是子程序要求的
push ax ;将当前AX只压栈保护,因为下面要用到AX
call htoasc ;调用子程序进行ASCII码转换
mov ah,2 ;准备显示
mov dl,al ;显示刚转换的字符
int 21h ;显示一个字符
pop ax ;回复AX值,以便进行下一位字符转换
loop again ;循环4次,转换、显示4位16进制字符
第3个回答  2012-06-24
堆栈的作用!
=============
假设程序结构如下,用到了AX
-----------------
主程序代码1【假设AX=5】
调用子程序【假设子程序用到了AX,且使的AX=7】
主程序代码2【AX=7,不是5了】

子程序代码
=====================
使用push ax 保存Ax
使用pop ax 恢复AX
再看
-------------------------
主程序代码1【假设AX=5】
调用子程序【先保存AX,用到了AX,且使的AX=7,但恢复AX,AX=5】
主程序代码2【AX=5】

子程序代码
第4个回答  2012-06-24
想要知道 去百度一下吧 (*^__^*) 嘻嘻……

汇编语言用堆栈指令将寄存器AX与SI的内容交换。 PUSH AX PUSH SI...
push AX 先把AX的值入栈 push SI 然后把SI的值入栈 pop AX 是把后压入的SI的值弹到AX pop SI 是把先压入的AX的值弹到SI 是数据的后进先出,不是寄存器的后进先出。这样就可以达到交换寄存器数据的目的。同样,如果不是要达到交换数据的目的,而仅仅是用栈保存寄存器的原值,那么就应该...

汇编语言 push ds sub ax,ax push ax 有什么用~
push ds:将ds寄存器推入堆栈,要再次得到ds的值的时候可以用pop ds,即临时保存一下ds的值 sub ax,ax:用ax-ax,也就是将ax清零 push ax:与push ds相同 顺便说明一下,堆栈是后进先出的,所以,你如果先后执行了push ds和push ax,那么,执行pop命令的时候,就应该先用pop ax,然后再用pop ds ...

汇编语言两条指令 push ax push ds 执行后结果是什么
push ax 这三条语句是为后面的ret做准备,ret即执行pop ip, pop cs,执行完ip的值为0,cs的值为ds。程序转移到程序PSP的起始地址,起始地址的前两个字节放的是int 20指令,用于返回DOS。不过不推荐这样做,现在常用 mov ax 4c00h int 21h;终止程序,返回值为al....

汇编push和pop指令
push指令用于将寄存器中的数据压入栈中,pop指令则用于从栈中弹出数据到寄存器中。具体操作如下:push寄存器:将指定寄存器的内容压入栈顶。pop寄存器:从栈顶弹出数据到指定寄存器中。下面通过一段汇编代码演示栈操作的实现过程,代码使用MASM编辑器进行编写(假设使用了王爽的环境配置)。假设选择10000H至100...

汇编语言中执行 MOV AH,02H INT 21H 后AL的值为什么会改变?急,在线等...
中断后会调用对应中断号的服务程序,在中断服务程序中会使用ax而没有对ax进行现场保护,返回会改变,通常也把函数的返回值放到ax中。所以调用前要对ax进行保护,可以执行前压入堆栈PUSH AX,执行后再弹出POP AX。

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

汇编语言 设AX=2875H BX=34DFH SS=1307H SP=8H 依次执行PUSH AX...
PUSH AX ;sp-2-->sp=6 ,AX不变 PUSH BX ;sp-2-->sp=4 ,BX不变 POP AX ;sp+2-->sp=6 ,根据先入后出,后入先出原则,把上一条指令压入堆栈的值弹出到ax,;即AX=34DFH POP CX ;sp+2-->sp=8 ,把最先压入堆栈的值弹出到CX,即CX=2875H 所以,指令执行完毕后,...

汇编(关于PUSH的SP问题)
PUSH AX 同理SP=SP-2,此时SP=00FCH 物理地址=SS*10H+SP=3000H*10H+00FCH=300FCH CALL L1 调用子程序即过程调用,为了保护现场,会压栈保存断点,段内调用,说明L1的属性为NEAR,只需保存IP,SP=SP-2,但是如果是段间调用则需要保存CS和IP 那么SP=SP-4.不管怎么样,在执行完RET后,要恢复...

请问汇编语言中执行push AX之后会有什么结果?
push ax \/\/ax值入栈 pop ds \/\/此时(ds)=(ax)push 4\/\/4入栈

关于汇编语言和汇编程序
1.push ax push bx pop ax pop bx 可以实现ax,bx互换,可以在debug条件下-p单步执行查看交换过程 2.可以用-E DS:300 0A 0B 0C 0D 0E把数据送入300~304h,注意在debug中执行上述指令必须等给mov ax,@data,mov ds,ax执行后再存入数据否则得不到正确的debug结果 MOV AX , BX ;把bx...

相似回答