使用代码段和指令指针生成指令的地址

问题描述 投票:1回答:1

将代码段地址设为FE00,将指令指针设为ABBE。将代码段移位4位并添加指令指针将导致额外的进位。我们如何表示生成的地址?

x86-16 microprocessors real-mode memory-segmentation
1个回答
2
投票

将代码段地址设为FE00,将指令指针设为ABBE。我们如何表示生成的地址?

您将地址表示为

  • [0FE00h:0ABBEh,使用两个由冒号分隔并且始终为(段-冒号-偏移量)的16位数字的分段形式]
  • 00108BBEh,使用一个32位数字的线性形式

无论您选择什么,在8086上总是需要2个字长的寄存器。

指令指针是64KB存储段中的偏移量,该偏移量从线性地址开始,该线性地址是通过将CS 代码段寄存器中的值乘以16获得的(与向左移4次相同) )。“

像这样计算线性地址可能效率低下(但易于理解):

mov     ax, 0FE00h  ; The code segment
mov     dx, 16
mul     dx          ; "shifting the code segment by 4 bits"
add     ax, 0ABBEh  ; "adding the instruction pointer"
adc     dx, 0       ; Taking care of the additional carry

此线性地址00108BBEh使用2个寄存器AXDXAX寄存器将保留最低有效部分8BBEh,DX寄存器将保留最高有效部分0010h。如果需要引用整个寄存器对,则可以像DX:AX一样进行操作。如此高词-冒号-低词。

[与seg:off表示法不同,这只是一个32位数字,分配给2个寄存器,没有重叠的位置值。当我们谈论的是平坦的32位(或20位)数字而不是seg:off地址时,高半部分的低位的位置值为2 ^ 16。

© www.soinside.com 2019 - 2024. All rights reserved.