王爽《汇编语言》课后练习题
显示字符串子程序
2017.4.23
;name :showStr
;fuction : 在指定的位置,用指定的颜色,显示一个用0结束的字符串
;参数:(dh)=行号(取值范围0-24),(dl)=列号(取值范围0-79), (cl) = 颜色,ds:si指向字符串的首地址
;test Code : 在屏幕的8行3列,用绿色显示data段中的字符串
;eg:->init
; mov dh,8 8行
; mov dl,3 3列
; mov cl,2 字符属性 2->黑底绿色无高亮无闪烁
; mov ax,data
; mov ds,ax 字符串段地址
; mov si,0 字符串起始地址
;=====代码主体=======
assume cs:codesg
stack segment
db 128 dup(?)
stack ends
data segment
db 'Hello World',0
data ends
codesg segment
start:
`mov ax,stack
mov ss,ax
mov sp,80H
mov dh,8 ;8行
mov dl,3 ;3列
mov cl,2 ;字符属性 2->黑底绿色无高亮无闪烁
mov ax,data
mov ds,ax ;字符串段地址
mov si,0 ;字符串起始地址
call showStr ;调用显示子程序
mov ax,4c00h
int 21h` ;返回Dos
; *********************************************
showStr:
push dx
push cx
push es
push bx
push si
push di
call showStrInit
mov dh,cl ;由dx = dh + dl ; dh = 颜色 dl = 字符
showStringMain:
mov cx,0
mov cl,ds:[si]
jcxz showStrRet
mov dl,cl
mov es:[di],dx
add di,2
inc si
jmp showStringMain
showStrInit:
mov al,160
mov bl,dh
mul bl
mov di,ax ;得到行数 , 最终用es:di指向显示区域
mov al,2
mov bl,dl
mul bl
add di,ax
mov ax,0b800h
mov es,ax
ret
showStrRet:
pop di
pop si
pop bx
pop es
pop cx
pop dx
ret
; *********************************************
codesg ends
end start
end