以下我们从端口开始讲:
1. 各种存储器都是CPU的地址线、控制线、数据线相连。CPU在操作他们的时候都把他们当做内存来对待,把他们总的看做一个逻辑内存器,这个逻辑存储器我们成为内存地址空间。
2. 和CPU通过总线相连的芯片除了各种存储器之外,还有以下3种芯片:(每种芯片上都有各自的寄存器,他们通过芯片与CPU进行相连)
(1) 各种接口卡(如网卡、显卡)上的接口芯片,他们控制接口卡进行工作。
(2) 主板上的接口芯片,CPU通过其对部分外设进行控制。
(3) 其他芯片,用来存储相关的系统信息,或进行相关的输入输出处理。
3. 可见从CPU的角度,将上述芯片中的寄存器都当做端口,进行统一编址。从而建立了一个统一的端口地址空间。每一个端口在地址空间都有一个地址。
4. 综上,CPU可以直接读写三个地方的数据:内部寄存器、内存单元、端口。
5. CPU通过端口地址来定位端口。CPU最多可以定位64K个不同的端口。即端口地址范围是0——65535
6. 向端口中读或写命令我们其实是向端口所在的芯片中读或写数据。用到的指令是in 和out分别表示CPU读入和向端口写入数据。并且CPU内部管接送数据的寄存器必须是ax和al。 如: in ax,60h out 60h,al
7. 逻辑移位指令:
shl逻辑左移 其功能为:将寄存器中的值左移一位 将最后移出的一位写入CF 空缺位补零 若只移动一位 格式为shl ax,1;若移动位数大于1则位数必须放在cl中,格式为mov cl,3 shl ax,cl
shr逻辑右移 与逻辑左移相对应,类似。
8. Cmos ram中存储了时间信息,有年月日时分秒六个方面的信息,每个都是由一个字节存放。且是BCD码存放的,一个字节便可以存放一个两位数。
9. 对于coms ram中的信息进行读写我们需要知道所对应的端口地址。对于coms地址端口是 70h地址端口 71h数据端口 当我们读取cmos中的数据时,我们向70h端口中写入地址再通过这个地址将71h端口中的数据读取到CPU中 in 71h,ax out bx,71h
10. 对于外中断,是指外部设备向中央处理器发出中断信息,而此时CPU必须处理此。并且CPU也是通过端口和外部设备进行通信,本质上就是通过与外设中的内部芯片联系。 外中断的中断类型码是通过数据总线传送到CPU的而不是CPU内部产生的。
11. 外中断源可以分为两类一是可屏蔽中断一种是不可屏蔽中断
可屏蔽中断 CPU既可以相应它也可以不响应它。判断的依据就是标志寄存器中的IF的值。IF=1则相应此可屏蔽中断 IF=0则不响应。 自此我们也终于理解到了IF置零的原因:在进入其他的中断程序之后执行中断例程时IF是零,这样就禁止了其他的可屏蔽中断的发生。 当然如果我们要想认为处理可屏蔽中断可以置IF为1,可以用指令sti置1 cli置0
不可屏蔽中断 对此,其中断类型码固定为2,所以在中断过程中,不需要再取终端类型码。
实际上对于外设引起的中断,几乎都是可屏蔽中断。
12.关于可以表示单元长度的标号:以前我们在使用标号(如a b s start code 等)的时候,这些标号表示的都是这段数据在内存中的地址。此外我们还可以用这样一种可以表示单元长度的标号:见P288此种标号定义时就不同。 没有冒号
Code segment
a db 1,2,3,4,5,6,7,8,9 标号a表示code:0和从这个内存单元开始所有的内存单元都是字节型的。指令 mov al,a[bx+si+3] 相当于 mov al,cs:0[bx+si+3] 以后我们称此种标号为数据标号,如此我们便可以方便地访问内存中的数据。
13.我们的数据一般是不在代码段中定义的,而是放入其他段中。而数据的定义的标号也是用数据标号。在代码段中习惯用带冒号的标号。
14. 如P290如果在一个程序的代码段中想直接用数据标号引用数据就必须用伪指令assume来指定寄存器与段的对应关系。否则编译的时候系统无法知道标号所在的段地址在哪一个寄存器中。我们这样做的目的只不过是通知给编译器,为其行方便。
15.编译器下的小真相:mov al,a[si] 编译为 mov al,[si] mov b[8],bx 编译为mov [8],bx
16. 我们还可以将标号当做数据来定义,此时标号所表示的数据时标号所在的地址。
如 data segment
A db 2,3,4,5,6,6,
B dw 4,5
C dw A,B ;相当于c dw offset a,offset b
Data ends
此时C这个标号处存储着这样两个数据:A和B的偏移地址。
再比如: data segment
A db 2,4,5,5,6,6,5
B dw 0,3,4,5,56,7,7
C dd a,b ;相当于C dw offset a,seg a,offset b,seg b
Data ends
此时,C处存储的两个双字数据 分别是A和B的偏移地址和段地址。
Seg操作符就是取段地址的指令。
17.见P296,利用表的对应关系我们可以实现很实用的映射对应关系。从而提高程序的效率。
表的实用不仅可以应用于数据的对应也可以用于调用子程序的标号存储。
18.对于磁盘来所逻辑扇区和物理扇区有一个对应关系:
逻辑扇区数=(面号*80+磁道号)*18+扇区号-1
以3.5寸软盘为例 2面*80磁道*18扇区*512B 总约1.44MB
19.关于反码补码我们在这里还要多说一句:我们在记的的时候可以用自己习惯的方式:
正数的反码和补码都是它本身;负数的反码是符号位不变,其余位取反,补码为其反码加1。
在这里我们还要记忆一个特性以帮助我们快速判断任意一个负数的补码:
正数的补码取反加1为其对应负数的补码;负数的补码取反加1为其绝对值。
对于补码我们也可以观察到这样一个特点:从-128到127补码都是逐渐增加的。
-128补10000000 -1补11111111
20.。补码为有符号的运算提供了方便,运算后的结果仍满足补码规则。即补码也可以直接运算。
21.。