8086汇编(9、小时间大智慧)

先说明下左移右移得指令
SHL (左移<<)
SHR(右移>>)
左移就是将寄存器中的二进制整体向左移动一位,在低位补0,被移动出去的那一位数放到CF标志位中,右移则相反,移动出去的一位也是放到CF中,例如
左移

mov al,1000 0001
shl al,1  此时al=0000 0010   CF=1

右移

mov  al,1000 0001
shr al,1 此时al =0100 0000 CF=1

移动4次

shl al,4

那么它有什么作用呢?
操作系统中有一块芯片叫CMOS,存储了bios程序的配置以及一些主板信息,还有时间,那么这里的时间使用的是一种特殊的编码叫BCD码:使用4位表示的数字,那么cpu处理都是以一个字节8位为单位,那么它如何读取4位的数据呢?即
0011 1001 十六进制 39 十进制57 但是它却表示十进制的39
此时使用端口命令从CMOS读取出来的数据存放在al中,那么如何让它表示十进制的39呢?
所以把 0011 1001保存到 ah中然后对ah进行右移4位

  • al = 0011 1001
  • ah=0000 0011

然后将al0000 1111做与运算即and al,00001111即将高位抹除这样就得到两个独立的数据 一个是3 一个是9 然后将两个数加上30H拼接展示到屏幕上。
这里也许有人会说直接将十六进制当十进制用不就可以了吗?干嘛搞那么麻烦?
哈哈,这个还真不行,在屏幕上展示出来的字符是ascii码,所以要想将这个数据展示到屏幕上还得将它转换成ascii码即加上 30H。那么你试试看显示多少?

而这里使用BCD码原因也很简单,节省内存啊,以前的内存是很宝贵的,都抠到bit上了,真的是抠。在想想自己写java代码动不动就是int、long,是不是很浪费。但是在那个年代,真的是每一个bit都被用到淋漓进制,好接下来我们写个程序读取当前时间显示到屏幕上
在写这个程序前还得介绍两个命令
in cpu从端口读入数据
out cpu向端口写数据
这里都是相对cpu而言的读入与写出。
还有CMOS相关的知识,cmos128个字节,那么cpu要使用in,out指令拿数据的时候要拿哪个位置的呢?,所以cmos提供了两个端口
70H 告诉cmos我要哪个字节
71H 从这个端口将字节拿出来
这个跟总线的概念是一样的。

  • 控制总线告诉内存我要读还是要写
  • 地址总线告诉内存我操作的地方在哪
  • 数据总线传输数据

在cmos中时间所在的字节入下表

024789

我们先看效果,不断循环输出时间
在这里插入图片描述
代码如下,比较简单

DATAS SEGMENT
    ;此处输入数据段代码  
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
show_loop:
    call init
    mov cx,3
	mov ax,4
show:
    call show_time
    sub ax,2
    add di,6
    loop show
    jmp show_loop
    MOV AH,4CH
    INT 21H
;=======================================
init:
	mov bx,0B800H
	mov es,bx
	mov di,160*10+30*2
	ret
show_time:
	push ax
	out 70H,al
	in al,71H
	
	mov ah,al
	shr ah,1
	shr ah,1
	shr ah,1
	shr ah,1
	
	and al,00001111B
	add al,30H
	add ah,30H
	mov bx,00100001B
	mov es:[di+0],ah
	mov es:[di+1],bx
	mov es:[di+2],al
	mov es:[di+3],bx
	cmp cx,1
	je show_ret
	mov ax,3AH
	mov es:[di+4],ax
	mov es:[di+5],bx
	
show_ret:
	pop ax
	
	ret
;=======================================    
    
CODES ENDS
    END START
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值