1、通用寄存器的一般用途
一、操作数包含在指令中--立即数寻址
操作数从指令代码中立即得到,即立即数(Immediate),用常量形式直接表达,因此操作数存储在 代码段(CS)中。
例:MOV AX, 1100H
注 意!
只能用于源操作数 ()
MOV 40H, AL (AL不能给一个常数值)
源操作数和目的操作数的字长必须一致
MOV AH, 3064H (AX为16位寄存器,AH和AL分别为AX的高八位和低八位,而操作数3064H有16位)
二、操作数在存储器中 --存储器寻址
1.直接寻址
例:MOV CX,[1000H];
(1)指令中直接包含了操作数的有效地址EA,在指令操作码之后;
(2)默认段地址在DS寄存器中,即操作数的实际地址(物理地址)是DS:EA
DS:EA的意思是物理地址 = DS*16+EA。
若DS = 2000H,则物理地址 = 2000H*16 + 1000H = 21000H。
2.寄存器间接寻址
(1)操作数的有效地址EA存放在基址寄存器或变址寄存器。不能放在AX\CX\DX中;
(2)可以方便地对数组的元素或字符串的字符进行操作;
(3)寄存器间接寻址没有说明存储单元类型;
操作数的段地址(数据处于哪个段,代码段、数据段…)取决于选择哪一个间址寄存器:物理地址 = 段地址*16 + 简直寄存器地址。
例:MOV AX,[BX];其中(DS)=2000H,(BX)=0100H;
则源操作数的物理地址为:2000H*16+0100H = 20100H(该地址和20101H两个地址一起存储着16位的字,20101H存储高8位,20100H存储低8位)。
3.寄存器相对寻址
- 有效地址是寄存器内容与位移量之和;
- 适用于数组、字符串、表格的操作。
例:MOV BX,1100+[BX](或者写成MOV BX,1100[BX]) ; (DS)=2000H,(BX)=0100H,
物理地址 = 2000H*16 + 0100H = 20100H。
4.基址变址寻址
有效地址是基址寄存器和变址寄存器之和;
注意:必须是一个基址寄存器和一个变址寄存器的组合
MOV AX, [BX][BP](BX: 基址寄存器;BP: 基址指针寄存器)
MOV AX, [SI][DI](SI: 源变址寄存器;DI: 目的变址寄存器)
例:MOV AX,[BX][SI];
物理地址 = 段地址*16 + BX + SI;
5.相对基址变址寻址
例:MOV AX,MASK[BX][SI];(或者MOV AX, [BX+SI+MASK]或 MOV AX, MASK[BX+SI])
物理地址 = 段地址*16 + BX + SI + MASK;
三、总结
1.汇编语言 SI DI BX BP SS DS 是什么
SI: 16位寄存器,源变址寄存器
DI: 16为寄存器,目的变址寄存器
BX: 16位寄存器(可分成2个8位寄存器BH,BL),基址寄存器
BP: 16位寄存器,基址指针寄存器
SS : 16位段寄存器,作用是存放当前堆栈段的段地址,一般和SP连用
DS: 16为段寄存器, 作用是存放当前数据段的段地址
2.怎样根据这些求物理地址
有个公式: 物理地址 = 基础地址 + 偏移地址 = CS*10H(基础地址)+ IP(偏移地址)
CS: 16位段寄存器,存放当前代码段的段地址
IP: 存放下一条要执行的指令的偏移地址
有问题欢迎交流!!!!