端口(学习汇编)

1.在访问端口的时候,CPU通过端口地址来定位端口。因为端口所在的芯片和CPU通过总线相连,所以,端口地址和内存地址一样,通过地址总线来传送。

2.在PC系统中,CPU最多可以定位64KB个不同的端口,则端口地址的范围为0~65535

3.对端口的读写不能用mov,push、pop等内存读写指令。端口的读写指令只有两条:in和out,分别用于从端口读写数据和往端口写入数据。

4.在in和out指令中,只能使用ax或al来存放从端口中读入的数据或要发送到端口中的数据。

5.访问8位端口时用al,访问16位端口时用ax。

6.对0~255以内的端口进行读写时:

in al,20h             ;从20h端口读入一个字节

out   20h,al          ;往20h端口写入一个字节

7.对256~65535的端口进行读写时,端口号放在dx中:

mov dx,3f8h              ;将端口号3f8h送入dx

int al,dx              ;从3f8h端口读入一个字节

out dx,al             ;向3f8h端口写入一个字节

shl和shr指令

1.shl是逻辑左移指令,它的功能为:

1)将一个寄存器或内存单元中的数据向左移位;

2)将最后移出的一位写入CF中;

3)最低位用0补充。

2.shr是逻辑右移指令,它和shl所进行的操作刚好相反。

1)将一个寄存器或内存单元中的数据向右移位;

2)将最后移出的一位写入CF中;

3)最高位用0补充。

3.如果移动位数大于1时,必须将移动位数放到cl中。如果只移动一位,则可以直接写出来。

4.将X逻辑左移一位,相当于执行X=X*2,将X逻辑右移一位,相当于执行X=X/2。

CMOS RAM        中存储的时间信息

1.在CMOS RAM中,存放着当前的时间:年、月、日、时、分、秒。这6个信息的长度都为1个字节,存放单元为:

秒:0   分:2     时:4     日:7     月:8     年:9

这些数据以BCD码的方式存放。BCD码是以4位二进制数表示十进制码的编码方法。

2.一个字节可表示两个BCD码。则CMOS RAM存储时间信息的单元中,存储了用两个BCD码表示的两位十进制数,高4位的BCD码表示十位,低4位的BCD码表示个位。

3.BCD码值=十进制数码值,则BCD码值+30h=十进制数对应的ASCII码。

自己写的一个显示当前时间,日期汇编程序:

assume cs : codesg, ss : stacksg

stacksg segment
dw 16 dup (0)
stacksg ends

codesg segment

start:
mov al, 9            ;year
out 70h, al
in al, 71h
mov bx, 0b800h
mov ds, bx           ;25*80
mov si, 160 * 24 + 0 * 2    ;每个字符占2个字节,n*2确定列坐标
mov bl, al            ;此时在25行0列
mov cl, 4
and bl, 00001111b
shr al, cl
add bl, 30h
add al, 30h
mov ah, al
mov al, bl
mov bl, ah
mov [si], bl
mov byte ptr [si + 1], 0cah
add si, 2
mov [si], al
mov byte ptr [si + 1], 0cah
add si, 2
mov byte ptr [si], ‘/‘
mov byte ptr [si + 1], 0cah
add si, 2

mov al, 8            ;month
out 70h, al
in al, 71h
mov bl, al
mov cl, 4
and bl, 00001111b
shr al, cl
add bl, 30h
add al, 30h
mov ah, al
mov al, bl
mov bl, ah
mov [si], bl
mov byte ptr [si + 1], 0cah
add si, 2
mov [si], al
mov byte ptr [si + 1], 0cah
add si, 2
mov byte ptr [si], ‘/‘
mov byte ptr [si + 1], 0cah
add si, 2

mov al, 7           ;day
out 70h, al
in al, 71h
mov bl, al
mov cl, 4
and bl, 00001111b
shr al, cl
add bl, 30h
add al, 30h
mov ah, al
mov al, bl
mov bl, ah
mov [si], bl
mov byte ptr [si + 1], 0cah
add si, 2
mov [si], al
mov byte ptr [si + 1], 0cah
add si, 2
mov byte ptr [si], ‘ ‘
mov byte ptr [si + 1], 0cah
add si, 2

mov al, 4           ;hour
out 70h, al
in al, 71h
mov bl, al
mov cl, 4
and bl, 00001111b
shr al, cl
add bl, 30h
add al, 30h
mov ah, al
mov al, bl
mov bl, ah
mov [si], bl
mov byte ptr [si + 1], 0cah
add si, 2
mov [si], al
mov byte ptr [si + 1], 0cah
add si, 2
mov byte ptr [si], ‘:‘
mov byte ptr [si + 1], 0cah
add si, 2

mov al, 2            ;minute
out 70h, al
in al, 71h
mov bl, al
mov cl, 4
and bl, 00001111b
shr al, cl
add bl, 30h
add al, 30h
mov ah, al
mov al, bl
mov bl, ah
mov [si], bl
mov byte ptr [si + 1], 0cah
add si, 2
mov [si], al
mov byte ptr [si + 1], 0cah
add si, 2
mov byte ptr [si], ‘:‘
mov byte ptr [si + 1], 0cah
add si, 2

mov al, 0            ;second
out 70h, al
in al, 71h
mov bl, al
mov cl, 4
and bl, 00001111b
shr al, cl
add bl, 30h
add al, 30h
mov ah, al
mov al, bl
mov bl, ah
mov [si], bl
mov byte ptr [si + 1], 0cah
add si, 2
mov [si], al
mov byte ptr [si + 1], 0cah
add si, 2
jmp near ptr start        ;不停刷新时间

mov ax, 4c00h
int 21h
codesg ends
end start

端口(学习汇编),布布扣,bubuko.com

时间: 2024-08-26 03:06:47

端口(学习汇编)的相关文章

使用BIOS进行键盘输入和磁盘读写(学习汇编)

1.键盘输入将引发9号中断,BIOS提供了int 9中断例程.CPU在9号中断发生后,执行int 9中断例程,从60h端口读出扫描码,并将其转化为相应的ASCII码或状态信息,存储在内存的指定空间(键盘缓冲区或状态字节)中.一般的键盘输入,在CPU执行完int 9中断例程后,都放到了键盘缓冲区中.键盘缓冲区有16个字单元,可以存储15个按键的扫描码和对应的ASCII码. 2.下面,我们通过下面几个键: A.B.C.D.E.shift_A.A 的输入过程,简要地看一下int 9中断例程对键盘输入的

debug常用命令介绍(学习汇编)

显示所有寄存器内容 格式:-r  功能:以十六进制形式显示cpu内部个寄存器的值:以符号形式显示标志寄存器的各标志位(除tf外)的值:并将CS:IP所指的内存内容反汇编成一条指令,可视为将要执行的指令.如: -r   回车AX=0000  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000DS=0AF0  ES=0AF0  SS=0AF0  CS=0AF0  IP=0200   NV UP EI PL NZ NA PO NC

外中断(学习汇编)

外中断是指那些不再CPU内部产生的中断,即通过端口与cpu通信的外设产生的中断. 可屏蔽中断是CPU可以不响应的外中断 不可屏蔽中断是CPU必须响应的中断,其中断类型码都是2 sti,cli可以屏蔽中断,让一些如改变中断向量的操作安全进行. 1. 可屏蔽中断,CPU根据标志寄存器IF位决定是否响应中断,IF=1,响应中断,IF=0,不响应中断. sti,用于设置IF=1: cli,用于设置IF=0. 2. 不可屏蔽中断,CPU必须响应中断.不可屏蔽中断的中断类型码固定为2,所以中断过程中,不需要

数据处理的两个基本问题(学习汇编)

1.为了描述上的简洁,在以后的课程中,将使用两个描述性的符号reg来表示一个寄存器,用sreg表示一个段寄存器. reg的集合包括:ax,bx,cx,dx,ah,al,bh,bl,ch,cl,dh,dl,sp,bp,si,di; sreg的集合包括:ds,ss,cs,es. 8086CPU处理数据的两个基本问题:处理的数据存放在哪个地方? 要处理的数据有多长? 2. bx, si, di, bp:这四个寄存器,都可以放在"[...]"来进行内存单元的寻址,其他寄存器都不可以,就是这么规

答复学习汇编不顺利的准大学生

[来信] 老师.我是一名准软件工程大学生..我高2时学了C语言(皮毛),还有Java一部分,由于这样,高中成绩差,高3几乎没接触,暑假,我就网购一本汇编语言(我想学软件破解),看了3/4有人说就可以了我就开始学,发现教程根本就授人以鱼.失望了,就买了本c++ primer plus看了8章,然而学校开学开始学的是C语言,听说汇编语言对编程很有帮助,我就又想重学汇编,想到我校不需要学汇编,很矛盾.不知道怎么办 [回复] 很高兴能看到你有机会学习你感兴趣的专业.在你即将踏入大学校园之际,我想告诉你,

直接定址表(学习汇编)

1.我们可以使用一种标号,这种标号不但表示内存单元的地址,还表示了内存单元的长度,即表示在此标号处的单元,是一个字节单元,还是字单元,还是双字单元.如 a:db 1,2,3,4,5,6,7,8             改写为    a   db   1,2,3,4,5,6,7,8 b:dw  0                        改变为    b     dw   0 使用不带“:”的标号,它们是同时描述内存地址和单元长度的标号.这种标号包含了对单元长度的描述,所以,在指令中,它可以

int指令(学习汇编)

int指令 格式:int n n为中断类型码,它的功能是引发中断过程. CPU执行int n指令,相当于引发一个n号中断的中断过程,执行过程如下: 1)取中断类型码n: 2)标志寄存器入栈,IF=0,TF=0: 3)CS.IP入栈 4)(IP)=(n*4),(CS)=(n*4+2) 从此处转去执行n号中断的中断处理程序. 可以在程序中使用int指令调用任何一个中断的中断处理程序. assume cs:code code segment start:    mov ax,0b800h move s

更灵活的定位内存地址的方法(学习汇编)

1.and指令:逻辑与指令,按位进行与运算.与1不变,与0变0,可将对象相应位设为0. 2.or指令:逻辑或指令,按为进行或运算.或1变1,或0变0,可将对象位设为1. 3.[BX+idata]的几种表现形式: mov ax,[200+bx] mov ax,200[bx] mov ax,[bx].200 4.SI和DI是8086CPU中和Bx功能相似的寄存器,只是不能分成两个8位的寄存器来用. 5.[BX+SI]进行内存地址定位的几种形式: mov ax,[bx][si] mov ax,[bx+

标志寄存器(学习汇编)

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 NT IOPL OF DF IF TF SF ZF AF PF CF 未使用 嵌套标志 I/O权限标志占2位 溢出标志 方向标志 中断允许标志 单步标志 符号标志 零标志 未使用 辅助标志 未使用 奇偶标志 未使用 进位标志 1.CPU内部的寄存器中,有一种特殊的寄存器(对于不同的处理机,个数和结构都有可能不同)具有以下3种作用. (1)用来存储相关指令的某些执行结果: (2)用来为CPU执行相关指令提供行为依据: (3