|
2鱼币
- assume cs:code
- data segment
- db 'Welcome to masm!',0
- data ends
- code segment
- start: mov dh,8 ;8行
- mov dl,3 ;3列
- mov cl,2 ;绿色
- mov ax,data
- mov ds,ax ;与ds段挂钩
- mov si,0 ;字符的偏移地址
- call show_str
- mov ax,4c00h
- int 21h
- show_str:
- push si
- push cx
- mov al,0Ah ;因为一行有160个字符
- dec bh ;因为要定位行数,是从0开始的,0~7刚好是8行
- mul dh ;要确认行数是从哪个偏移地址开始的,因为一行有160个字符,一共有8行,所以7*160=把光标定位到第八行的偏移地址0开始
- mov bx,ax ;由bx控制行数
- mov al,2 ;一列占2个字节,偶地址存放字符,奇地址存放颜色
- mov al,dl ;因为要在第八行0偏移开始计算
- mul dl ;确定列为,乘完之后结果存放在ax中
- sub ax,2 ;列号在显存中下标从0开始,又因为偶字节存放字符,所以减2
- add bx,ax ;此时bx中存放的是行与列号的偏移地址
- mov ax,0b8000h
- mov es,ax
- mov ch,0
- mov al,cl ;把颜色放到al中,现在它才是颜色值
- s:
- mov cl,ds:[si] ;把si第一个内容w送到al中
- jcxz ok ;如果welcome to masm!都被转好了之后,那inc di再跑一圈,cl就会=0,前面ch已经等于0了,那么就会跳到ok标号处指执行
- mov es:[di][bx],cl ;把w送到第bx(行),第di(列)中
- mov es:1[di][bx],al ;把颜色放到奇地址中,因为上条指令把列位+1字节了
- inc si
- add di,2
- jmp short s ;循环中...
- ok: pop cx ;后进栈的先出来
- pop si ;先进栈的后出来
- ret
- code ends
- end start
复制代码
为什么显示不出来????????????? |
最佳答案
查看完整内容
mov al,0Ah ;因为一行有160个字符 160d=0a0h
mov al,dl ;因为要在第八行0偏移开始计算 这一行什么意思不懂
mov es:[di],cl ;把w送到第bx(行),第di(列)中 没有看见你给DI赋值0
|