首页 > 其他 > 详细

汇编复习

时间:2020-12-16 09:38:23      阅读:50      评论:0      收藏:0      [点我收藏+]

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寄存器

例题:

若(DS:ADDR)= 7856 1234H

LES  DI,ADDR

指令的执行结果是:

(  ES )= (    ) H,(DI)=(   ) H

 第一空: 

7856;7856H

第二空: 

1234;1234H

 

通用寄存器: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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!