ㄨ珊瑚岛Γ 发表于 2011-8-15 11:03:17

实验十,有几句代码不理解,帮忙解释解释

assume cs:code
data 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中已经显性的给出列号了,,为什么还这么绕个圈子...不解啊...
      
          

/db_八神_/zq 发表于 2011-8-15 20:05:02

dl给的是行号,内容要是偏移啊, 第5个位置放个字符, 在内存中的偏移应该是 5*2-2。减2, 是每列的第一个位置是0, 要减2

cqy55555 发表于 2011-8-15 23:46:56

其实最后三行的目的,实质上和上面对行号dh的处理是一样的,同样你可以将最后三行改成:
mov al,2
dec dl
mul dl
结果是一样的,类比一下他们的目的相信你能够理解的。

ㄨ珊瑚岛Γ 发表于 2011-8-18 08:40:26

理解了 谢谢各位:loveliness:
页: [1]
查看完整版本: 实验十,有几句代码不理解,帮忙解释解释