|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 小咒 于 2013-8-13 01:58 编辑
课题要求:
名称:show_str
功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串。
参数:(dh)=行号(取值范围0~24);
(dl)=列号(取值范围0~79);
(cl)=颜色;
ds:si指向字符串的首地址。
返回:无。
想问一个问题,首先我们的要求是一个show_str的子程序来控制指定位置指定颜色的写入,0来表示结束
在课题的答案中会把ax bx si es进行一个push入栈,当子程序结束后把他们pop出栈然后再进行一个ret
这个操作我就不是很明白为什么这里要把这几个值push入栈呢?
自己代码如下:
- assume cs:code,ds:data
- 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
- ;段地址b8000h-b80a0第一行
- show_str:mov ax,0b800h
- mov es,ax;段地址放入es
- mov ax,0a0h;计算行号
- mul dh;计算段地址
- mov bx,ax;段地址放入bx
- mov ax,2h;计算列号
- mul dl;计算列号
- add bx,ax;bx指向偏移地址[行号列号数据]
- mov ah,cl;颜色放入ah
- mov ch,00h
- s:mov cl,[si]
- jcxz s0
- mov al,cl
- mov es:[bx],ax
- inc si
- add bx,2
- jmp s;无条件跳转
- s0:ret;取栈顶值放入ip 返回
- code ends
- end start
复制代码
答案代码:
- assume cs:code,ds:data
- 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
- ;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串。
- ;参数:(dh)=行号(取值范围0~24);
- ; (dl)=列号(取值范围0~79);
- ; (cl)=颜色;
- ; ds:si指向字符串的首地址。
- ;返回:无。
- show_str:
- push ax
- push bx
- push es
- push si
- mov ax,0b800h
- mov es,ax
- mov ax,160
- mul dh
- mov bx,ax ;bx=160*dh
- mov ax,2
- mul dl ;ax=dl*2
- add bx,ax ;mov bx,(160*dh+dl*2)设置es:bx指向显存首地址
- mov al,cl ;把颜色cl赋值al
- mov cl,0
- show0:
- mov ch,[si]
- jcxz show1 ;(ds:si)=0时,转到show1执行
- mov es:[bx],ch
- mov es:[bx].1,al
- inc si ;ds:si指向下一个字符地址
- add bx,2 ;es:bx指向下一个显存地址
- jmp show0
- show1:
- pop si
- pop es
- pop bx
- pop ax
- ret
- code ends
- end start
复制代码
|
|