注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

编程学习

我的网上家园

 
 
 

日志

 
 

改进版的putstring  

2013-04-02 16:16:23|  分类: 《x86汇编语言: |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
算是复习吧. 重新写了一遍. 做了点修改.
movzx movsx 用的少,有些生疏.

;备注,不能直接替换14章源代码中的子例程,需要更改 putstring 为 put_string,更改putchar 为put_char ,同时修改putstring的返回指令ret为retf.


video_ram_seg_sel equ 0x20

;入口参数 DS:EBX 指向字符串所在位置
putstring:
push ecx
.show:
mov cl,[ebx]
or cl,cl
jz .exit
call putchar
inc ebx
jmp .show
.exit:
pop ecx
ret

putchar:
pushad
mov dx,0x3d4
mov al,0xe
out dx,al
inc dx
in al,dx
mov ah,al
dec dx
mov al,0xf
out dx,al
inc dx
in al,dx ;AX=当前光标位置
cmp cl,0xd
jnz .0xa
xor dx,dx
mov bx,80
div bx
mul bx
jmp .setcursor
.0xa:
cmp cl,0xa
jnz .ch
add ax,80
cmp ax,25*80
jb .setcursor
sub ax,80
jmp .rollscreen
.ch:
push es
mov ebx,video_ram_seg_sel
mov es,ebx
movzx ebx,ax
shl ebx,1
mov [es:ebx],cl
pop es
inc ax
cmp ax,25*80
jb .setcursor
mov ax,24*80


.rollscreen:
push ds
push es
mov ebx,video_ram_seg_sel
mov ds,ebx
mov es,ebx
mov esi,1*80*2
xor edi,edi
mov ecx,24*80*2/4
cld
rep movsd
mov esi,80*24*2
mov ecx,80*2/4
.clr:
mov dword [esi],0x07200720
add esi,4
loop .clr
pop es
pop ds

.setcursor:
mov bx,ax
mov dx,0x3d4
mov al,0xe
out dx,al
inc dx
mov al,bh
out dx,al
dec dx
mov al,0xf
out dx,al
inc dx
mov al,bl
out dx,al

popad
ret


  评论这张
 
阅读(9)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017