[求助]学了王爽的《汇编语言》,有个小问题请教大家
学了王爽的汇编语言许久,今天终于能往屏幕上输出点东西了,汗。做了实验十第一题,感觉题目有点怪,居然用cl存储字体颜色,但又要用cx来判断字符串结束,所以只好在子程序循环中把cx再次入栈(子程序开始前就入了一次了)总是感觉很怪。。。我觉还是我编得不好。把程序贴出来大家帮我看看:题目:设计一个子程序
名称:show_str
功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串。
参数:(dh)=行号,(取值范围0-24),(dl)=列号(取值范围0-79),(cl)=颜色,ds:si指向字符串首地址
my code:
assume cs:code
data segment
db 'welcome to masm!',0
data ends
code segment
start: mov dh,8 ;给各参数赋值
mov dl,3
mov cl,0cah
mov ax,data
mov ds,ax
mov si,0
call show_str
mov ax,4c00h
int 21h
show_str: push ax ;题目要求的子程序
push bx
push cx ;cx第一次入栈
push es
push di
push si
mov ax,0b800h ;以下代码为定位要显示的行,列
mov es,ax
mov ah,0
mov al,0a0h
mul dh
mov bx,ax
mov ah,0
mov al,2
mul dl
mov di,ax
to_show: mov ch,ds:[si] ;to_show段处理写要写处显存的字符串,结束条件为遇到字符串后面的0
push cx ;cx第二次入栈,不入栈下一次就没法用cx判断是否继续循环了
mov cl,0
jcxz ok
pop cx
mov es:[bx+di],ch
mov es:[bx+di+1],cl
inc si
add di,2
jmp short to_show
ok: pop cx ;好多的pop,push...
pop si
pop di
pop es
pop cx
pop bx
pop ax
ret
code ends
end start
调试通过。但总感觉太繁琐,另外还有个问题,子程序运行之前有必要把所有用到的寄存器都入栈吗?包括在外部赋值的
[此贴子已经被作者于2007-11-4 23:17:44编辑过]