|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 leader4 于 2018-5-17 22:36 编辑
用了一下午才写出来,但不知为何,实际结果却差了一行。
后来查看相关寄存器,发现显存起始地址变成了B80A0,而不是B8000。不知道为什么。。。
个人能力有限,实在不知道原因。所以先记录一下,以后再去排查。
如果有大牛知道原因,还望指点一下。
- ;说明:在指定位置,用指定颜色,显示一个用0结束的字符串。
- ;参数:(dh)=行号(取值范围0~24),(dl)=列好(取值范围0~79),
- ; (cl)=颜色,ds:si指向字符串的首地址
- ;结果:无返回
- ;举例:8行3列处,显示绿字。
- assume cs:code,ss:stack,ds:data
- data segment
- db 'Welcome to masm!',0
- data ends
- stack segment
- dw 8 dup (0)
- stack ends
- code segment
- start: mov dh,8
- mov dl,3
- mov cl,2
- mov si,0
- mov ax,data
- mov ds,ax
- mov ax,stack
- mov ss,ax
- mov sp,16
-
- call show_str
- mov ax,4c00h
- int 21h
- show_str:
- dec dh
- dec dl
- ;计算行号
- mov al,dh
- mov bl,160
- mul bl
- push ax
- ;计算列号
- mov al,dl
- mov bl,2
- mul bl
- push ax
- ;显示位置第一点
- mov bx,8000H
- mov bp,sp
- add bx,[bp]
- add bx,[bp+2]
- mov ax,0b000H
- mov es,ax
- ;向指定内存位置写入数据
- wr: mov al,ds:[si]
- mov es:[bx],al
- mov es:[bx+1],cl
- mov ch,0
- push cx
- mov cl,ds:[si]
- jcxz ok
- pop cx
- inc si
- add bx,2
- jmp short wr
- ok:pop cx
- pop ax
- pop ax
- ret
- code ends
- end start
复制代码 |
|