汇编第三章内容复习

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位

以上皆是符号扩展

通用数据传送指令

WORD PTR    操作符,用以指出其后的寻址方式所取得的转向地址是一个字的有效地址,也就是说是一种段内转移
MOV        传送
MOVSX        带符号扩展传送
MOVZX        带零扩展传送
PUSH        进栈
POP        出栈
PUSHA/PUSHAD    所有寄存器进栈
POPA/POPAD    所有寄存器出栈
XCHG        交换

累计器专用传送指令

IN  输入

OUT  输出

XLAT  换码

地址传送指令

LEA  有效地址送寄存器

LDS  指针送寄存器和DS

LES  指针送寄存器和ES

LFS  指针送寄存器和FS

LGS  指针送寄存器和GS

LSS  指针送寄存器和SS

类型转换指令

CBW  字节转换为字

CWD/CWDE  字转换为双字

CDQ  双字转换4字

BSWAP  双字转换(前后互换)

算数指令

1、加法指令

ADD:加法

ADC:带进位的加法

INC:加1

XADD:交换并相加

2、减法指令

SUB:减法

SBB:带借位的减法

DEC:减1

NEG:求补

CMP:比较

CMPXCHG:比较并交换

CMPXCH8B:比较并交换8字节

3、乘法指令

MUL:无符号乘法

IMUL:带符号乘法

 4、除法指令

SHL:无符号数乘2

SAL:带符号数乘2

逻辑指令

1、逻辑运算指令

AND  逻辑与

OR  逻辑或

NOT  逻辑非

XOR  异或

TEST  测试

2、位测试并修改指令

BT  位测试

BTS  位测试并置1

BTR   位测试并置0

BTC  位测试并变反

3、位扫描指令

BSF  正向位扫描

BSR   负向位扫描

4、位移指令

SHL  逻辑左移        

SAL  算数左移

SHR  逻辑右移

SAR  算数右移

ROL  循环左移

ROR  循环右移

RCL  带进位循环左移

RCR  带进位循环右移

SHLD  双精度左移

SHRD  双精度右移

串处理指令

MOVS  串传送

CMPS  串比较

SCAS  串扫描

LODS  从串取

STOS  存入串

INS  串输入

OUTS  串输出

控制转移指令

1、无条件转移指令

段内直接短转移:  JMP  SHORT  OPR

段内直接近转移:  JMP  MEAR  OPR

段内间接近转移:  JMP  WORD  PYR  OPR

段间直接远转移:  JMP  FAR  PTR  OPR

段间间接远转移:  JMP  DWORD  PTR  OPR

2、条件转移指令

JZ:  结果为零或相等则转移

JNZ:  结果不为零或不相等则转移

JS:  结果为负则转移

JNS:  结果为正则转移

JO:  溢出则转移

JNO:  不溢出则转移

JP:  奇偶位为1则转移

JNP:  奇偶位为0则转移

JB:  低于,或者不高于或等于,或进位为1则转移

JNB:  不低于,或者高于或等于,或进位为0则转移

比较两个无符号数,并根据比较结果转移、

JB:  <

JNB:  >=

JBE:  <=

JNBE:  >

比较两个带符号数,并根据比较结果转移

JL:  <

JNL:  >=

JLE:  <=

JNLE:  >

JCXZ:  CX寄存器的内容为零则转移

JECX:  ECX寄存器的内容为零则转移

3、条件设置指令

(1)、根据单个条件标志的值把目的字节置1

SETZ:  结果为0或相等则目的字节置1

SETNZ:  结果不为0或不相等则目的字节置1

SETS:  结果为负则目的字节置1

SETNS:  结果为正则目的字节置1

SETO:  溢出则目的字节置1

SETNO:  不溢出则目的字节置1

SETP:  奇偶位为1则目的字节置1

SETNP:  奇偶位为0则目的字节置1

SETC:  进位为1,或低于,或不高于或等于则目的字节置1

SERNC:  进位为0,或不低于,或不高于或等于则目的字节置1

(2)、比较两个无符号数,并根据比较的结果把目的字节置1

SETB:  低于,或不高于或等于,或进位为1则目的字节置1

SETNB:  不低于,或高于或等于,或进位为0则目的字节置1

SETBE:  低于或等于,或不高于则目的字节置1

SETNBZ:  不低于或等于,或高于则目的字节置1

(3)、比较两个带符号数,并根据比较结果把目的字节置1

SETL:  小于,或大于或等于则把目的字节置1

SETNL:  不小于,或大于或等于则目的字节置1

SETLE:  小于或等于,或不大于则目的字节置1

SETNLE:  不小于或等于,或大于则目的字节置1

4、循环指令

LOOP:  循环

LOOPZ/LOOPE:  当为零或相等时循环指令

LOOPNZ/LOOPNE:  当不为零或不相等时循环指令

5、子程序

CALL:  调用

RET:  返回

6、中断

INT:  中断指令

INTO:  若溢出则中断指令

IRET:  从中断返回指令

IRETD:  从中断返回指令  

处理机控制与杂项操作指令

1、标志处理指令

CLC:  进位位置0指令

CMC:  进位位求反指令

STC:  进位位置1指令

STD:  方向标志位置0指令

STD:  方向标志位置1指令

CLI:  中断标志置0指令

STI:  中断标志置1指令

2、其他处理机控制与杂项操作指令

NOP:  无操作

HLT:  停机

ESC:  换码

WAIT:  等待

LOCK:  封锁

BOUND:  界限

ENTER:  建立堆栈帧

LEAVE:  释放堆栈帧

寻址方式:

通常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,5
寄存器寻址方式: MOV AX,BX
直接寻址方式: MOV AX,[2000H]
寄存器间接寻址方式: MOV AX,[BX]
寄存器相对寻址方式: MOV AX,[COUNT+SI]即[COUNT]+[SI]
基址变址寻址方式: MOV AX,[BX][DI]
相对基址变址寻址方式:MOV AX,MASK[BX][DI]
比例变址寻址方式: MOV EAX,COUNT[ESI*4]
基址比例变址寻址方式: MOV ECS,[EAX][EDX*8]
相对基址比例变址寻址方式: MOV EAX,TABLE[EBP][EDI*4]


段内直接寻址
JMP NEAR PTR PROGIA
JMP SHORT QUEST
段内间接寻址
JMP BX 即 (IP)=BX

JIMP WORD PTR[BP+TABLE]
段间直接寻址
JMP FAR PTR NEXTROUTINT
段间间接寻址
JMP DWORD PTR[EDI]

 

举个例子:

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。 

 

posted @ 2020-12-16 00:25  Spring_Autumn  阅读(359)  评论(1)    收藏  举报