段-寄存器这种格局是早期硬件电路限制留下的一个伤疤。地址总线在当时有20-bit。然而20-bit的地址不能放到16-bit的寄存器里,这意味着有4-bit必须放到别的地方。因此,为了访问所有的内存,必须使用两个16-bit寄存器。这一设计上的折衷方案导致了今天的段-偏移量格局。最初的设计中,其中一个寄存器只有4-bit有效,然而为了简化程序,两个寄存器都是16-bit有效,并在执行时求出加权和来标识20-bit地址。偏移量是16-bit的,因此,一个段是64KB。下面的图可以帮助你理解20-bit地址是如何形成的:
段-偏移量标识的地址通常记做 段:偏移量 的形式。由于这样的结构,一个内存有多个对应的地址。例如,0000:0010和0001:0000指的是同一内存地址。又如,0000:1234 = 0123:0004 = 0120:0034 = 0100:0234| 2EA8:D678 26CF:8D5F 453A:CFAD 2933:31A6 5924:DCCF 694E:175A 2B3C:D218 728F:6578 68E1:A7DC 57EC:AEEA |
| ;;; 应该得到一个29字节的.com文件 .MODEL TINY .CODE CR equ 13 LF equ 10 TERMINATOR equ "$" ORG 100h Main PROC mov dx,offset sMessage mov ah,9 int 21h mov ax,4c00h int 21h Main ENDP sMessage: DB "Hello, World!" DB CR,LF,TERMINATOR END Main | ; .COM文件的内存模型是‘TINY’ ; 代码段开始 ; 回车 ; 换行 ; DOS字符串结束符 ; 代码起始地址为CS:0100h ; 令DS:DX指向Message ; int 21h(DOS中断)功能9 - ; 显示字符串到标准输出设备 ; int 21h功能4ch - ; 终止程序并返回AL的错误代码 ; 程序结束的同时指定入口点为Main |