预备知识
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值,最高一位为校验位。
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
交换指令,XCHG OPR1,OPR2,执行(OPR1) <-> (OPR2),不影响标志位;不允许使用段寄存器;只能在寄存器之间或寄存器与寄存器之间交换信息。
累加器专用传送指令(只限于使用AX或AL)
输入指令,IN AL/AX,PORT,执行AL/AX <- PORT
输出指令,OUT PORT,AL/AX,执行PORT <- AL/AX
换码指令,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端口寄存器
原文:https://www.cnblogs.com/Xlgd/p/13769645.html