关于汇编语言存储器的分段 一小段的首地址是啥?段起始地址?怎么看出来16个字节是一小段?

如题所述

8086CPU的内存寻址方式是段地址*16+偏移地址的方式的方式 比如说00000H这个地址,他的段地址是0000H偏移地址是0000H。段地址0000h*16(10H)也就是00000H 加上偏移地址也是0000H就是00000H。一个段的空间最大是64KB 也就是偏移地址从0000H-FFFFH。有一点要注意:段地址*16必然是16的整数倍所以一个段的起始地址也应该是16的整数倍。但是好像并没有一个小段 的说法,段的提出只是我们在编程中的一种安排,比如我要在一个段中存放10个字节的数据,我们可以把123B0H-123B9H当作一个数据段,段地址为123BH,长度为10字节。
温馨提示:内容为网友见解,仅供参考
第1个回答  2019-08-27
我是这样理解的:
汇编语言中,给存储器分段后会产生若干个段,每个段可以存储的数据大小为64KB,即64K个字节(1K=1024)。为了标识这些字节,可以采用为字节编码的方式,也就是给不同字节赋予不同的地址。为了完全标识它们,共需要2^16位二进制编码。(64KB=2^6*2^10B=2^8*2^8B,一个字节完全表示需要8位二进制编码)
好了,已经对段采用地址表示的方法了,那么怎么让地址有规律可循呢?就想到让段有一个起始地址,往后按照线性增长依次延续。在这里又可将段分成小段,每个小段包含16个字节,而这16个字节可按16进制编码从0编到F。此时一个段就有很多个小段。
当将段地址用16进制表示时,与刚编好的小段字节编码合并,可表示成5位16进制编码。则将段的起始地址用段中某一小段的首地址(即最后一位为0的)表示。
这样,你就会发现段和小段的关系以及地址编码的原理。
(纯粹自己理解,还望专业人士指教)
第2个回答  2013-03-15
王爽的书吗? 写的不是很清楚嘛,从0到F为1小段。0就是段首地址,也是段起始地址。0到F 就是16个数啊。追问

16个字节不是16×8个二进制数么 ?怎么五位一组呢?抱歉我实在混乱啊

追答

你似乎混淆了几个概念:
1. 一个字节是8个二进制数没错。但是内存在编址的时候不是每个二进制数都有地址的。8个二进制数是一个字节,他有个地址。比如你这里面,第二小段00010H,这指的不是哪一个二进制数,它指的就是8个二进制数,00010H指的就是一个字节,也就是说8个二进制数合在一起用00010H来标识。
2.在汇编语言中,因为会用到10进制,二进制,16进制,所以规定,用D表示10进制,B表示二进制,H表示16进制。这里00010H 是一个16进制的数,写成二进制就是0000 0000 0000 0001 0000B,它表示的是内存中的一个存储单元。与这个内存单元中存放的是什么没有关系。就像人的名字一样,cpu用这个数来定位到内存中的一块区域。比如mov al,[00010H] cpu在执行这句指令时,就会去内存中找名称为00010H的内存单元。然后把这个内存单元存储的数复制到al中。
简单的说,字节是内存编址的最小单位,也是cpu对内存操作的最小单位

本回答被提问者采纳

关于汇编语言存储器的分段 一小段的首地址是啥?段起始地址?怎么看出 ...
8086CPU的内存寻址方式是段地址*16+偏移地址的方式的方式 比如说00000H这个地址,他的段地址是0000H偏移地址是0000H。段地址0000h*16(10H)也就是00000H 加上偏移地址也是0000H就是00000H。一个段的空间最大是64KB 也就是偏移地址从0000H-FFFFH。有一点要注意:段地址*16必然是16的整数倍所以一个...

汇编中的首地址是什么意思?比如目的首地址?
首地址一般指一段数据的第一个数在存储器中的地址,比如:table:db 33h,22h,23h,42h...那么33h所在地址就是首地址。

汇编语言中,一般人说的第一个字节是从高位数起,还是低位数起?
汇编语言中,一般所说的第一个字节是指按照存贮地址偏移量最小的字节,对应数据的最低位字节;通信协议中,串行传输时,是从一个帧的首部开始依次传送,一般从高位数起;16位寄存器传输32位数值,根据32为数值的存储顺序,低位字在前,高位字在后,所以应该是先传低16位,后传高16位数据。

汇编语言中,一般人说的第一个字节是从高位数起,还是低位数起?
汇编语言中,一般所说的第一个字节是指按照存贮地址偏移量最小的字节,对应数据的最低位字节;通信协议中,串行传输时,是从一个帧的首部开始依次传送,一般从高位数起;16位寄存器传输32位数值,根据32为数值的存储顺序,低位字在前,高位字在后,所以应该是先传低16位,后传高16位数据。

汇编语言中,为什么经常要求数据段的起始地址必须为16的倍数?
段起始地址是20位二进制,想要把20位的地址放入16位的寄存器,并且能寻址整个内存空间,所以设计者考虑把20位中高16位放入,这样习惯上把段的起始地址放在低4位为0的位置上XXXXXXXXXXXXXXXX0000,这是20位二进制地址,你看看这个地址是不是被16整除。当然这不是必须,原则上段可以放在任何空间。

汇编语言中数据段与偏移的问题
段地址*16”的值为16(即10H)的倍数,即 20000H - FFF0H = 10010H 10010H\/10H = 1001H 此时“段地址*16”取得最大值10010H;所以段地址能取得的最大值是1001H 最大 当偏移量为0000H时,SA可取最大值 20000H - 0000H = 20000H 20000H\/10H = 2000H ...

汇编语言中,堆栈段是否只能定义大于16个字节大小的空间,能否定义少于1...
在 8088\/8086 系统中,每个段最小是16字节,最大是64K字节。选用不同的大小范围,都要以 16 字节的整数倍进行。因为,在计算物理地址的时候,有一个““段地址乘以16””的步骤。

关于汇编语言的一道简单题
PARTNO DW ? 这一句是定义内存空间,占用一个字,即两个字节 PNAME DB 16 DUP(?)这一句是定义16个字节内存空间。COUNT DD ? 这一句是定义一个双字占4个字节内存空间.PLENTH EQU $-PARTNO 这一句是定义一个常数PLENTH,它的大小等于当前地址-PARTNO地址 也就等于2+16+4=22,其中$代表当前地址...

汇编语言 物理地址问题
这个答案是错误的,正确的是:7E814H。1、先计算数据区末字的偏移地址 16个字占20H字节的内存空间,0DDF6H+20H=DE16H,这是末字数据后面的偏移地址,末字的偏移地址为DE16H-2=DE14H。2、再计算末字的物理地址 物理地址=段地址*10H+偏移地址=70A0H+DE14H=7E814H。

汇编语言中定义的数据段的问题
类型 常量 那么结果就是把常量的值赋给变量。如果是这种形式:变量名1 dw 变量名2 那么结果就是变量名1 = 变量名2在段内的偏移地址。如果是这种形式:变量名1 dd 变量名2 那么结果就是变量名1的高16位是变量名2的段地址,低16位是变量名2在段内的偏移地址。就是这么规定的,记住就行了。

相似回答