|  | 
 
 发表于 2012-11-26 21:48:41
|
显示全部楼层 
| 本帖最后由 兄弟们,冲啊 于 2012-11-26 21:49 编辑 
 复制代码
 assume cs:code
 
data segment
 
        db 'Welcome to masm!',0
 
data ends
 stack segment
 
        db 16 dup (0)
 
stack ends
 code segment
 
start:        mov dh,8
 
                mov dl,3
 
                mov cl,2
 
                mov ax,data
 
                mov ds,ax
 
                mov ax,stack
 
                mov ss,ax
                
                mov sp,16
                ;这里你既然设置了堆栈段ss那就应该设置SP
                ;不然sp是不固定的
                
                mov ax,0B800H
                mov es,ax
     ;这是附加段你没设置
     ;mov byte ptr 0B800H[bx+DI],byte ptr [si]
     ;这样是到代码段去的DS
     
     mov di,0
     ;设置di
     
                mov si,0
 
                call show_str
 
                
        ok:        mov ax,4c00h
 
                int 21h
 
                
show_str:          mov ax,0a0h ;在显存数据段中b8000h每行160字节
 
                        dec dh ;获取前七行的偏移地址
 
                        mul dh 
                        
                        mov bx,ax;将上面获得第7行的字节数保存在bx中
                        
                        ;add ax,3 ;得到显存的第八行第三列的偏移地址
       ;这句错误你没有将列数乘以2,因为有2个字节显示字符
       ;偶字节显示字符,奇字节显示颜色
       
                        mov ax,2
                        
                        mul dl 
 
                        add bx,ax;这里才是得到显存的第八行第三列的偏移地址
 
                        
                 S:     push cx ;判断最后一个字节值是否为0
 
                        mov cl,0
 
                        mov ch,byte ptr [si]
 
                        jcxz short ok
 
                        pop cx
 
                     mov al,byte ptr [si]
                     
                  mov byte ptr es:[bx+DI],al
 
                        mov byte ptr es:[bx+DI+1],cl
 
                        inc si
 
                        ADD DI,2
 
                        jmp near ptr S
                    
 
                                              code ends
 
end start
 | 
 评分
查看全部评分
 |