文章目录
上一节:02、汇编语言的前世今生
下一节:04、原书第2章习题
01、8086的通用寄存器
8086
的8个通用寄存器均为16位(2个字)的,其中A/B/C/D-X
可拆分为两个8位的寄存器AH、AL,BH、BL
等等:
课后习题:
02、8086的内存访问和字节序
8086
使用低端字节序进行内存访问和存储,从寄存器SI
中将C05B
存入地址0x02
处,则低字节5B
存入低地址0x02
处,高字节数据C0
存入高地址0x03
处。
课后习题:
03、程序的分段
A1
为操作码:将0C00
处的一个字传送到AX寄存器中;0603
为操作码:将AX
中的内容 加上 地址0C02
出的一个字,结果存在AX中;
04、程序的重定位
第一次将地址0x00
放入IPR
寄存器中,处理器将从IPR
中取地址去内存中取指令执行:
第一次执行完之后将当前指令的地址加上当前指令的长度为下一条指令的地址存入IPR
中,作为第二次执行的地址:
若程序的地址发生变化:
则程序中还使用原理0X0C00
、0X0C02
则会导致程序到错误的地址取指令执行,会发生错误。这是由于程序中使用的地址0X0C00
、0X0C02
均为绝对地址。使用绝对地址的程序不能在别的内存上正确的执行。
05、段地址和偏移地址
处理器增加一个DSR
寄存器用于存放数据的物理起始地址
。
原先的IPR
寄存器存放指令的物理起始地址
。
- 处理器使用
IPR
中的地址访问内存取指令执行 - 取得指令操作码
A1
表示传送指令,操作数0x0000
为偏移地址 - 处理器使用
偏移地址
+DSR寄存器内数据段起始地址
作为物理地址,开始执行传送指令。 - 执行完毕之后,
IPR
寄存器变为下一条指令地址。
06、8086内存访问困境
8086
中有20根地址线,可以访问2^20=1048576=1024K=1M
个地址:
但是8086
中的数据段寄存器DS
和代码段寄存器CS
均为16位,无法容纳20位。
07、8086选择段地址策略
8086
使用地址0xXXXX0
的地址空间做为有效地址- 如将
0x30CE0
右移4位(除以16)得到0x30CE
传入代码段寄存器CS
- 若取地址时,将
0x30CE
左移4位(乘以16)得到地址0x30CE0
作为有效地址。
08、8086使用段地址和偏移地址访问内存过程
- 使用
CS
内地址左移4位 + IP内偏移量 = 有效地址,以此来访问内存
- 使用
DS
内地址左移4位 + 指令中的内偏移量 = 有效地址 - 以此来访问内存,即将数
0x053C
送入AX
寄存器 - 同时
IP
指令指针寄存器中的地址自动加上当前指令的长度,变为下一条指令的偏移地址0x0003
09、逻辑地址和分段的灵活性
- 地址
0x22567
可以使用上图中的基地址
+偏移地址
的形式表示 - 其中
0x12560
不能作为基地址,因为此时的偏移地址位0x1007
超过了0xFFFF
,8086处理器表示不了
- 由于段内偏移地址最大位
0xFFFF
,所以段的最大长度为65535字节= 64KB