【汇编复习】地址与寻址

内存地址

每一个数据单元都对应一个物理地址
物理地址一共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+位移]

猜你喜欢

转载自blog.csdn.net/HGGshiwo/article/details/106989683