Git Product home page Git Product logo

edu-note's Introduction

𝔻𝕠𝕞𝕚𝕟𝕚𝕔 𝕄𝕚𝕟𝕘

Crazy Domy's on fire 🔥, but I still got it alright ✋!

edu-note's People

Stargazers

 avatar

Watchers

 avatar  avatar

edu-note's Issues

汇编期末复习

汇编期末复习

来自汇编ppt

第一章 预备知识

汇编语言定义

  • 汇编源程序

    • 用汇编语言编写的程序——类似于高级语言编写的源程序
  • 汇编程序

    • 把汇编源程序翻译成目标程序的(语言加工)程序——类似于高级语言的编译程序
  • 汇编

    • 汇编程序对源程序进行翻译的过程 —— 类似于高级语言的编译过程

80x86微处理器结构

  • 数据寄存器组(EAX,EBX,ECX,EDX)
    • EAX (累加器)Accumulator
    • EBX (基址寄存器)Base
    • ECX (计数寄存器)Count
    • EDX (数据寄存器)Data
  • 指示器变址寄存器组(ESI、EDI、ESP、EBP)
    • ESP(Stack Pointer),称为堆栈指示器,存放的是当前堆栈段中栈顶的偏移地址;
    • EBP(Base Pointer),为对堆栈操作的基址寄存器;
    • ESI(Source Index),称为源变址寄址器;字符串指令源操作数的指示器
    • EDI(Destination Index),称为目的变址寄存器;字符串指令目的操作数的指示器
  • 段寄存器:低档处理器保存段首地址,高档处理器保存选择字
    • 代码段寄存器 CS
    • 堆栈段寄存器 SS
    • 数据段寄存器 DS
    • 附加段寄存器 ES
    • 附加段寄存器 FS
    • 附加段寄存器 GS
  • 标志寄存器用来保存在一条指令执行之后,CPU所处状态的信息及运算结果的特征
  • 16位标志寄存器:FLAGS
  • 32位标志寄存器:EFLAGS

标志位

  • 符号标志SF
    • 若运算结果为负则SF=1,否则SF=0;
    • 这里负是指运算结果的最高位为1则SF=1
  • 零标志ZF
    • 若运算结果为0则ZF=1,否则ZF=0
  • 溢出标志OF
    • 当将操作数作为有符号数看时,使用该标志位判断运算结果是否溢出。
  • 进位标志CF
    • 将操作数看作无符号数时,使用该标志位判断运算结果是否发生了进位或者借位
  • 奇偶标志位PF
    • 当运算结果(指低8位)中1的个数为偶数时,PF置1,否则置0。该标志位主要用于检测数据在传输过程中的错误。
  • 辅助进位标志位AF
    • 标识作字节运算的时候低半字节向高半字节的进位和借位。有进位和借位时AF置1 ,否则置0。
  • 奇偶标志位PF
    • 当运算结果(指低8位)中1的个数为偶数时,PF置1,否则置0。该标志位主要用于检测数据在传输过程中的错误。
  • 辅助进位标志位AF
    • 标识作字节运算的时候低半字节向高半字节的进位和借位。有进位和借位时AF置1 ,否则置0。
  • 方向标志DF
    • 控制串操作指令的处理方向。DF=0,地址递增(从低地址向高地址变化),DF=1,地址递减(从高地址向低地址变化)
  • 中断允许标志IF
    • 控制CPU是否允许响应外设的中断请求。IF=0,关中断(CPU屏蔽外设的中断请求)IF=1,开中断(CPU响应外设的中断请求)
  • 跟踪(单步)标志TF
    • 控制单步执行。TF=0,CPU连续工作TF=1,CPU单步执行

汇编程序举例

.386
;数据段
DATA   SEGMENT USE16  ;段为16位段
 SUM    DW  ?   ;SUM为字变量,初值不定
DATA   ENDS
;堆栈段 
STACK SEGMENT USE16 STACK;段名和组合类型
      DB 200 DUP(0) ;定义堆栈为200个字节
STACK ENDS
;代码段
CODE  SEGMENT  USE16
      ASSUME  CS:CODE, SS:STACK,DS:DATA
START: MOV  AX,DATA
       MOV  DS,AX  ;数据段首址送DS
      MOV  CX,50   ;循环计数器置初值
      MOV  AX,0    ;累加器置初值
      MOV  BX,1    ;1→BX
NEXT:ADD  AX,BX   ;(AX)+(BX)→AX
      INC  BX
      INC  BX       ;(BX)+2→BX
      DEC  CX       ;(CX)-1→CX
      JNE   NEXT    ;(CX)≠0转NEXT
      MOV  SUM,AX  ;(CX)=0累加结果→SUM
      MOV    AH,4CH
      INT    21H     ;返回DOS
CODE  ENDS
      END   START   ;源程序结束语句。程序运行时,启动地址为START。 


第二章 寻址方式

立即寻址方式

  • 使用格式:n(n为常数或数值表达式,称为立即数)
  • 功能:n本身就是操作对象,它作为指令的一部分,与指令一起在主存的代码段中。
  • 说明:
    • 立即数只能作为指令的源操作数,不能作为目的操作数;
    • 立即数不能作为单操作数指令的操作数;
    • 立即数本身只有大小,没有类型;
    • 立即寻址方式主要用于给寄存器或存储单元赋值。

寄存器寻址方式

  • 使用格式:R ;R为CPU中寄存器名。
  • 功能:操作对象在CPU的寄存器R中。(不是在主存中)

直接寻址方式

  • 使用格式:段寄存器名:[EA] (“段寄存器:”称为段跨越前缀)
    或:含有变量的地址表达式
    • 其中:偏移地址EA的形式为常数或者数值表达式。
  • 功能:操作对象在主存指定的段中。EA值与包含它的指令码一起存放在内存的代码段中。

寄存器间接寻址方式

  • 使用格式:[R]
    R为16位寄存器BX,BP,SI,DI之一;或是32位寄存器:EAX,EBX,ECX,EDX,EDI,ESI,EBP,ESP之一。不能是8位寄存器。
  • 功能:操作对象在主存中;操作对象的EA在CPU的R中。

变址寻址方式

  • 使用格式:[RF+V] (或写成:[RF]+V, 或V[R*F])
  • 功能:操作对象在主存中,其相对段首址的偏移地址 EA=(R)*F+V;
  • 其中:
    • R的规定同寄存器间接寻址中R的规定
    • F为指定的比例因子,可为1,2,4或8。当R为16位寄存器或ESP时,F只能取1并省略不写。
    • V为16位(R为16位寄存器)或32位(R为32位寄存器)的二进制补码;或者是数值表达式、变量或标号名。

基址加变址寻址方式

  • 使用格式:[BR+IRF+V]
    (或写成:V[BR][IR
    F], 或 V[BR+IR*F])
  • 功能:操作对象在内存中,其EA=(BR)+(IR)*F+V。此种寻址格式与变址寻址的区别仅仅多了一项BR寄存器,称为基址器。

第三章 宏汇编语言

宏汇编语言的基本语法

  • 常量
    • 符号常量的定义:
      • 等价伪指令 EQU
      • 等号伪指令 =
  • 数值表达式
  • 地址表达式
    • DW 地址表达式
      当地址表达式含变量名时,初值取变量EA;
    • DD 地址表达式
      当地址表达式含变量名时,初始值取变量的EA,变量所在段的段首址
  • 数据定义伪指令
    • .BYTE (字节) DB
    • .WORD (字) DW
    • .DWORD (双字) DD
    • .FWORD (3个字) DF
    • .QWORD (4个字) DQ
    • .TBYTE (10个字节) DT
  • 标号
    • 标号的段属性:标号的段属性是指定义该标号所在段
      的段首址。
    • 标号的偏移地址:标号的偏移地址是指它所在段的段
      首址到该标号所代表存储单元的字节距离。
    • 标号的类型: 分NEAR(近)和FAR(远)两类型,近
      标号在定义该标号的段内使用,远标号无此限制。
  • 地址表达式
    • 地址表达式是由变量、标号、常量、寄存器(名加方括号)及一些运算符(数值表达式的运算符和特殊运算符)所组成的有意义的式子。
  • 类型运算符PTR
    • 类型 PTR 地址表达式
      类型可以是BYTE、WORD、DWORD、FWORD、NEAR、FAR
  • 属性分离算符
    • a.取段址算符SEG
      • 格式:SEG <变量或标号>
      • 功能:分离出其后变量或标号的段首址。
    • b.取偏移算符OFFSE
      • 格式:OFFSET <变量>
      • 功能:分离出其后变量或标号的偏移地址。

常用的机器指令语句

一般数据传送指令

  • 一般传送指令 MOV
    • MOV OPD, OPS
    • (OPS)→OPD (字或字节)
    • 说明:
      • 不能实现存贮单元之间的直接数据传送,OPS、OPD不能同时采用存贮器寻址方式。
      • 不能向CS送数据;IP不能在任何语句中出现。
      • OPS和OPD必须类型一致。
      • 立即数不能直接传递至数据段或者附加数据段寄存器中;
  • 有符号数传送指令 MOVSX
    • 将源操作数的符号向前扩展成与目的操作数相同的数据类型再送入目的地址。
  • 无符号数传送指令 MOVZX
    • 将源操作数的高位全部补0,扩展成与目的操作数相同的数据类型再送入目的地址中

数据交换指令

  • 一般数据交换指令 XCHG
    • 可作八位或十六位交换。
  • 查表转换指令 XLAT
    • ([BX+AL])→ AL或([EBX+AL])→AL将(BX)或(EBX)为首址,(AL)为位移量的字节存贮单元中的数据→AL

传送偏移地址指令

  • LEA OPD,OPS
  • 按OPS的寻址方式计算EA,将EA送入指定的通用寄存器
  • OPD一定要是16位/32位的通用寄存器
  • OPS一定是一个存贮器地址,可是寄存器间接寻址、基址加变址、变址寻址、直接寻址。
  • 如果偏移地址为32位而OPD为16位寄存器,取低16位→OPD;
  • 如果偏移地址为16位而OPD为32位寄存器,高16位补0后→OPD

算术运算指令

  • ADD OPD,OPS
    • 该指令对标志寄存器的标志位有影响。
  • SUB OPD,OPS
    • (OPD) — (OPS) →OPD
  • CMP OPD,OPS
    • 比较目的操作数与源操作数,然后根据比较的结果设置标志位,但该结果并不存入目的地址
  • NEG OPD (求补)
  • IMUL OPD, OPS(,n)
    • OPD可为16/32的寄存器,OPS为同类型的寄存器、存储器操作数或立即数。
  • IMUL OPS
    • (AL)*(OPS)→AX
    • (AX)*(OPS)→DX,AX
    • (EAX)*(OPS)→EDX、EAX
    • 如果乘积的高位(字节相乘指AH,字相乘指DX,双字相乘指EDX)不是低位的符号扩展,即在AH(或DX/EDX)中包含有乘积的有效位,则CF=1、OF=1;否则,CF=0,OF=0。
  • DIV OPS
    • (AX)/(OPS)→AL(商) 、AH(余数)
    • (DX、AX)/(OPS)→AX(商)、DX(余数)
    • (EDX、EAX)/(OPS)→EAX(商)、EDX(余数)
  • CBW
    • 将AL中的符号扩展至AH中, 操作数隐含且固定
  • CWD
    • 将AX中的符号扩展至DX中,由 DX,AX组成双字

位操作指令

  • AND OPD, OPS
    • (OPD) ∧ (OPS)  —>  OPD
      
  • TEST OPD,OPS
    • 检测与源操作数中为1的位相对应的目的操作数中的那几位是否为0(或为1),根据测试结果置OF、CF、SF、ZF位,后面往往跟着转移指令,根据测试结果确定转移方向。Zz谈(⊙o⊙)?4她吧
  • OR OPD, OPS
    • (OPD) ∨ (OPS) —> OPD
  • XOR OPD, OPS
    • 异或
  • SHL OPD, n 或 SAL OPD, n
    • 将OPD的内容向左移动n指定的位数,低位补入相应个数的0。CF的内容为最后移入位的值,移动方式为
  • SHR OPD,n
    • 将(OPD)向右移动n规定的次数,最高位补入相应个数的0,CF的内容为最后移入位的值。
  • SAR OPD, n
    • 将OPD中的操作数移动n所指定的次数。且最高位保 持不变。CF的内容为最后移入位的值。
  • ROL OPD, n
    • 将目的操作数的最高位与最低位连接起来,组成一个环,将环中的所有位一起向左移动n所规定的次数。CF的内容为最后移入位的值。
  • ROR OPD,n
    • 该指令的移动方式完全同ROL,只是向右移动。
  • RCL OPD,n
    • 将目的操作数连同CF标志一起向左循环移动所规定的次数。
  • RCR OPD,n
    • 该指令的移动方式完全同RCL,只是向右移动。

伪指令语句

  • 段定义伪指令
    段名 SEGMENT  [使用类型] [定位方式] [组合方式] [‘类别’]
    ...
    段名 ENDS
    
    
    • 定义一个以SEGMENT伪指令开始、ENDS伪指令结束的、给定段名的段。
  • 假定伪指令
    • ASSUME 段寄存器:段名[,段寄存器:段名] …

系统功能调用

  • 键盘输入(1号调用)
    • 等待从键盘输入一个字符→AL,同时将此字符在屏
      幕上显示出来。
  • 显示输出(2号调用)
    • 将DL中的字符在屏幕上显示出来。
  • 输出字符串(9号调用)
    • 将当前数据段中指定的(DS:DX)字符串输出(该字符串必须以‘$’为结束符,且字符’$’不输出)
  • 字符串输入(0AH号调用)
    • 从键盘接收一个以回车为结束的字符串到当前数据段输入缓冲区中,并在屏幕上回显示,同时将输入字符实际个数n填入缓冲区第二字节中。如n>49则响铃,多余字符被丢掉。

第四章 程序设计的基本方法

简单条件转移

JZ / JE       ZF=1时,转移
JNZ / JNE     ZF=0时,转移
JS            SF=1时,转移
JNS           SF=0时,转移
JO            OF=1时,转移
JNO           OF=0时,转移
JC            CF=1时,转移
JNC           CF=0时,转移
JP / JPE      PF=1时,偶转移
JNP / JPO     PF=0时,奇转移

符号数条件转移指令

JA / JNBE   短标号
     当 CF=0 且 ZF=0时,转移

JAE / JNB   短标号
     当 CF=0 或者 ZF=1时,转移

JB / JNAE   短标号
     当 CF=1 且 ZF=0时,转移

JBE / JNA   短标号
     当 CF=1 或者 ZF=1时,转移

有符号数条件转移指令

JG / JNLE   短标号
     当 SF=OF 且 ZF=0时,转移

JGE / JNL   短标号
     当 SF=OF 或者 ZF=1时,转移

JL / JNGE   短标号
     当 SF≠OF 且 ZF=0时,转移

JLE / JNG   短标号
     当 SF≠OF 或者 ZF=1时,转移

无条件转移指令

JMP 标号/OPD

循环程序的结构和控制方法

  • LOOP 标号
    • (CX / ECX) -1  CX / ECX
      若 (CX / ECX) 不为0, 则转标号处执行。
      等价于
      DEC CX / ECX
      JNZ 标号
  • JCXZ 标号 / JECXZ 标号
    • 若 (CX / ECX) 为0, 则转标号处执行。(先判断,后执行循环体时,可用此语句,标号为循环结束处)
  • LOOPE /LOOPZ 标号
    • 若 (CX / ECX) 不为0, 且ZF=1,则转标号处执行。DEC CX
  • LOOPE /LOOPZ 标号
  • LOOPNE /LOOPNZ 标号
    • 若CX / ECX)≠0, 且ZF=0,则转标号处执行

子程序

子程序名  PROC  NEAR 或者 FAR
          ……
                       ……
子程序名  ENDP
  • 调用
    • 段内直接 CALL 过程名
    • 段间直接 CALL FAR PTR 过程名
    • 段内间接 CALL WORD PTR OPD
    • 段间间接 CALL DWORD PTR OPD
  • 返回
    • RET
    • RET,n

第五章 程序设计的其它方法与技术

字符串操作指令

  • MOVS/W/B/D OPD,OPS
    • (DS:[SI]/[ESI]) → ES:[DI]/[EDI]
    • 修改串指针,使之指向下一元素。修改方式为:
      • 当DF=0时,(SI)/(ESI)增量1(字节操作)或2(字操作)或4(双字操作)
      • 当DF=1时,(SI)/(ESI)减量1(字节操作)或2(字操作)或4(双字操作)
        -CMPS OPD,OPS
    • (DS:[SI]/[ESI])—(ES:[DI]/[EDI]),即将SI/ESI所指的源串中的一个字节(或字、双字)中的数与DI、EDI所指的目的串中的一个字节(或字、双字)中的据相减,并根据相减的结果设置标志位,结果并不保存。
    • 该指令可带的重复前缀为:
      • REPE/REPZ 当(CX/ECX)≠0时,如两串对应字符相等继续比较,不相等跳出循环;
      • REPNE/REPNZ 当(CX/ECX)≠0时,如两串对应字符不相等继续比较,相等跳出循环;
  • SCAS OPD
    • 字节操作:(AL)-(ES:[DI]/[EDI])
    • 字操作: (AX)- (ES:[DI]/[EDI])
    • 双字操作:(EAX)-(ES:[DI]/[EDI])
    • 该指令可带的重复前缀为:
      • REPE/REPZ 若(CX/ECX)≠0且相等时接着搜索.
      • REPNE/REPNZ 若(CX/ECX)≠0且不相等时接着搜索.
  • LODS OPS
    • 将SI/ESI所指的源串中的一个字节(或字、双字)存储单元中的数据取出送入AL(或AX、EAX)中。
    • 由于该指令的目的地址为一固定的寄存器,如果带上重复前缀,源串的内容将连续地送入AL(或AX、EAX)中,操作结束后,AL(或AX、EAX)中只保存了串中最后一个元素的值,这是没有多大意义的,因此,该指令一般不带重复前缀。
  • STOS OPD
    • 即将AL(或AX、EAX)中的数据送入DI/EDI所指的目的串中的字节(或字、双字)存储单元中。修改指针DI/EDI,使之指向串中的下一个元素。
  • 说明:该指令执行后,并不影响标志位,因而它一般只带REP重复前缀,用来将一片连续的存储字节(或字)单元置相同的值。

宏功能程序设计

  • 宏定义
    宏指令名    MACRO  形式参数  [,形式参数]
                          宏体   
                          ENDM 
    
    
  • 宏调用与宏扩展
    宏指令名 [实在参数 [,实在参数]……] 
    
  • 宏库的使用
    • INCLUDE 文本文件名
    • 将指定的文本文件从本行起加入汇编,直到该文本文件的最后一行汇编完后,再继续汇编INCLUDE后面的语句。

模块化程序设计

  • 段定义语句
    段名  SEGMENT  [定位方式]  [组合方式]  [‘类别’]� 
    ...
    �段名  ENDS
    
    
  • 组合方式
    • NONE(不选择):本段与其它段不发生任何逻辑上的联系,自己有自己的段首址。(隐含的)
    • PUBLIC:表示应将本段与其它模块中的同名、同‘类别’段按各模块连接的顺序相邻地连接在一起,组成一个物理段, 大小不超过64K。�
      • 合并的好处:以数据段为例,当组合成一个段后,在子模块中就不用再对DS送首址,方便而又有效。
    • STACK:仅对堆栈段,功能同PUBLIC。
    • COMMON:表示本段与同名、同‘类别’的其它段应具有相同段首址,即相覆盖。长度取决于最长的COMMON段。
    • “AT表达式”:表示该段应放在表达式所指定的绝对地址上。
    • “MEMORY”:表示该段应放所有段之上(最高地址上)。
  • 通讯方式
    • 局部符号:仅在定义自己的模块中被访问的符号为局部符号。
    • 公共符号:不仅被定义自己的模块访问,还要供其它模块访问的符号为公共符号。要用PUBLIC伪指令说明。
    • 外部符号:只在模块内访问而不在该模块内定义的符号为外部符号。要用EXTRN伪指令说明。
      • EXTRN 符号:类型[,符号:类型,……]
  • 连接程序(LINK)的功能
    • 将制定的若干个目标模块(.OBJ)和子程序库(.LIB)中的子程序模块连接在一起,生成可执行的文件(.EXE)
    • 产生一个地址分配文件(.MAP)

第六章 输入/输出和WIN32编程

输入/输出指令

  • 输入指令 IN OPD,OPS
    • (OPS)→累加器OPD
    • 当外设寄存器的地址<=255时,OPS = 立即数或者用DX表示待访问的端口地址。当外设寄存器的地址 >255时,OPS只能用DX表示。
    • OPD只能是累加器AL、AX或EAX。即: IN AL/AX/EAX,OPS
  • OUT OPD,OPS
    • 累加器(OPS)→OPD
    • OPD = 立即数 或者DX
    • OPS只能是累加器AL、AX或EAX。即: OUT OPD, AL/AX/EAX
  • INS OPD, DX (串输入指令 INS)
    • ([DX])→ES:[DI/EDI] ,指针修改
  • OUTS DX,OPS (串输出指令 OUTS)
    • (DS:[SI/ESI])→[DX] ,指针修改在实方式下,I/O空间的访问没有特殊的限制,在保护方式下,CPU对I/O功能提供保护。

中断与异常

  • 优先级 (从高到低)
    • 除调试故障以外的异常
    • 异常指令INTO、INT n、INT 3
    • 对当前指令的调试异常
    • 对下条指令的调试异常
    • NMI(不可屏蔽中断)
    • INTR (可屏蔽中断)
  • 中断号
中断号   名称 	类型 	相关指令	DOS下名称 
0	除法出错	异常 	DIV,IDIV 	除法出错 
1	调试异常 	异常	任何指令 	单步 
2	非屏蔽中断 	中断  	- 	非屏蔽中断 
3	断点 	异常 	INT 3 	断点 
4	溢出 	异常 	INTO 	溢出 
5	边界检查	异常 	BOUND 	打印屏幕 
6	非法操作码	异常 	非法指令编码或操作数	保留
7	协处理器无效 	异常 	浮点指令或WAIT 	保留 
8 	双重故障 	异常 	任何指令 	时钟中断 
9 	协处理器段超越 	异常 	访问存储器的浮点指令 	键盘中断 
0DH 	通用保护异常 	异常 	任何访问存储器的指令 任何特权指令 硬盘(并行口)中断 
10H 	协处理器出错 	异常 	浮点指令或WAIT 	显示器驱动程序 
13H 	保留 			软盘驱动程序 
14H 	保留 			串口驱动程序 
16H 	保留 			键盘驱动程序 
17H 	保留 			打印驱动程序 
19H	保留 			系统自举程序
1AH 	保留			时钟管理 
1CH 	保留			定时处理 
20H~2FH 	其它软/硬件中断 			DOS使用 
0~0FFH 	软中断 	异常 	INT  n 	软中断 
  • 软中断指令
    • INT n
    • n为中断号,取值范围为0~255。
  • 中断返回指令
    • IRET

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.