汇编语言(一)—— 汇编语言基础

汇编语言(一)—— 汇编语言基础

  • 汇编语言基础(针对IA-32处理器)
    • 汇编语言基础-硬件组成
      • 寄存器
        • 通用寄存器
        • 专用寄存器
      • 存储器地址
    • 汇编语言基础-程序格式
      • 处理器指令格式
      • 汇编语言语句格式
      • 源程序框架
      • 环境搭建
    • 参考

汇编语言基础(针对IA-32处理器)

汇编语言基础-硬件组成

计算机硬件组成:处理器子系统(CPU=运算器+控制器+寄存器)+存储器子系统(主存储器)+IO设备子系统(辅助存储器+输入设备+输出设备)
汇编角度:寄存器+存储器地址+输入输出地址

寄存器

寄存器:处理器内部的高速存储单元,用于暂时存放程序执行过程中的代码和数据;
寄存器分类:

  1. 透明寄存器:对应用人员不可见、不能编程直接控制。
  2. 可编程寄存器:具有引用名称、可编程使用,分为通用寄存器(General-Purpose Register)与专用寄存器。

通用寄存器

处理器最常使用的整数通用寄存器,可用于保存整数数据、地址等,可以整体使用,也可以独立使用。

  1. 32位通用寄存器:EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP
    (32位IA-32处理器,E:Extended)
  2. 16位通用寄存器:AX、BX、CX、DX、SI、DI、BP、SP
    (16位8086处理器,X:miX(H+L),AX:Accumulator,BX:Base Address,CX:Counter,DX:Data,SI:Source Index,DI:Destination Index,BP:Base Pointer,SP:Stack Pointer)
  3. 8位通用寄存器:AH、AL、BH、BL、CH、CL、DH、DL
    (16位8086处理器前四个寄存器的高低字节,H:High,L:Low)

专用寄存器

  1. 标志寄存器:EFLAGS(各种标志组合在一个专用寄存器形成标志寄存器,8086支持16位、IA-32支持32位。标志体现处理器的一种工作形态,反映执行结果,如加减进借位、是否为零、是正是负;控制指令执行形式},如是否单步操作、是否相应外部中断。)
  2. 指令指针寄存器:EIP(保存将要执行的指令在主存的存储器地址。顺序执行时自动增加指向下一条指令;分支、调用执行控制转移指令修改;中断、异常时处理器赋值改变。)
  3. 段寄存器(16位):CS、DS、SS、ES、FS、GS(指明某一个段在主存中的位置,即段的开始。存储空间分段管理,段是保存相关代码或数据的一个主存区域,三类基本段:
    ① 代码段(Code Segment),保存可执行代码/处理器指令;
    ② 数据段(Data Segment+Extra Segment+FS+GS),保存数据,如全局变量;
    ③ 堆栈段(Stack Segment),保存返回地址、临时变量等)
  4. 存储器地址在编程时采用逻辑地址:段基地址(段寄存器):偏移地址(EIP/ESP/EBP/EA),如代码段的当前指令地址由CS与EIP联合指明;堆栈段当前栈顶地址由SS与ESP联合指明;数据段操作数地址由DS/ES/FS/GS与EA(有效地址:存储器寻址方式计算)联合指明。

存储器地址

主存储器被划分为许多个存储单元,每个存储单元以为基本存储单位(字节编址),被编排一个号码作为存储单元地址,称为存储器地址(Memory Address)。

  1. 数据基本单位:位(1Bit)、字节(8Bit)、字(16Bit)、双字(32Bit)。
  2. 存储器的物理地址(绝对地址):处理连接的物理存储器使用物理地址,从0开始顺序编排指导其支持的最大存储单元。如IA-32有4GB( 2 32 2^{32} 232B)的存储空间(从0开始顺序编排,直到FFFFFFFFH,四个二进制位对一个十六进制位)。
  3. IA-32处理器提供三种存储模型:
    ① 平展存储模型,连续的4GB线性地址空间;
    ② 段式存储模型,有一组独立的地址空间(段)组成,每个段都可以达到4GB;
    ③ 实地址存储模型,8086使用,每段最大64KB,存储器最大1MB;
    (高性能处理器集成存储管理单元MMU(Memory Management Unit):操作系统利用MMU进行主存储器空间管理(程序不直接寻址物理存储器);处理器通过操作系统利用MMU将逻辑地址映射为线性地址(虚拟地址),再转换成物理地址进而访问主存储器芯片)。
  4. 存储空间分段管理:段是保存相关代码或数据的一个主存区域,三类基本段:
    ① 代码段(Code Segment),保存可执行代码/处理器指令;
    ② 数据段(Data Segment+Extra Segment+FS+GS),保存数据,如全局变量;
    ③ 堆栈段(Stack Segment),保存返回地址、临时变量等。
  5. 存储器的逻辑地址(相对地址):逻辑地址 = 段基地址(在主存中的起始位置) :偏移地址(距离段基地址的位移量)
    (存储器空间分段管理,采用逻辑地址指示(处理器内部以及程序员编程)
  6. Win32的虚拟地址分配:应用程序开始地址为:00400000H

汇编语言基础-程序格式

处理器指令格式

程序有程序设计语言编写,编译后由处理器指令构成。

  1. 指令由操作码和操作数(地址码)组成。操作码(Opcode)表明处理器执行的操作,如数据传送、加法运算、跳转等操作,汇编语言使用指令助记符表示。操作数(Operand)是参与操作的数据对象,以寄存器名或地址形式指明数据来源,汇编语言使用寄存器、常量、变量等形式表示。
  2. 使用最多、最基本的数据传送指令:MOV(将数据从一个位置传送到另一个位置)。
    mov dest, src ; src为源操作数/源位置,表明被传送的数据或数据所在的位置;dest为目的操作数/目的位置,表明数据将要传送到的位置。
  3. 处理器指令的二进制编码:① 操作码:可选的指令前缀(用于扩展指令功能)+ 主要操作码;② 操作数:可选的寻址方式域(Mod R/M和SIB字段)+ 可选的位移量 + 可选的立即数。
    汇编语言(一)—— 汇编语言基础_第1张图片

汇编语言语句格式

  1. 一句一行,支持续行符" \ \backslash \",一句不超过132个字符、4个部分。
  2. 执行性语句:表达处理器指令,实现功能。
    标号: 硬指令助记符 操作数, 操作数 ; 注释
  3. 说明性语句:表达伪指令,控制汇编方式。
    名字 伪指令助记符 参数, 参数, … ; 注释
  4. 用户定义的标识符:
    ① 标号:执行性语句;冒号分隔;表示处理器指令在主存中的逻辑地址;指示分支、循环等程序的目的地址。
    ② 名字:空格或制表符分隔;变量名、段名;子程序名等;反应变量、段和子程序等的逻辑地址。
  5. 标识符原则:① 不能以数字开头;② 一个源程序中,每个标识符必须唯一;③ 不能是保留字;④ 默认不区分大小写。
  6. 助记符:① 硬指令助记符表示处理器指令,如MOV传送指令;② 伪指令助记符表示一个汇编指令,如BYTE字节变量定义,在主存中占用若干存储空间保存变量值。
  7. 操作数和参数:
    ① 处理器指令的操作数,表示参与操作的对象,具体常量、寄存器中的数据、存储器中的变量,逗号前常是目的操作数,逗号后常是源操作数。
    ② 伪指令的参数,常量、变量名、表达式等,可以有多个,参数之间用逗号分隔。
  8. 汇编语言对齐:
    ① 标号和名字从首列开始;
    ② 助记符、注释通过制表符对齐;
    ③ 助记符与操作数、参数之间用空格或制表符对齐。

源程序框架

;微软MASM汇编程序源程序框架.asm:
;       include io32.inc    ; 包含伪指令INCLUDE(钱晓捷老师教材提供)
        .data               ; 定义数据段
        ...                 ; 数据定义,数据待填
        .code               ; 定义代码段,注.stack可以定义堆栈段
start:                      ; 代码段开始,程序执行起始位置
        ...                 ; 主程序,指令待填
        exit 0              ; 程序正常执行结束,终止程序执行,将控制权返回给操作系统。
        ...                 ; 子程序,指令待填
        end start           ; 汇编结束

环境搭建

  1. masm(masm.exe, link.exe, debug.exe, exe2bin.exe) + DOSBox0.74-win32-installer.exe
    汇编环境的安装和使用

  2. 配置:
    ① 工作目录:DOS -> asm + masm(masm.exe, link.exe, debug.exe, exe2bin.exe)
    ② 在dosbox的安装文件夹中找到Dosbox 0.74 Options.bat文件,在末尾增加:

         mount d d:\dos ; 挂载驱动器
         path=%path%; \masm ; 添加路径
         d: ; 转到DOSBox的d盘
         cd \asm ; 进入asm文件夹
    
  3. 用法:
    ① DOSBox
    ② masm -> 源程序名
    ③ link -> 源程序名
    ④ 运行:文件名.exe

  4. 钱晓捷开发软件包-WIN32.bat

参考

中国大学MOOC汇编语言程序设计

你可能感兴趣的:(汇编语言(一)—— 汇编语言基础)