zoukankan      html  css  js  c++  java
  • 汇编知识点总结

    • 预备知识

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

  • 相关阅读:
    Hibernate4
    Hibernate3 多对多关系
    Hibernate 二(一级缓存,多表设计之一对多)
    Hibernate 配置文件
    Hibernate 基础解析(Configuration,SessionFactory,Session,Transaction,Query,Criteria)
    struts2 防止表单的重复提交
    struts2 UI标签 和 主题
    struts2 OGNL配和通用标签和其它标签的使用
    struts2 对EL的改变
    struts2 contextMap
  • 原文地址:https://www.cnblogs.com/Xlgd/p/13769645.html
Copyright © 2011-2022 走看看