丶Haw 发表于 2012-8-4 12:00:56

实验10,求思路,有点模糊

assume cs:code,ds:data

data segment

   db 'welcome to masm!',0

data ends

code segment

start:   mov dh,8;dx=0800

   mov dl,3    ;dx=0803

   mov cl,2    ;cx=0002

   mov ax,data   ;data=0caf ax=data

   mov ds,ax   ;ds=0caf

   mov si,0   ;si=0000

   call show_str   ;call 0016   ip=0016 sp=fffe



   mov ax,4c00h

   int 21h



;名称:show_str

;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串。

;参数:(dh)=行号(取值范围0~24);

;      (dl)=列号(取值范围0~79);

;      (cl)=颜色;

;      ds:si指向字符串的首地址。

;返回:无。

show_str:

   push ax   ;0017sp=fffc

   push bx   ;0018   sp=fffa

   push es   ;0019sp=fff8

   push si    ;001asp=fff6
       
       ;----------------------------------------------------------
       ;mov bx,(160*dh+dl*2)设置es:bx指向显存首地址
   mov ax,0b800h   ;ax=b800

   mov es,ax      ;es=b800

   mov ax,160   ;ax=00a0

   mul dh         ;ax=0500

   mov bx,ax ;bx=160*dh

   mov ax,2

   mul dl      ;ax=dl*2

   add bx,ax   ;mov bx,(160*dh+dl*2)设置es:bx指向显存首地址
       ;
       ;------------------------------------------------------------
   mov al,cl   ;把颜色cl赋值al

   mov cl,0

show0:

   mov ch,    ;cx=0000 变为cx=7700

   jcxz show1    ;(ds:si)=0时,转到show1执行,等于0会是什么情况?      

   mov es:,ch

   mov es:.1,al

   inc si      ;ds:si指向下一个字符地址

   add bx,2      ;es:bx指向下一个显存地址

   jmp show0

show1:

   pop si

   pop es

   pop bx

   pop ax

   ret



code ends

end start

lukelqz 发表于 2012-8-4 12:40:21

等于0会是什么情况?要打印的数据不是在ds段嘛,然后字符串又是以0为结尾的。等于0了,自然就是到了最后一个字节了,就是打印字符串结束了,这个子程序可以ret了,当然ret前要把push进去的pop出来。如果检测出来不为0,就执行
inc si      ;ds:si指向下一个字符地址

   add bx,2      ;es:bx指向下一个显存地址


准备打印下一个字符。直到检测到0
页: [1]
查看完整版本: 实验10,求思路,有点模糊