汇编知识点总结
-
预备知识
-
2^8 = 256,2^16 = 65536,2^20 = 1048576
-
1K = 2^10 = 1024,1M = 2^20 = 1024K,1G = 2^30 = 1024M
-
比特(bit)= 1位,字节(byte)= 8bit,字(word)= 2byte = 16bit
-
二进制B,八进制O,十进制D,十六进制H及它们之间的转换和运算
-
-
数和字符的表示
-
原码:符号 + 绝对值
-
反码:正数的反码同原码,负数的反码数值位与原码相反
-
补码:正数补码同原码,负数补码为其对应的正数补码按位取反后加一所得
-
补码的加法和减法
-
求补运算:对一个二进制数按位求反后末位加一
-
加法规则:[X + Y]补码 = [X]补码 + [Y]补码
-
减法规则:[X - Y]补码 = [X]补码 + [Y]补码
-
-
字符表示:ASCII码,用一个字节来表示一个字符,低七位为字符的ASCII值,最高一位为校验位。
- ‘A’ -> 41H,'a' -> 61H,'1' -> 31H,换行 -> 0AH,回车 -> 0DH,空格 -> 20H
-
-
8086寄存器组
-
通用寄存器
-
数据寄存器,暂存计算过程中所用到的操作数、结果或其他信息,可以用字(16位)的形式访问,也可以用字节(8位)的形式访问。
-
AX,作为累加器用,它是算术运算的主要寄存器,在乘除等指令中指定用来存放操作数。
-
BX,在计算存储器地址时,它经常用作基址寄存器。
-
CX,常用来保持计数值,如在移位指令、循环指令和串处理指令中* 用作隐含的计数器 *。
-
DX,在作双字长运算时把DX和AX组合在一起存放一个双字长数,DX用来存放高位字,此外对某些I/O操作,DX可用来存放I/O的端口地址。
-
-
SP-堆栈指针寄存器,存放栈顶的偏移地址,BP-基址指针寄存器,它们可以与堆栈段寄存器SS联用来确定堆栈段中的某一存储单元。
-
SI-源变址寄存器和DI-目的变址寄存器,它们可以和数据段寄存器DS联用来确定数据段中某一存储单元的地址,分别指向数据段中的源操作数和目标操作数。
-
-
专用寄存器
-
IP-指令指针寄存器,存放代码段中的偏移地址,始终指向下一条即将执行的指令的首地址。
-
SP-堆栈指针寄存器,它与堆栈段寄存器联用来确定堆栈段中栈顶的地址,SP存放栈顶的偏移地址。
-
FLAGS-程序状态寄存器,存放条件码标志、控制标志和系统标志。
-
OF-溢出标志,为1则为溢出。
-
SF-符号标志,为1则为负。
-
ZF-零标志,为1则结果为0。
-
CF-进位标志,为1则最高有效位有进位。
-
AF-辅助进位标志
-
PF-奇偶标志,为1则操作数中1的个数为偶数。
-
DF-方向标志,为1时则每次操作使变址寄存器SI和DI减小,为0则使其增大。
-
IF-中断标志,为1时,允许CPU响应可屏蔽中断请求。
-
TF-陷阱标志,用于调试时的单步方式操作。
-
-
-
段寄存器
-
CS-代码段寄存器,存放当前正在运行的程序,不能在用户程序中直接修改
-
DS-数据段寄存器,存放当前运行程序所用的数据,如果使用了串处理指令,则其源操作数也存放在数据段中
-
SS-堆栈段寄存器,定义了堆栈的所在区域,以后进先出的方式访问
-
ES-扩展段寄存器,是辅助的数据区,也是串处理指令的目的操作数存放区
-
-
-
存储器
-
以字节为单位存储信息,地址是用二进制来表示,同一个地址既可看作字节单元的地址,又可看作字单元的地址
-
一个字要占用相继两个字节,低位字节存入低地址,高位字节存入高地址,机器以偶地址访问存储器
-
每一个存储器单元都有一个唯一的20位地址,称为其物理地址,20位物理地址由16位段地址和16位偏移地址组成,段地址是每一段的起始地址,低四位一定是0,所以就可以只用取其高16位值,偏移地址是在段内相对于段起始地址的偏移值,所以:物理地址 = 16d * 段地址 + 偏移地址
-
-
外部设备
-
数据寄存器,存放外设和主机间传送的数据
-
状态寄存器,保存外设或接口的状态信息
-
命令寄存器,保存CPU发给外设或接口的控制命令
-
专用的I/O指令:IN、OUT;BIOS和DOS功能调用
-
-
8086的寻址方式
-
立即寻址,操作数在指令中给出(MOV AL, 5),只能用于源操作数字段,源操作数与目的操作数的字长一致
-
寄存器寻址,操作数在指定的寄存器中(MOV AX, BX),源操作数与目的操作数的字长一致,CS不能用mov指令改变
-
直接寻址,有效地址EA由指令直接给出,EA即操作数的偏移地址,段默认为DS数据段,物理地址PA = 16d × (DS) + EA;可使用段跨越前缀(MOV AX, ES:[2000H])
-
寄存器间接寻址,EA在基质寄存器(BX/BP)或变址寄存器(SI/DI)中,MOV AX, [BX] : PA = 16d * (DS) + (BX),不允许使用AX、CX、DX存放EA,源操作数与目的操作数的字长一致,适用于数组、字符串、表格的处理
-
寄存器相对寻址,EA = (BX)/(BP)/(SI)/(DI) + 16/32位移量,MOV AX,COUNT[SI],适用于数组、字符串的处理
-
基址变址寻址,EA = (BX)/(BP) + (SI)/(DI),MOV AX,[BX][DI],适用于数组、字符串、表格的处理,必须是一个基质寄存器和一个变址寄存器的组合
-
相对基址变址寻址,EA = (BX)/(BP) + (SI)/(DI) + 16/32位移量,MOV AX,MAS[K[BX][SI],适用于堆栈处理、数组和表格处理
-
比例变址寻址,EA = (ESI)/(EDI) * 比例因子 + 32位移量,MOV EAX,COUNT[ESI*4],适用于32位寻址
-
基址比例变址寻址,EA = (EBX)/(EBP) + (ESI)/(EDI) * 比例因子,MOV ECX,[EBX][EDI*8),适用于32位寻址
-
相对基址比例变址寻址,EA = (EBX)/(EBP) + (ESI)/(EDI) * 比例因子 + 32位移量,适用于32位寻址
-
与转移地址有关的寻址方式,段内转移时CS不变,段间转移CS变化
-
段内直接寻址
-
段内间接寻址
-
段间直接寻址
-
段间间接寻址
-
-
-
8086指令系统
-
数据传送指令
-
通用数据传送指令
-
传送指令,MOV DST,SRC,执行(DST) ← (SRC), DST不能是CS;不影响标志位;DST、SRC不同时为段寄存器;立即数不能直接送段寄存器。)
-
进栈指令,PUSH SRC,执行(SP) <- (SP) - 2,((SP + 1),(SP)) <- (SRC)
-
出栈指令,POP DST,执行(DST) <- ((SP) + 1,(SP)),(SP) <- (SP) + 2
- 堆栈:“先进后出”的存储区,存在于堆栈段中,SP在任何时候都指向栈顶;堆栈操作必须以字(16位指令)或双字(32位指令)为单位;不影响标志位;不能用立即寻址方式;DST不能是CS。
-
交换指令,XCHG OPR1,OPR2,执行(OPR1) <-> (OPR2),不影响标志位;不允许使用段寄存器;只能在寄存器之间或寄存器与寄存器之间交换信息。
-
-
累加器专用传送指令(只限于使用AX或AL)
-
输入指令,IN AL/AX,PORT,执行AL/AX <- PORT
-
输出指令,OUT PORT,AL/AX,执行PORT <- AL/AX
- 不影响标志位,前256个端口号00H -- FFH可直接在指令中指定(长格式)
-
换码指令,XLAT/XLAT OPR,执行(AL) <-> ((BX) + (AL)),不影响标志位,字节表格长度不超过256,需转换代码
-
-
地址传送指令
-
有效地址传送寄存器指令,LEA REG,SRC,执行(REG) <- SRC
-
指针送寄存器和DS指令,LDS REG,SRC,执行(REG) <- (SRC), (DS) <- (SRC + 2)
-
指针
-
-
标志寄存器传送指令
-
类型转换指令
-
CBW,AL -> AX,若(AL)最高有效位为0,则(AH) = 00H,若(AL)最高有效位为1,则(AH) = 0FFH
-
CWD,AX -> (DX, AX),若(AX)最高有效位为0,则(DX) = 0000H,若(AX)最高有效位为1,则(DX) = 0FFFFH
-
-
-
算术指令
-
加法指令
-
ADD DST,SRC
-
带进位加法,ADC DST,SRC
-
加一,INC OPR
-
除INC指令不影响CF标志外,均对条件标志位有影响
-
-
减法指令
-
SUB DST,SRC
-
带借位减法,SBB DST,SRC
-
减一,DEC OPR
-
求补,NEG OPR(按位取反加一)
-
比较,CMP OPR1,OPR2,执行(OPR1) - (OPR2)
-
除DEC指令不影响CF标志外,均对条件标志位有影响
-
-
加法减法,AX和CX为低位,DX和BX为高位(DX AX) (BX CX)
-
乘法指令
-
无符号数乘法指令,MUL SRC,字节操作数以AL为乘数,AX存积;字操作数以AX为乘数,DX AX 为积
-
带符号数乘法指令,IMUL
-
SRC不能为立即数
-
除CF和OF外,对条件标志位无定义,而CF和OF又表示乘积对字长
-
-
除法指令
-
无符号数除法指令,DIV SRC,字节操作AL存AX/SRC的商,AH存余数,字操作AX存(DX AX)/SRC的商,DX存余数
-
带符号数除法指令,IDIV
-
SRC不能为立即数
-
对所有条件标志位均无定义
-
-
-
逻辑指令
-
逻辑运算指令
-
逻辑非,NOT OPR
-
逻辑与,AND DST,SRC
-
逻辑或,OR DST,SRC
-
异或,XOR DST,SRC
-
测试,TEST OPR1,OPR2
-
-
移位指令
-
逻辑左移,SHL OPR,CNT(无符号数乘二),移出的那一位进CF,空出来对位补0
-
逻辑右移,SHR OPR,CNT(无符号数除二),移出的那一位进CF,空出来对位补0
-
算术左移,SAL OPR,CNT(带符号数乘二),效果和逻辑左移一样
-
算术右移,SAR OPR,CNT(带符号数除二),移出的那一位进CF,空出来对位补符号位
-
循环左移,ROL OPR,CNT,移出对那一位进CF
-
循环右移,ROR OPR,CNT,移出的那一位进CF
-
带进位循环左移,RCL OPR,CNT,CF也加入循环
-
带进位循环右移,RCR OPR,CNT
-
-
-
串处理指令
-
配合使用对前缀有:REP(重复),REPE/REPZ(相等/为零 则重复),REPNE/REPNZ(不相等/不为零则重复),都需要跟CX计数器配合使用
-
串操作对准备工作(以串传送为例,其他有相应简化)
-
初始化DS,初始化ES
-
源串首地址(末地址)-> SI
-
目的串首地址(末地址)-> DI
-
串长度 -> CX
-
建立方向标志(CLD使DF = 0,地址由低到高;STD使DF = 1,地址由高到低)
-
-
串传送指令(与REP配合工作),MOVS DST,SRC(MOVSB,MOVSW,MOVSD),执行((DI)) <- ((SI)),将数据段中的整串数据传送到附加段中,源串(数据段)-> 目的串(附件段)
-
存入串指令(与REP配合工作),STOS DST(STOSB,STOSW,STOSD),执行((DI)) <- (AL)
-
从串取指令,LODS SRC(LODSB,LODSW,LODSD),执行(AL) <- ((SI)),一般不与REP联用,源串必须在数据段中,目的串必须在附件段中,但源串允许使用段跨越前缀来修改,不影响条件标志位
-
串输入指令(等于批量的IN),INS DST,DX(INSB,INSW,INSD),执行(DI) <- ((DX))
-
串输出指令(等于批量对OUT),OUTS DX,SRC(OUTSB,OUTSW,OUTSD),执行((DX)) <- (SI)
-
串比较指令(与REPE配合工作),CMPS SRC,DST(CMPSB,CMPSW,CMPSD),执行((SI)) - ((DI)),根据比较结果设置条件标志位:相等ZF = 1,不等ZF = 0,最后(SI),(DI)中为不同字符对下一个地址,(CX)中为剩下还未比较的字符个数
-
串扫描指令(与REPNE配合工作),SCAS DST(SCASB,SCASW,SCASD),执行(AL) - ((DI)),最后(DI)中为相匹配字符的下一个地址,(CX)中为剩下还未比较对字符个数
-
-
控制转移指令
-
无条件转移
-
段内直接短转移,JMP SHORT OPR,执行(IP) <- (IP) + 8位位移量,SHORT默认可省略
-
段内直接近转移,JMP NEAR PTR OPR,执行(IP) <- (IP) + 16位位移量
-
段内间接转移,JMP WORD PTR OPR,执行(IP) <- (EA)
-
段间直接(远)转移,JMP FAR PTR OPR,执行(IP) <- OPR对段内偏移地址,(CS) <- OPR所在段的段地址
-
段间间接转移,JMP DWORD PTR,执行(IP) <- (EA),(CS) <- (EA + 2)
-
-
条件转移
-
只能使用段内直接寻址对8位位移量,根据单个条件标志位对设置情况转移
-
JZ(JE) OPR,测试条件ZF = 1
-
JNZ(JNE) OPR,测试条件ZF = 0
-
JS OPR,测试条件SF = 1
-
JNS OPR,测试条件SF = 0
-
JO OPR,测试条件OF = 1
-
JNO OPR,测试条件OF = 0
-
JC OPR,测试条件CF = 1
-
JNC OPR,测试条件CF = 0
-
-
循环指令
-
CX中存放循环次数,只能使用段内直接寻址的8位位移量
-
LOOP OPR,测试条件(CX) != 0
-
LOOPZ(LOOPE) OPR,测试条件ZF = 1且(CX) != 0
-
LOOPNZ(LOOPNE) OPR,测试条件ZF = 0且(CX) != 0
-
执行步骤:(CX) <- (CX) - 1,检查是否满足测试条件,如满足则(IP) <- (IP) + 8位位移量,实行循环;不满足则IP不变,退出循环
-
-
子程序调用和返回指令
-
CALL调用指令
-
RET返回指令
-
NEAR属性:调用程序和子程序在同一代码段中(段内调用)
-
FAR属性:调用程序和子程序不在同一代码段中(段间调用)
-
子程序的参数传送
-
寄存器传送
-
存储器传送
-
地址表传送
-
堆栈传送
-
多模块之间对参数传送
-
-
-
中断指令
-
INT TYPE或INT,中断指令
-
INTO,溢出中断指令
-
IRET,从中断返回指令
-
-
-
处理机控制指令
-
-
汇编语言上机过程
-
Edit编辑源文件
-
Masm汇编源文
-
Link链接文件
-
用debug调试生成的exe文件
-
反馈,修改源文件,循环
-
-
输入输出程序设计
-
设置中断向量,AH = 25H,AL = 中断号,DS:DX = 中断向量,INT 21H,无返回
-
取中断向量,AH = 35H,AL = 中断号,INT 21H,最后ES:BX = 中断向量
-
键盘IO,当键盘上“按下”或“放开”一个键时,如果键盘中断是允许的,就会产生一个9号中断,扫描码(一个字节)入60H端口寄存器
-