汇编:段寄存器和偏移寄存器

Assembly: Segment register & offset register

我无法理解 10H 值的来源?该示例表示 ds=1275H (?segment reg.) 和 bx:457H (?offset) 为什么 ds 乘以 10H。他们是否表示 1275 是十六进制值(所以十进制值是 4725)?

这里的关键词是"the segment register points to a 16 byte block of memory"。如果将整个内存排列成 16 字节的块,则段寄存器(例如 DS)将包含块的编号。

从段寄存器的值到线性地址,要乘以16,也就是十六进制数10,一般写成10H。

计算出段的起始地址后,加上偏移量寄存器。

是的,1275H 是一个十六进制数,这就是 "H" 所表示的。对应十进制4725。

The segment register points to a 16 byte block of memory...

这就是混乱的开始。段寄存器指向一个 65536 字节的内存块,偏移寄存器告诉要添加多少字节到这个 65536 字节块的开头。在 16 字节块的开头添加字偏移量是没有意义的!

这些 64KB 的块在内存中严重重叠。它们的起始地址仅相差 16 个字节!您可以将这些 64KB 块视为形成一个数组,然后段寄存器包含的内容是其元素的从零开始的索引。

因此,这些块之间的间距才是您所问的 10H 的真正含义。

为了得到内存位置的线性(实际)地址,我们需要将段寄存器中的值乘以 16(这在十六进制表示法中表示为 10h),然后加上偏移量。