(2011.11.04)汇编_王爽_第14章_学习小结

来源:互联网 发布:chrome js调用本地exe 编辑:程序博客网 时间:2024/06/06 03:39
  

(2011.11.04)汇编_王爽_第14章_学习小结

本章内容:

1. 端口的读写

2.CMOS RAM芯片的访问读写

3. shl,shr位移指令

 

|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

 

; 程序名称:1404_CMOS_RAM中存储的时间信息.asm; 程序功能:在屏幕中间显示当前的月份; 程序开始;-----------------------------------------------------------------------------------------------------------------------------------------------assume cs:codecode segmentstart:; 第一步:从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, 8out 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, 4shr ah, cl; ah中为月份的十位数码值; shl指令,将目标操作数的二进制数值左移N位,; shr指令,将目标操作数的二进制数值右移N位.; 空位补零,最后移出位是0还是1写入到标志寄存器中的CFand al, 00001111b; al 中为月份的个位数码值; 第二步:将数据转换为ASCII码;-----------------------------------------------------------------------------------------------------------------------------------------------; 将BCD码转化成十进制相对应的ASCII码; BCD码值 = 十进制数码值; BCD码值 + 30h = 十进制数对应的ASCII码add ah, 30hadd al, 30h; 第三步:将提取出的月份在显示缓冲区中显示;-----------------------------------------------------------------------------------------------------------------------------------------------mov bx, 0b800hmov es, bxmov byte ptr es:[160*12 +40*2], ah; 显示月份的十位数码mov byte ptr es:[160*12+40*2+2], al; 接着月份的个位数码;-----------------------------------------------------------------------------------------------------------------------------------------------; 程序返回mov ax, 4c00hint 21h; 程序结束:;-----------------------------------------------------------------------------------------------------------------------------------------------code endsend start;-----------------------------------------------------------------------------------------------------------------------------------------------


 

|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

 

; 程序名称:实验14_访问CMOS_RAM.asm; 程序功能:以“年/月/日 时:分:秒"的格式,显示当前的日期,时间。; ------------------------------------------------------------------------------------------------ the whole programma start---assume cs:code, ds:timeds, ss:tempa;  -------------------------------------------------------------------------------------------statment start ---; 段名:ds:timed; 功能: 用于存放时间的数据; 大小:共占用了12个节字; 数据:存放的数据依次是年月日时分秒; ---------statment end------------------------timeds segmentdb 12 dup('0')timeds ends;-------------------------------------------------------------------------------------------- programma end---;  -------------------------------------------------------------------------------------------statment start ---; 段名:ss:tempa; 功能: 用于存放调用程序地址的数据; 大小:共占用了六个字; ---------statment end------------------------tempa segmentdw 6 dup('0')tempa ends;-------------------------------------------------------------------------------------------- programma end---code segmentstart:mov ax, tempa ; 设置堆栈地址为程序设定的堆栈内存地址mov ss, axmov ax, 12mov sp, axmov bx, 0; 依次访问并放入数据进数据段mov al,9; 年call raptdmov al, 8; 月call raptdmov al, 7; 日call raptdmov al, 4; 时call raptdmov al, 2; 分call raptdmov al, 0; 秒call raptdmov ax, 0B800hmov bx, 0mov es, axmov ax, timedsmov ds, axmov ax, 0mov di, axmov cx, 12; 循环显示于显示缓冲区中  lst:mov ax, ds:[di]; 装入数据mov es:[bx], axinc bxmov ax, 01110001B ; 显示的属性:白底蓝字mov es:[bx], axinc bxinc diloop lstmov ax, 4c00hint 21h;  -------------------------------------------------------------------------------------------statment start ---; 子程序名称:raptd -- read and push data; 子程序功能:将CMOS RAM中的数据提取出来并且放入timesds内存单元中; 子程序需要的参数: al:需要从外部调入(提取RAM的地址); ---------statment end------------------------raptd:; read and push datapush axmov ax, timeds; 设置存放数据的地址mov es, axpop axmov ah, 0out 70h, alin al, 71h; 先提取出需要的数据mov es:[bx], al; 将数据存入指定地址中call exchangeret;-------------------------------------------------------------------------------------------- programma end---;  -------------------------------------------------------------------------------------------statment start ---; 子程序名称:exchange; 子程序功能:将timesds内存单元中的数据从BCD码转换为ASCII码存放; 子程序需要的参数:bx:每存放一次增加数位2;                                      al:需要从外部调入(提取RAM的地址); ---------statment end------------------------exchange:mov al, es:[bx]mov ah, almov cl, 4shr ah, cl; 十位and al, 00001111b; 个位add ah, 30hadd al, 30hmov es:[bx], ahinc bxmov es:[bx], alinc bxinc bxret;-------------------------------------------------------------------------------------------- programma end---code endsend start; ------------------------------------------------------------------------------------------------ the whole programma end---


 

原创粉丝点击