汇编基础语法

本文详细介绍了汇编语言的基础语法,包括指令语句和伪指令语句的格式与用途。指令语句涉及标号、指令助记符、操作数和注释字段,而伪指令语句则用于指导汇编程序处理后续指令。此外,文章还涵盖了汇编语言中的数据形式,如常数、变量和字符串,并讨论了程序的段结构、过程定义以及定位伪指令的使用。

语句种类以及格式

语句分类

指令语句

  • 概念:每一条指令语句在汇编时都要产生一个可以供CPU执行的机器目标代码 。也叫可执行语句
  • 一般格式:
    graph LR
    a( )-->b(标号)
    b-->c((:))
    c-->d(指令助记符)
    a-->d
    d-->e(操作数,n个之间用,隔开)
    e-->f((分号+注释语句))
    
    • 一条指令语句最多可以包含四个字段
    • 标号字段
      • 标号为可选字段,后面必须有“:”,标号是指令的符号地址,代表了该指令的第一个字节存放地址
      • 标号一般放在一个程序段或者子程序的入口处,控制程序的执行转发到该程序位置
      • 在转移指令或子程序调用指令中 可直接引用这个标号
      • `ADDR1: MOV AL,100 ;ADDR1为标号,MOV为指令助记符 AL为操作数1,可理解为目标操作数,100为操作数2,可以理解为原操作数. 整个即把100存储到AL寄存器’
    • 指令助记符字段
      • 该字段是必选字段 表示这条语句要求CPU完成什么操作 比如MOV ADD SHL
      • 有些指令可以在指令助记符前面加上前缀 实现附加操作 如操作指令前加的重复前缀REP
    • 操作数字段
      • 一条指令可以有0 1 2个操作数,由指令决定
      • 如ADD MOV指令需要两个操作数,INC NOT指令要一个操作数 CLC指令不需要操作数
    • 注释字段
      • 注释字段为可选字段 以分号;开始
      • 作用是方便阅读 它不会产生机器目标代码 不影响程序和指令的功能
      • 注释字段可以是一条指令的后面部分 也可以是整个语句行
      • LABL1: ADD AX ,BX; 功能为AX<=(AX)+(BX)

伪指令语句

  • 概念: 也叫命令语句 本身不产生对应的机器目标代码 仅仅是告诉汇编程序对其后面的指令语句和伪指令语句的操作数应该如何处理
  • 一般格式
    graph LR
    a( )-->b(符号名)
    b-->d(伪指令符)
    a-->d
    d-->e(操作数,n个之间用,隔开)
    e-->f((分号+注释语句))
    
    • 符号名字段
      • 为可选字段 根据伪指令的不同,符号名可以是常量名 变量名 过程名 结构名 记录名等等
      • 一条伪指令语句的符号名可以作为其他伪指令语句或指令语句的操作数 此时它表示一个常量或者存储器地址
      • 与指令语句的区别 符号名后面没有冒号:
    • 伪指令符字段
      • 为必选字段 它规定了汇编程序所要完成的具体操作
    • 操作数字段
      • 是否需要 由伪指令符字段决定
      • 可以是一个常数(二八十十六进制等),字符串 常量变量名等
    • 标识符字段
      • 指令语句中的标号和为指令语句中符号名统一成为标识符 标识符由若干个字符构成
      • 构成规则:
        • 个数为1~31个
        • 第一个字符必须是字母,问号 @ _ 四种字符之一
        • 第二个字符开始可以是四种+数字
        • 不能使用系统保留字
          • 系统保留字:CPU中各寄存器名(如AX CS等),指令助记符(如MOV ADD) 伪指令符(如SEGMENT DB) 表达式中的运算符(如GE SEGMENT DB)
          • 以及属性操作符(如PTR OFFSET)

汇编语言数据

  • 概念:数据是指指令和伪指令语句中操作数的基本组成部分 一个数据由数值和属性两部分组成
    • 在说明数据时 不仅要指定其数值 还要说明它的属性 比如是字节数据还是字数据

数据形式分类

常数

  • 在汇编期间其值已经完全确定 并且在程序运行过程中 值不会发生改变
  • 形式有:
    • 以B结尾的二进制数
    • 以O或者Q结尾的八进制数
    • 以D结尾的十进制数
    • 以H结尾的十六进制数
    • 实数:
      • 格式: ±整数部分.小数部分±指数部分
      • 汇编程序在汇编源程序时 实数会转换为4 8 10字节的二进制数形式存放
    • 字符串常数:用引号(单双)括起来的n个字符 这些字符以它的ASCII码值存储在内存
      • 如’ABC’ 存为 ‘41H42H43H’
  • 如果常数的第一个数字是字母 为了与标识符区分 要加0 比如FFH 变为0FFH
  • 常数的使用情况
    • 做指令语句的源操作数 `MOV AX,0B3H’
    • 在指令语句的寻址方式中做位移量 ‘MOV BX,32H[SI’
    • 在数据定义伪指令中使用 ‘DB 10H’

变量

标号

符号定义语句

表达式与运算符

程序的段结构

过程定义伪指令

当前位置计数器$与定位伪指令

从程序返回操作系统的方法

学习汇编语言的基本语法是理解计算机底层工作原理的重要一步。汇编语言是一种低级语言,与具体的处理器架构紧密相关,因此不同的处理器(如x86、ARM、MIPS)会有不同的指令语法结构。 ### 基本概念 在开始之前,需要了解几个基本概念: - **寄存器**:CPU内部的小型存储区域,用于快速访问数据。 - **内存地址**:每个字节都有一个唯一的地址,程序通过这些地址来读写内存。 - **指令**:告诉CPU执行特定操作的命令,例如移动数据、算术运算或跳转到另一个位置。 - **助记符**:为了便于记忆,每条机器指令都有一个对应的英文缩写,比如`MOV`代表移动数据。 ### 汇编语言语法基础 虽然不同架构的汇编语言存在差异,但它们共享一些通用的语法元素: #### 数据定义 可以使用伪指令来定义数据。例如,在x86汇编中,`.data`段用来声明变量。 ```asm section .data myVar db 0x12 ; 定义一个字节大小的变量myVar,并初始化为十六进制值12 ``` #### 寄存器使用 寄存器名称通常由两到三个字母组成,表示其用途大小。以x86为例,有通用寄存器如`EAX`, `EBX`, `ECX`, `EDX`等。 ```asm mov eax, 5 ; 将立即数5加载到EAX寄存器中 ``` #### 指令格式 大多数指令遵循相同的模式:操作码后跟操作数。操作数可以是寄存器、内存地址或者立即数。 ```asm add ebx, ecx ; 将ECX的内容加到EBX上 ``` #### 控制流 控制流语句允许改变程序的执行顺序。这包括条件分支循环。 ```asm cmp eax, ebx ; 比较EAXEBX的内容 je equal_label ; 如果相等,则跳转到equal_label标签处 ; ... 其他代码 ... equal_label: ; 当EAX等于EBX时会执行到这里 ``` #### 函数调用 函数或过程可以通过`call`指令调用,并且使用堆栈传递参数。 ```asm push dword 0x0A ; 推送参数0x0A onto the stack call some_function ; 调用some_function add esp, 4 ; 清理堆栈上的参数 ``` ### 学习资源 对于初学者来说,《汇编语言教程:从入门到精通》提供了一个全面的学习路径,涵盖了从基础到高级的概念[^1]。此外,《汇编语言程序设计(中文版)》专注于AT&T语法格式,适合想要快速入门的用户[^2]。如果对更理论性的内容感兴趣,《Guide to assembly language. A concise introduction》提供了深入的理解[^3]。 ### 实践建议 - 使用模拟器或虚拟机进行实验,避免直接在物理硬件上运行可能有害的代码。 - 开始时尝试简单的示例,逐步增加复杂度。 - 利用调试工具检查寄存器状态内存变化,有助于理解程序的行为。 - 阅读官方文档社区提供的资料,不断练习编写修改现有代码。 希望以上信息能够帮助您开启学习汇编语言之旅。如果您有任何具体问题或需要进一步指导,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值