子程序如何编写?为什么要用PUSH和POP指令?
时间: 2024-05-22 14:12:47 浏览: 11
子程序是一段独立的代码,可以被主程序调用并多次重复使用。在汇编语言中,子程序可以通过跳转指令(如CALL)来实现。
为了正确地保存和恢复子程序执行前的状态,我们需要使用PUSH和POP指令。PUSH指令将一个寄存器或内存中的值压入栈中,而POP指令则将栈中的值弹出并存储到指定的寄存器或内存中。在调用子程序前,我们需要将当前程序执行的状态(如寄存器值、程序计数器等)压入栈中保存。在子程序执行完毕后,我们需要使用POP指令将之前保存的状态恢复,以便程序能够继续正常执行。
因此,使用PUSH和POP指令可以有效地保存和恢复程序执行状态,从而保证程序的正确性和稳定性。
相关问题
将以上代码改为子程序,要求使用call指令和ret指令
下面是将程序改写为子程序的代码,使用了call指令和ret指令来调用和返回子程序:
```
assume cs:code
data segment
db 'welcome to masm!'
db 2,36,113 ;颜色
data ends
code segment
start:
mov ax,data
mov ds,ax
call print_string
mov ax,4c00h
int 21h
print_string:
mov bx,0
mov di,16
mov ax,0b800h
mov es,ax
mov si,16012+352
mov cx,3
print_loop:
mov ah,ds:[di]
push cx
mov cx,16
print_char_loop:
mov al,ds:[bx]
mov es:[si],ax
add si,2
inc bx
loop print_char_loop
pop cx
add si,128
inc di
loop print_loop
ret
code ends
end start
```
在这个版本的程序中,我们将输出字符串的逻辑封装在了一个名为`print_string`的子程序中。在`start`标签下,我们先将数据段的地址存储到DS寄存器中,然后使用call指令调用子程序。子程序执行结束后,使用ret指令返回到调用它的地方。最后,使用int 21h调用DOS中断结束程序的执行。
汇编在某子程序的开始处要保护AX,BX,CX,DX四个寄存器信息,在子程序结束时要恢复这四个寄存器信息。例如保护现场程序为: PUSH AX PUSH BX ;保护现场 PUSH CX PUSH DX …… { }恢复现场 试写出恢复现场时的指令序列。
恢复现场时的指令序列应该与保护现场时的指令序列相反,即:
```
POP DX ; 恢复现场
POP CX
POP BX
POP AX
```
其中,每个 POP 指令都会将栈顶的值弹出并存放到相应的寄存器中,从而恢复保护现场时保存的值。需要注意的是,恢复现场的指令序列应该位于子程序结尾处,以确保在子程序返回之前,所有需要保护的寄存器都已经得到恢复。
相关推荐
![](https://img-home.csdnimg.cn/images/20210720083646.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)