实验十,有几句代码不理解,帮忙解释解释
assume cs:codedata segment
db 'welcome to masm!',0
data ends
code segment
w: mov dh,0 ;定义行号=第8行
mov dl,3 ;定义列号=第三列
mov cl,10100010B ;定义字符颜色属性
mov ax,data
mov ds,ax
mov si,0
call show
mov ax,4c00H
int 21H
show: ;显存字符串的子程序[定义开始]
push cx
push si
mov al,0a0h ;每行是有80*2 == 160个字节== 0A0h个字节,则第N 行
;dec dh ;行号再显存中下标从0开始,所以减1
mul dh ;相当于从第(n-1)*0A0h 个 Byte单元开始....
mov bx,ax ;定位好得位置偏移地址存放在bx里(行)
mov al,2 ;每个字符占两个字节
mul dl ;定位列,结果ax存放的是定位好的列的位置
sub ax,2 ;列号再显存中下标从0开始,又因为偶字节存放字符,所以减2
最后的三条指令不解,,
(mov al,2 ;每个字符占两个字节)
(mul dl ;定位列,结果ax存放的是定位好的列的位置)
(sub ax,2 ;列号再显存中下标从0开始,又因为偶字节存放字符,所以减2)为什么偶字节存放的是偶数,就要减2,在dl中已经显性的给出列号了,,为什么还这么绕个圈子...不解啊...
dl给的是行号,内容要是偏移啊, 第5个位置放个字符, 在内存中的偏移应该是 5*2-2。减2, 是每列的第一个位置是0, 要减2 其实最后三行的目的,实质上和上面对行号dh的处理是一样的,同样你可以将最后三行改成:
mov al,2
dec dl
mul dl
结果是一样的,类比一下他们的目的相信你能够理解的。
理解了 谢谢各位:loveliness:
页:
[1]