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

编程学习

我的网上家园

 
 
 

日志

 
 

13章 XLAT指令练习  

2013-03-04 14:37:38|  分类: 《x86汇编语言: |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
; XLAT 指令练习
;查表指令xlat要求事先在 DS:(E)BX 处定义一个用于转换编码的表格,在 16 位模式下,
;使用 BX 寄存器;在 32 位模式下,使用 EBX 寄存器。指令执行时,处理器访问该表格
;用 AL 寄存器的内容作为偏移量,从表格中取出一字节,传回 AL 寄存器


mov ax,cs
mov ss,ax
mov sp,0x7c00
mov ds,ax

lea bx,[message+0x7c00]
call put_string


lea bx,[hex_table+0x7c00]
mov eax,0xff007c00
call hex_show
halt:
hlt
jmp halt



;入口 ds:bx指向表格 显示eax的值 
hex_show:
push eax
push cx
mov cx,8
.show:
push cx
rol eax,4
push ax
and al,0xf
xlat
mov cl,al
call put_char
pop ax
pop cx
loop .show
pop cx
pop eax
ret


put_string:
push cx
.show_s:
mov cl,[bx]
or cl,cl
jz .exit
call put_char
inc bx
jmp .show_s
.exit:
pop cx
ret

put_char:
pusha
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
cmp cl,0xd
jnz .0xa
mov bl,80
div bl
mul bl
jmp .setcursor

.0xa:
cmp cl,0xa
jnz .put_ch
add ax,80
cmp ax,80*25
jb .setcursor
sub ax,80
jmp .rollscreen
.put_ch:
push es
mov bx,0xb800
mov es,bx
shl ax,1
mov bx,ax
mov [es:bx],cl
pop es
shr ax,1
inc ax
cmp ax,80*25
jb .setcursor
mov ax,80*24

.rollscreen:
push ds
push es
mov bx,0xb800
mov ds,bx
mov es,bx
mov si,80
xor di,di
mov cx,80*24
cld
rep movsw
mov cx,80
mov di,80*24
.show_clr:
mov word [es:di],0x0720
loop .show_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
popa
ret




hex_table: 
db '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'

message: db 'Hello.',0xa,0xd
db 0xa,0xa,0xa,0xa,0xa

times 510-($-$$) db 0
db 0x55,0xaa
  评论这张
 
阅读(28)| 评论(0)
推荐 转载

历史上的今天

评论

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

页脚

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