汇编第三章内容复习
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寄存器
通用寄存器: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。

浙公网安备 33010602011771号