内存地址
每一个数据单元都对应一个物理地址
物理地址一共20位,即5个16进制位
表示的时候分为段地址和偏移地址
物理地址=段地址
×
\times
× 16+偏移地址
段地址有五位,但是用四位十六进制数表示,因为最后一位一定是0
因为段地址不能随意选取,只能从最后一位是0的地址中选
偏移地址用四位十六进制数表示,是段首
比如地址04005h
表示为0400:0005h
或者0399:0015h
都行
算的时候:400h*10h+5h=4005h
或者是399h*10h+15h=4005h
一个段长度最大为64k,1000h字节,可以少于64k
如果不会超64k,则在程序一开始对段寄存器赋值完就行了
如果会超64k,还得修改段寄存器的值
内存的分配一般是由操作系统完成的,地址不一定需要连续分配
段长度=段尾地址-段首地址+1
也可用寄存器表示,比如ds:bx
表示data段偏移为bx的位置,引用值的时候把偏移地址括起来。ds:[bx]
表示该地址的中的数据内容。
内存内容
一个存储单元可以放一个字节的内容(两位十六进制数)
如果是字类型或者双字类型的,是将存储内容从后往前写写入内存,比如1234h
写入内存时是先写34h
再写12h
,而整个数据的地址等于最后一个字节的地址。
内存地址 | 内存内容 |
---|---|
3100:0000h | 31h |
3100:0001h | 2Fh |
3100:0002h | 32h |
3100:0003h | E6h |
… | … |
则字节31h
,字2F31h
,双字E6322F31h
的地址均为3100:0000
总结一下:数据以字节为单位倒着写入内存(低地址存入低字节)。地址是数据最后一个字节的位置(低地址)。
地址前修饰
如word ptr
,byte ptr
,为了确定变量的类型。
如果变量的类型确定,则可以省略,比如mov ax, word ptr es:[bx]
,由于mov
指令两个操作数类型相同,所以变量的类型其实已经确定,可以省略。变为mov ax, es:[bx]
直接寻址
偏移地址用立即数(常数)表示,比如
mov ds:[10ABh], al
mov bx, es:[8B90h]
sub byte ptr ss:[0FFC0h], 1
add word ptr cs:[10D0h], 2
间接寻址
间接寻址的偏移地址由寄存器表示。
偏移地址=基址寄存器(bx或bp)+变址寄存器(si或di)+位移量(8位或16位符号数)
选用两个寄存器时,bx不能和bp组合,si不能和di组合
几种间接寻址方式
1.[bx+位移]
完整的应该是ds:[bx+位移]
,因为这种寻址方式段地址默认是ds所以可以省略
2.[bx+si+位移]
基本规律:
寄存器必须用方括号括起来,位移可加括号可不加,
位移若在寄存器之后且不带括号,必须加上加号,[bx+si]+位移,[bx]+[si]+位移,[bx]+[si]+[位移],[bx][si]+位移
位移在寄存器之后带方括号,可省略加号,[bx][si][位移],
位移若在寄存器之前,可省略加号
位移+[bx+si],位移[bx+si],,位移+[bx][si],位移[bx][si],位移+[bx]+[si],位移[bx]+[si]
3.[bx+di+位移]
4.[si+位移]
5.[di+位移]
6.[bp+位移]:凡是包含bp的,省略的段地址:ss
7.[bp+si+位移]
8.[bp+di+位移]
寄存器间接寻址:[bp],[bx],[si],[si]
寄存器相对寻址:形如[bp+位移]
基址寻址:形如[bp+si]
基址相对寻址:形如[bp+si+位移]