汇编知识点总结

  • 预备知识

    • 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端口寄存器

posted on 2020-10-05 11:38  Xlgd  阅读(453)  评论(0编辑  收藏  举报