黑洞yyh 发表于 2013-10-12 16:10:28

第9章那程序不难,别一下子就写一大堆,先显示一个字符再逐步深入

本帖最后由 黑洞yyh 于 2013-10-12 16:21 编辑

编译链接完之后,用cmd去打开,直接双击是看不出效果的,在UE上运行也是看不到效果的。

assume cs:codesg,ds:datasg,ss:stacksg
;定义一个数据段datasg segment                              
         db "Kawayi girl is my love!"            ;字符 0h[]               
         db 02h,24h,71h;                              ;颜色      10h[]      
datasg ends

stacksg segment
          dw 3 dup(0)                                     ;栈
stacksg ends

codesg segment
;合并了一下而已,整理了下,简洁了点,
;编写这个不难额,先从显示一个字符开始,
;之后到显示一行字符,最后就能知道怎么显示多行字符了!
start:
          mov ax,datasg                               ;数据段                        
          mov ds,ax                     
          mov ax,stacksg                            ;栈段                  
          mov ss,ax                     
          mov ax,0b872h                              ;显存地址                     
          mov sp,10h                                    ;栈底为10h处,入栈sp=sp-2
;=========================================================================      
          mov bx,0                                    ;字符索引                        
          mov di,0                                       ;颜色索引                        
          mov si,0                                       ;显存偏移
;=========================================================================   
          mov cx,3                                        ;大循环3次
s1:                                                                              
          push cx;                                    ;因为cx会被影响,所以先入栈,第一次cx为3                     
          push ax;                                        ;保存起始显存地址
;=========================================================================
          mov si,0                                        ;显存偏移清零,从下一行的起始地方开始                        
          mov bx,0                                     ;字符索引清零,表示从字符的第一个字符开始
;=========================================================================
          mov es,ax                                    ;定位显存地址
;=========================================================================
          mov cx,17h                                 ;16个字符,16次循环
s2:               
         mov al,ds:                              ;字符,因为是字节型所以要用al转存                        
         mov es:,al                                 ;显存位置                        
         inc si                        
         mov al,ds:17h                        ;颜色 ,可以将10h[] ====c语言数组                        
         mov es:,al                                 ;显存位置                        
         inc bx;                                          ;索引下一个                        
         inc si;                                                                                          
         loop s2
;=========================================================================   
         pop ax;                                        ;ax出栈,顺要跟入栈相反                        
         pop cx                     
         add ax,0ah                                     ;指向下一行                        
         inc di;                                             ;颜色索引下一个                     
         loop s1;
;=========================================================================
         ;程序返回cmd界面                        
         mov ax,4c00h                                             
         int 21h
;=========================================================================
codesg ends
end start



LinuxDeepin 发表于 2013-10-12 23:19:20

想要看出效果,在程序返回 dos 之前加入 jmp short start即可

另,你那三行的显示位置不居中呀,检查一下吧

黑洞yyh 发表于 2013-10-13 15:59:14

LinuxDeepin 发表于 2013-10-12 23:19 static/image/common/back.gif
想要看出效果,在程序返回 dos 之前加入 jmp short start即可

另,你那三行的显示位置不居中呀,检查一 ...

居中好像不重要吧,改下最前行的偏移就行啦,
页: [1]
查看完整版本: 第9章那程序不难,别一下子就写一大堆,先显示一个字符再逐步深入