马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 苏门答腊鸭 于 2014-4-13 08:31 编辑
说说我的理解步骤:就是先找出不变的,然后再找变化的。哪些是不变的?显存基址“B800”不变,每行相对于显存基址的偏移地址(这里我把它叫做“行基址”)不变。哪些是变的?就是列中字符地址是要变的。
确定了不变的和变化的接下来就是算出“行基址”和列字符相对于“行基址”的偏移地址:mov ax,0 ;要用到的寄存器先清零
mov bx,0
mov di,0
mov al,0A0h ;由于显存区域每行160个字符,所以一行的长度是160,十六进制A0H
dec dh ;由于行数从零开始算起,所以第8行索引为7,所以减一
mul dh ;行号乘以每行字符数实际上是在确定“行基址”,也就是行相对于显存基址(0b800h)的偏移地址
mov bx,ax ;先把“行基址”存放到BX中备用
列首字符偏移地址mov ax,0 ;我这里再清零AX,因为下边确定列地址要用到。习惯动作
dec dl ;列也是从零算起,所以这里减一
mov al,2
mul dl ;由于每个字符是由字符ASCII码和颜色代码组成的,所以一列其实是2个字符,那么第3列字符偏移地址就是 ;(3-1)*2,是04
这样一来要显示的第一个字符地址就是——显存基址(与es 挂钩):[“行基址”bx +列首字符偏移地址di ],以下是完整代码:
assume cs:code,ds:data,ss:stack
data segment
db 'Welcome to masm!',0 ; 定义目标字符串
data ends
stack segment
dw 8 dup(0) ;定义空栈
stack ends
code segment
start: mov dh,8h ;用DX高位地址DH存放行数
mov dl,3h ;用DX低位地址DL存放列数
mov cl,2h ;用CX低位地址存放颜色代码
mov ax,data
mov ds,ax ;data挂钩DS数据段
|