汇编语言--王爽--实验9 子程序

时间:2022-08-07 01:15:46

今天对于这个程序,研究了一下午。其他高级语言在调用函数时候都是系统帮助暂存主调函数的信息,汇编则把这些实现描述出来了。



assume cs:code



data  segment
                   db 'welcome to masm!',0
data ends


code segment


start:            mov dh,8
                   mov dl,3
                   mov cl,2
                   mov ax,data
                   mov ds,ax
                   mov si,0
                   call show_str

                    mov ax,4c00h
                     int 21h
show_str:
                   push dx
                   push cx
                   push ax
                   push si
                   push ds


                   mov ax,0b800h   ;显存地址从b800开始
                   mov es,ax

                   dec dh       ;0~7 第八行则减去1
                   mov ah,0
                   mov al,160   ;一行80个字符加上80个属性数据
                   mul dh
                   mov bx ,ax

                   dec dl       ;第三列则减去1
                   mov  ah,0  
                   mov al,2   ;每一列两个字节
                   mul dl      
                   add bx,ax

                   mov al,cl

           x:      mov ch,0 
                    mov cl,ds:[si]
                   jcxz ok
                   mov es:[bx],cl
                   mov cl,al
                    mov es:[bx+1],cl

                  add bx,2 

                 inc si
                 jmp  x

          ok: 
                pop ds
                pop si
                pop ax
                pop cx
                pop dx

                  ret
code ends

end start 

当程序运行到call,进入子程序后,先将主程序的所有寄存器先保存起来(其实对于这个程序不保存也可以运行),保存的目的是:因为寄存器都是有限的,如果子程序中用到主程序中的数据,可以保证主程序中的数据不被改变