今天对于这个程序,研究了一下午。其他高级语言在调用函数时候都是系统帮助暂存主调函数的信息,汇编则把这些实现描述出来了。
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,进入子程序后,先将主程序的所有寄存器先保存起来(其实对于这个程序不保存也可以运行),保存的目的是:因为寄存器都是有限的,如果子程序中用到主程序中的数据,可以保证主程序中的数据不被改变