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

Generating address of a instruction using Code Segment and Instruction Pointer

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

Consider the Code Segment Address to be FE00 and Instruction Pointer to be ABBE. How do we represent the generated address?

或者您将地址表示为

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

无论您如何选择,8086 上始终需要 2 个字大小的寄存器。

"The instruction pointer is an offset in the 64KB memory segment that starts at the linear address obtained from multiplying the value in the CS code segment register by 16 (same as shifting left 4 times)."

计算线性地址可能效率低下(但易于理解),如下所示:

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 那样做。所以 highWord - 冒号 - lowWord.

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