目录
8086基本结构
LOOP、LOOPZ/LOOPE、LOOPNZ/LOOPNE
基础知识
语言特性比较
汇编语言
运行速度快、直接控制硬件、内存小
移植难、编写难、调试维护难、硬件相关度高、考虑细节多
高级语言
移植方便、易于掌握
不容易直接控制硬件、运行慢、目标程序大
常用数制
二进制、十六进制、BCD码、ASCII码
小端存储
存储时,数据高位在内存数据高位,数据低位存在内存低位
读取时,指针指向高位,往前读取
总线逻辑
地址线
寻址范围:8086处理器,寄存器16位,20根线。20位是用用两个16位合成(1个左移4位,相当于乘)可寻地址1M。
数据线
负责输入、输入数据的
控制线
控制读写的
80x86模式
实模式
64kb段长限制,因为寄存器的原因,最多只能处理16位偏移
保护模式
32条地址线全有效,二维转一维线性地址空间,分页机制转为物理地址4G
V86(略)
8086基本结构
通用寄存器
AX BX CX DX EX
段寄存器
CS DS SS
标志寄存器
OF/CF寄存器:溢出,有符号数/无符号数算术是否溢出
DF寄存器:方向,0 低位向高位(CLD),1 高位向低位(STD)
IF寄存器:中断允许,0/1,禁止/允许其他的可屏蔽中断
TF寄存器:跟踪,0/1,关闭/打开单步中断
SF寄存器:标志,1,运算结果为负
ZF寄存器:零
AF寄存器:调整,0/1,运算时最低的byte(比如al)无/有进位、借位
PF寄存器:奇偶,0/1,运算后的值二进制中, 1 的个数为偶数/基数
CF寄存器:进位,CF可以用进位标志,CLC置 0 ,STC置 1
指针寄存器
BP,SP,SI,DI(BX不算,但可以拿来用)
·BX,SI,DI 默认: DS 段寄存器
·BP 默认: SS 段寄存器
·只有 4 个寄存器可以以 […] 的方式使用,这四个寄存器分别是 BX,SI,DI,BP(SP不可以)
寻址
寻址方式
不细讲,需要补学自己看书
段寻址
注意:可使用任何寻址方式,直接寻址除外
段内寻址
段内直接:jmp L1
段内间接:jmp bx
段间寻址
跨CS寻址,不会
传送指令
通用数据传送
MOV
MOVSX:根据符号为扩展,后面的操作数必须是寄存器
MOVZX:补零扩展,后面的操作数必须是寄存器
XCHG :要交换两个内存,要用寄存器临时存储
PUSH
从高位开始,BP逐渐指向低位
BP最小减少2(1 byte )
POP
SS:SP固定为堆栈指令使用的逻辑地址
默认DS、CS、SS初始值相同,SP指向段尾部,避免和顶部冲突,若想更多避免冲突,可以在程序前面声明设置堆栈段:stack segment:......stack ends
累加器(AX/AL)专用数据传送
可以直接传送端口,也可以用寄存器间接传送
IN
in al,22h
in ax,22h
OUT
out al,22h
out ax,22h
地址传送
LEA:机器指令,程序运行时由指令实现
OFFSET :伪指令,汇编程序实现
区别
1)
·LEA BX, BUFFER 在实际执行时才会将变量buffer的地址放入bx
·MOV BX, OFFSET BUFFER 在编译时就已经计算出buffer的地址为4300(假设),然后将上句替换为: mov bx,4300
2)
·LEA可以进行比较复杂的计算,比如lea eax , [esi+ebx*4],把ebx的值*4,加上esi的值,存入eax中。mov不行了。
·OFFSET只对标号、变量有效
·MOV BX,OFFSET [BX+200]这句是错误的 应该用LEA BX,[BX+200]
3)
mov reg,offset xxx 比 lea reg,xxx长度稍一个字节,快一个时钟
类型转换
CBW:AL扩展为AX
CWD:AX扩展为DX:AX
CWDE:AX扩展为EAX
CDQ:EAX扩展为EDX:EAX
算术指令
加法
ADD
ADC:带进位加法
INC
减法
SUB
SBB:带借位减法
DEC
NEG:求反,0 减操作数
CMP:对比,不改变寄存器,改变标志位
运算调整
放在 ADD/SUB 等指令后
AAA / DAA:ASCII / 十进制加法调整(实现 24H+24H = 48H)
AAS / DAS:ASCII / 十进制减法调整
对标志位
ZF、SF
CF
OF:算术运算+有符号结果无法容纳,OF置 1 ,刻画了符号位的非正常变化
乘法除法
操作数需要为寄存器
MUL / IMUL
隐含被乘 AL / AX / EAX
存放位置 AX / DX:AX / EDX:EAX
DIV / IDIV
隐含被除 AX / DX:AX / EDX:EAX
存商位置 AL / AX / EAX
余数位置 AH / DX / EDX
对标志位
CF、OF
00 : 表示没有用到高位,高位为 0 / 高位为低位符号扩展
11 : 用到高位了,高位有数 / 高位有数字有符号
逻辑指令
逻辑运算
AND:与
OR:或
NOT:非,不影响标志位
XOR:异或,取反
TEST:测试,进行逻辑与运算,不保存结果,影响标志位置
对标志位
CF、OF 置 0
SF 根据运算结果最高位
PF 根据运算结果 1 个数
位测试
BT
BT AX,12 将 AX 的 12 位拷贝到 CF
BTS / BTR / BTC
逻辑位移
SHL / SAL
低位补 0 , 高位进 CF
SHR / SAR
高位补 0 / 高位不变,低位进 CF
SAR向值小的方向取值,IDIV向靠近零的方向取值
SHLD / SHRD
双精度移动 SHLD BX,AX,4 只影响BX,不影响AX
ROL / ROR
高位进CF / 低位进CF
RCL / RCR
CF 值进低位,高位进CF / CF 值进高位,低位进CF
注意第一次移动时 CF 的设置
对标识位
位移指令
ZF / SF / PF
CF :最后移出的一位
OF : 只移动 1 位时置 0
循环位移指令
OF / CF
位扫描(386)
扫描SRC(源操作数)二进制形式的 1 ,并返回位数到 DST(目标操作数)
BSF(bit scan forward)
从低 0 位,往高扫
BSR(bit scan reverse)
从高 31 位,往低扫
对标志位
找得到,ZF = 0
找不到,ZF = 1
串处理
串指令
MOVSB/W/D
ESI->EDI / DS:SI->ES:DI ,执行后两者移动同样单位
DF = 0 / 1 , 地址移动方向 = 递增 / 递减
CMPSB/W/D
比较 ESI、EDI,执行后两者移动同样单位
DF 决定地址移动方向
影响 ZF
SCASX
寻找 AL、AX、EAX 里的值,找到 ZF = 1
一同调整 SI 、DI 的值
STOSX / LODSX / INSX / OUTSX
重复前缀
REP CMPSB / MOVSB / ...
重复串指令直至 ECX 内容为 0
REPE / REPZ
ECX =0 or ZF = 0 停止
REPNE / REPNZ
ECX =0 or ZF = 1 停止
控制转移
JMP指令
JMP short:短位移
JMP @f / @b :移到下一个 / 上一个@@符号处
JMP word / dword PTR [bx] / ds:[0] :只改变IP的段内转移 / 改变 CS:IP 的段间转移
LOOP、LOOPZ/LOOPE、LOOPNZ/LOOPNE
CX 的为 0 + ZF 为 1 / ZF 不为 1
CALL、RET
CALL 时 PUSH CS:IP
RET 时 POP CS:IP
INT、INTO、IRET
INT 触发中断
INTO 根据OF 是否为 1 触发 4 号中断
IRET 中断返回指令,用于结束中断的处理程序