将代码段地址设为FE00,将指令指针设为ABBE。将代码段移位4位并添加指令指针将导致额外的进位。我们如何表示生成的地址?
将代码段地址设为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个寄存器AX
和DX
。 AX
寄存器将保留最低有效部分8BBEh,DX
寄存器将保留最高有效部分0010h。如果需要引用整个寄存器对,则可以像DX:AX
一样进行操作。如此高词-冒号-低词。
[与seg:off表示法不同,这只是一个32位数字,分配给2个寄存器,没有重叠的位置值。当我们谈论的是平坦的32位(或20位)数字而不是seg:off地址时,高半部分的低位的位置值为2 ^ 16。