(2011.11.04)汇编_王爽_第14章_学习小结
本章内容:
1. 端口的读写
2.CMOS RAM芯片的访问读写
3. shl,shr位移指令
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
; 程序名称:1404_CMOS_RAM中存储的时间信息.asm
; 程序功能:在屏幕中间显示当前的月份
; 程序开始
;-----------------------------------------------------------------------------------------------------------------------------------------------
assume cs:code
code segment
start:
; 第一步:从CMOS中提取(月份)数据
;-----------------------------------------------------------------------------------------------------------------------------------------------
; CMOS RAM 芯片内部有两个端口地址用于读写CMOS RAM
; 70h —— 地址端口,存放要访问的 CMOS RAM 单元的地址。
; 71h —— 数据端口,存放从选定的 CMOS RAM 单元中读取的数据,或,写入到其中的数据。
; 端口的读写指令只有两条:in 从端口读取数据 out从端口写入数据(in out 对象只能是ax或者是al)
; CMOS RAM中存放单元:秒(0),分(2),时(4), 日(7),月(8),年(9)
mov al, 8
out 70h, al ; al的数值为8,使用out指令,将要访问的CMOS单元地址写入到70h中
; 以上,指明,CPU通过地址线跟CMOS RAM端口说,CPU将从8号单元中读出数据
in al, 71h ; 将71h 中读入一个字节到al 中
mov ah, al ; al中为从CMOS RAM的8号单元中读出的数据
mov cl, 4
shr ah, cl ; ah中为月份的十位数码值
; shl指令,将目标操作数的二进制数值左移N位,
; shr指令,将目标操作数的二进制数值右移N位.
; 空位补零,最后移出位是0还是1写入到标志寄存器中的CF
and al, 00001111b ; al 中为月份的个位数码值
; 第二步:将数据转换为ASCII码
;-----------------------------------------------------------------------------------------------------------------------------------------------
; 将BCD码转化成十进制相对应的ASCII码
; BCD码值 = 十进制数码值
; BCD码值 + 30h = 十进制数对应的ASCII码
add ah, 30h
add al, 30h
; 第三步:将提取出的月份在显示缓冲区中显示
;-----------------------------------------------------------------------------------------------------------------------------------------------
mov bx, 0b800h
mov es, bx
mov byte ptr es:[160*12 +40*2], ah ; 显示月份的十位数码
mov byte ptr es:[160*12+40*2+2], al ; 接着月份的个位数码
;-----------------------------------------------------------------------------------------------------------------------------------------------
; 程序返回
mov ax, 4c00h
int 21h
; 程序结束:
;-----------------------------------------------------------------------------------------------------------------------------------------------
code ends
end start
;-----------------------------------------------------------------------------------------------------------------------------------------------
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
; 程序名称:实验14_访问CMOS_RAM.asm
; 程序功能:以“年/月/日 时:分:秒"的格式,显示当前的日期,时间。
; ------------------------------------------------------------------------------------------------ the whole programma start---
assume cs:code, ds:timeds, ss:tempa
; -------------------------------------------------------------------------------------------statment start ---
; 段名:ds:timed
; 功能: 用于存放时间的数据
; 大小:共占用了12个节字
; 数据:存放的数据依次是年月日时分秒
; ---------statment end------------------------
timeds segment
db 12 dup('0')
timeds ends
;-------------------------------------------------------------------------------------------- programma end---
; -------------------------------------------------------------------------------------------statment start ---
; 段名:ss:tempa
; 功能: 用于存放调用程序地址的数据
; 大小:共占用了六个字
; ---------statment end------------------------
tempa segment
dw 6 dup('0')
tempa ends
;-------------------------------------------------------------------------------------------- programma end---
code segment
start:
mov ax, tempa ; 设置堆栈地址为程序设定的堆栈内存地址
mov ss, ax
mov ax, 12
mov sp, ax
mov bx, 0 ; 依次访问并放入数据进数据段
mov al, 9 ; 年
call raptd
mov al, 8 ; 月
call raptd
mov al, 7 ; 日
call raptd
mov al, 4 ; 时
call raptd
mov al, 2 ; 分
call raptd
mov al, 0 ; 秒
call raptd
mov ax, 0B800h
mov bx, 0
mov es, ax
mov ax, timeds
mov ds, ax
mov ax, 0
mov di, ax
mov cx, 12 ; 循环显示于显示缓冲区中
lst:
mov ax, ds:[di] ; 装入数据
mov es:[bx], ax
inc bx
mov ax, 01110001B ; 显示的属性:白底蓝字
mov es:[bx], ax
inc bx
inc di
loop lst
mov ax, 4c00h
int 21h
; -------------------------------------------------------------------------------------------statment start ---
; 子程序名称:raptd -- read and push data
; 子程序功能:将CMOS RAM中的数据提取出来并且放入timesds内存单元中
; 子程序需要的参数: al:需要从外部调入(提取RAM的地址)
; ---------statment end------------------------
raptd: ; read and push data
push ax
mov ax, timeds ; 设置存放数据的地址
mov es, ax
pop ax
mov ah, 0
out 70h, al
in al, 71h ; 先提取出需要的数据
mov es:[bx], al ; 将数据存入指定地址中
call exchange
ret
;-------------------------------------------------------------------------------------------- programma end---
; -------------------------------------------------------------------------------------------statment start ---
; 子程序名称:exchange
; 子程序功能:将timesds内存单元中的数据从BCD码转换为ASCII码存放
; 子程序需要的参数:bx:每存放一次增加数位2
; al:需要从外部调入(提取RAM的地址)
; ---------statment end------------------------
exchange:
mov al, es:[bx]
mov ah, al
mov cl, 4
shr ah, cl ; 十位
and al, 00001111b ; 个位
add ah, 30h
add al, 30h
mov es:[bx], ah
inc bx
mov es:[bx], al
inc bx
inc bx
ret
;-------------------------------------------------------------------------------------------- programma end---
code ends
end start
; ------------------------------------------------------------------------------------------------ the whole programma end---