第十章 实验十 练习1
; 子程序描述
; 名称:show_str
; 功能:指定位置,用指定颜色,显示一个用0结束的字符串
; 参数:(dh) = 行号(0--24),(dl) = 列号(0--79)
; (cl) = 颜色,ds:si 指向字符串的首地址
; 返回:无
assume cs:code, ds:data data segment db 'Welcome to masm', 0 data ends code segment start: mov ax, data mov ds, ax mov dh, 8 mov dl, 3 mov cl, 2 mov si, 0 call show_str mov ah, 01h ; 不是mov ax, 01h int 21h mov ax, 4c00h int 21h show_str: push ax push bx push cx push dx push es ; 计算好字串开始显示的地址Y = 160*(行数-1) + 列数*2-2, B800 : Y ; 循环将参数里的字串写进显卡内存,并检测到0就返回 ; bx = 160*(行数-1) sub dh, 1 mov al, 160 mul dh mov bx, ax ; bx 为根据行数算出来的偏移值 ; ax = 列数*2-2 ;mov bl, dl mov al, 2 mul dl sub ax, 2 ; 根据列数算出来的偏移值 add bx, ax ; 行数和列数的和存在bx中了 mov ax, 0b800h mov es, ax mov dl, cl ; 保存字体颜色属性 mov ch, 0 s_show_str: mov cl, ds:[si] mov es:[bx], cl jcxz ok_show_str mov es:[bx+1], dl inc si add bx, 2 jmp short s_show_str ok_show_str: pop es pop dx pop cx pop bx pop ax ret code ends end start
颜色属性里2 (00000010代表绿色字体) 66代表红底绿字。
记得 :现场保护的目的是调用子程序之后,能够返回主程序继续执行.因此要对子程序中用到的寄存器,堆栈进行必要的保护.
现阶段 子程序中用到的寄存器最好全入栈 。