- [游客] 求3号,不是1号。 10/25 19:27
- [towersimper] 这就看是CS:IP指向的还是DS:偏移地址指向,若是前者是指令,若是后者是数据。即指令和数据都是二进 10/22 16:57
- [游客] 问一下,我们如何判断e写入的是数据还是指令呢? 10/03 22:43
- [chendeke060482] 告诉大家一个秘密。用我博客里介绍的win-masm v2.2软件,然后用二进制软件打开安装目录下的m 08/05 22:49
- [zkry04] 真的是好东西,及时雨,这几天就是被这些错误困扰,头都搞大了。。。感谢楼主提供这么好的东西。收藏了!! 08/04 20:04
- [masmaster] 嘿嘿~~↖(^ω^)↗ 07/27 16:16
- [towersimper] 呵呵。我当然知道此处程序只能处理65536以下的整数啊。只是姑且按照书上说的那样啊。在第十章设计点中 07/27 15:07
- [masmaster] 找个32位大数测试了吗?例如:ffffffffh 07/27 14:51
- [towersimper] 好的,我试试。谢谢啊。呵呵 07/26 22:08
- [masmaster] 装个VM,试一试呢? 07/24 23:27
[2010-09-26 15:30] 实验14 访问CMOS RAM
编程:以“年/月/日 时:分:秒”的格式,显示当前的日期和时间。
assume cs:code
stack segment
db 16 dup(0)
stack ends ;以上三句设置一个长16byte的栈
code segment
sign: db " ","/","/"," ",":",":" ;放置需要显示的格式字符数据
time: db 9,8,7,4,2,0 ;放置需要访问的CMOS RAM的存储单元地址
start:
mov ax,0B800h
mov es,ax ;以上两句设置显示缓冲区的段地址
mov ax,code
mov ds,ax ;以上两句设置访问数据的段地址
mov ax,stack
mov ss,ax
mov sp,10h ;以上三句设置栈为空栈
mov si, offset time ;将格式字符数据的起始地址赋给si
mov di, offset sign ;将CMOS RAM存储单元数据的起始地址赋给si
mov bx,0 ;用来作显示缓冲区偏移地址的增加量
mov cx,6 ;循环次数,由于访问年月日时分秒,故共循环6次
s: push cx ;保护外循环的cx
mov al, [si] ;将存储的CMOS RAM存储单元地址赋给al
out 70h,al ;确定访问地址
in al,71h ;读取该地址上存储的数据
mov ah,al
mov cl,4
shr ah,cl
and al,00001111B ;以上三句将读取的数据的十位BCD值和个位BCD值分别存储在ah和al上。
add ah,30h
add al,30h ;以上两句分别将十位和个位上的BCD值转换为对应的ASCII码
mov cl, [di] ;取得存储的格式字符赋给cl
mov ch,40h ;将字符属性设置为背景红色
mov byte ptr es:[160*12+30*2+bx], cl
mov byte ptr es:[160*12+30*2+bx+1], ch
mov byte ptr es:[160*12+30*2+bx+2], ah
mov byte ptr es:[160*12+30*2+bx+3], ch
mov byte ptr es:[160*12+30*2+bx+4], al
mov byte ptr es:[160*12+30*2+bx+5], ch ;以上6句将格式字符和日期时间字符按照要求输出在显示缓冲区的正中间
add bx,6 ;显示缓冲区偏移地址的增加量为6
inc si ;切换到下一个需要访问的CMOS RAM存储单元地址
inc di ;切换到下一个格式字符
pop cx ;将进栈的cx出栈,恢复循环外的cx值。
loop s
mov ax,4c00h
int 21h
code ends
end start
assume cs:code
stack segment
db 16 dup(0)
stack ends ;以上三句设置一个长16byte的栈
code segment
sign: db " ","/","/"," ",":",":" ;放置需要显示的格式字符数据
time: db 9,8,7,4,2,0 ;放置需要访问的CMOS RAM的存储单元地址
start:
mov ax,0B800h
mov es,ax ;以上两句设置显示缓冲区的段地址
mov ax,code
mov ds,ax ;以上两句设置访问数据的段地址
mov ax,stack
mov ss,ax
mov sp,10h ;以上三句设置栈为空栈
mov si, offset time ;将格式字符数据的起始地址赋给si
mov di, offset sign ;将CMOS RAM存储单元数据的起始地址赋给si
mov bx,0 ;用来作显示缓冲区偏移地址的增加量
mov cx,6 ;循环次数,由于访问年月日时分秒,故共循环6次
s: push cx ;保护外循环的cx
mov al, [si] ;将存储的CMOS RAM存储单元地址赋给al
out 70h,al ;确定访问地址
in al,71h ;读取该地址上存储的数据
mov ah,al
mov cl,4
shr ah,cl
and al,00001111B ;以上三句将读取的数据的十位BCD值和个位BCD值分别存储在ah和al上。
add ah,30h
add al,30h ;以上两句分别将十位和个位上的BCD值转换为对应的ASCII码
mov cl, [di] ;取得存储的格式字符赋给cl
mov ch,40h ;将字符属性设置为背景红色
mov byte ptr es:[160*12+30*2+bx], cl
mov byte ptr es:[160*12+30*2+bx+1], ch
mov byte ptr es:[160*12+30*2+bx+2], ah
mov byte ptr es:[160*12+30*2+bx+3], ch
mov byte ptr es:[160*12+30*2+bx+4], al
mov byte ptr es:[160*12+30*2+bx+5], ch ;以上6句将格式字符和日期时间字符按照要求输出在显示缓冲区的正中间
add bx,6 ;显示缓冲区偏移地址的增加量为6
inc si ;切换到下一个需要访问的CMOS RAM存储单元地址
inc di ;切换到下一个格式字符
pop cx ;将进栈的cx出栈,恢复循环外的cx值。
loop s
mov ax,4c00h
int 21h
code ends
end start
评论次数(0) |
浏览次数(754) |
类型(汇编作业) |
收藏此文 |