1字=2字节
1字节=8比特/位/存储单元
CWD:AX扩展至DX:AX,即16位到32位
CBW:AL至AX,即8位到16位
CWDE:AX至EAX,即16位到32位
CDQ:EAX至EDX:EAX,即32位至64位
以上皆是符号扩展
SUB:减法
SBB:带借位的减法
ADD:加法
ADC:带进位的加法
MUL:无符号乘法
IMUL:带符号乘法
SHL:无符号数乘2
SAL:带符号数乘2
寻址方式:
通常DS与DX或BX或SI配合使用,ES与BX或DI配合便用。LDS或LES指令是将双字的内存单元的值同时装载到段地址:段偏移寄存器中,低字值装入偏移、高字值装入段地址。
例如1:
LDS BX, addr1
LES DI, addr2
例如2:
LES指令的功能是:把内存中指定位置的双字操作数的低位字装入指令中指定的寄存bai器、高位字装入ES寄存器。
因为ds:[BX]中的低位字的内容是:0520H、高位字的内容是:4800H,
所以,指令LES DI,[BX] 执行后,(ES)=4800H,(DI)=0520H
这两个数不是算出来的,而是取出来的
例如3:
2300地址存放 34 12 78 56 LDS #$2300 ;
之后 DS=5678 SI=1234 没有指定接收寄存器,就用内定SI寄存器
通用寄存器:AX,BX,CX,DX
变址寄存器:SP,BP,SI,DI
专用寄存器:IP,SP
段寄存器:CS,DS,ES,SS
这里有三个概念 :
1 物理地址
2.逻辑地址(有效地址)
3.偏移地址
从起始地址开始向前偏移05H个字节的地址是0F05H, 0F05H是偏移地址,05H是偏移量 这个偏移有向前偏移和向后偏移两种情况,就是一个加减偏移量的过程
BX,DI,SI:DS
BP:SS
DS是数据段,SS是堆栈段。数据一般默认是存放在DS数据段,当涉及到SP和BP指针运算时,数据就在SS段中
CS)=1000H,(DS)=2000H,(ES)=3000H,(SS)=4000H,操作数[1000H]寻址方式是_ ,物理地址是?
1. 栈顶物理地址可以通过栈基址ss与栈顶偏移sp得到: pa = ss * 10h(16d)+ sp = 4000h * 10h + 200h = 40200h;
2. 由于引用[bx]的段寄存器默认为ds,此时存储器指针偏移为bx,因此其物理地址可以通过ds与bx得到:pa = ds * 10h(16d)+ bx = 2000h * 10h + 300h = 40300h;
3. es:[bx+si]。此时引用的段寄存器为es,其存储器指针偏移为bx + si,因此物理地址可以通过es和bx与si之和得到:pa = es * 10h(16d)+ bx + si = 3000h * 10h + 300h + 500h = 30800h;
4. 当前指令所在的物理地址通过cs与指令指针ip得到: pa = cs * 10h(16d)+ ip = 1000h * 10h + 100h = 10100h,则下一条执行指令的地址为10101h(实际上需要根据下一条指令生成的机器码位宽来决定ip跳过几个内存单元)。
在80x86里 总线接口部件BIU 提供了16双向数据总线 20位地址总线 8086最大寻址1MB的存储空间 但是在CPU 内部寄存器结构都是16位 显然不能满足20位的地址寻址要求 所以就将1MB的空间 划分出若干个逻辑段 每个段最大位64KB 段用一个段地址来标识 段寄存器就是用来存放段的起始地址的 因此 物理地址 由段地址 和 段内偏移量地址两部分组成 有效地址是这样表示的:xxxx:yyyy 前四位是段的起始地址 后四位是 在本段内的偏移地址 就是偏移量 这就是逻辑地址 而物理地址是20位的 它是怎样得到的呢? 使段地址左移一位 这样就成了xxxx0 然后在加上yyyy 这个偏移地址 就得到了 所谓的物理地址了 这样就得到了公式: 物理地址=段地址*16(就是相当于左移一位)+偏移地址;
操作ax的时候就是直接用ax中的值,[ax]是将ax中的值当作一个地址,然后将这个地址对应该内存中的值来操作。比如mov bx,ax是将ax中的值给bx, mov bx,[ax],是将内存中ds段ax这个偏移地址中的那个值给bx
举个例子:
mov ax,1234 ;立即数寻址
mov [1000],ax 存储器直接寻址
mov bx,1002 ;立即数寻址
mov byte ptr[bx],20 ;基址寻址
mov dl,39 ;立即数寻址
inc bx ;寄存器寻址
mov [bx],dl ;基址寻址
dec dl ;寄存器寻址
mov si,3 ;立即数寻址
mov [bx+si],dl ;基址加变址寻址
mov [bx+si+1],dl ;基址+变址+立即数寻址
mov word ptr[bx+si+2],2846 ;基址+变址+立即数寻址
3.3.2加减法:
溢出标志:OF,超出1否则0, OV/NV
方向标志:DF,减量1加量0, DN/UP
中断标志:IF,允许1关闭0, EI/DI
符号标志:SF,负1否则0, NG/PL
零标志:ZF,0为1否则0, ZR/NZ
进位标志:CF,进位1否则0, CY/NC
辅助进位标志:AF,第三位有进位1否则0, AC/NA
奇偶标志:PF,偶数1否则0, PE/PO
1、CF(进位标志) =1 算术操作最高位产生了进位或借位 =0 最高位无进位或借位
2、PF(奇偶标志) =1 数据最低8位中1的个数为偶数 =0 数据最低8位中1的个数为奇数
3、AF(辅助进位标志) =1 D3→D4位产生了进位或借位 =0 D3→D4位无进位或借位
4、ZF(零标志) =1 操作结果为0 =0 结果不为0
5、SF(符号标志) =1 结果最高位为1 =0 结果最高位为0
6、OF(溢出标志) =1 此次运算发生了溢出 =0 无溢出
例如8位二进制数相加:1001 1100B+0001 1000B 结果为 1011 0100B 此时无进位CF=0,PF=1,AF=1,ZF=0,SF=1,OP=0。
原文:https://www.cnblogs.com/spring-autumn-bj/p/14141815.html