【x86汇编】第三章:宏汇编语言的表达式

本文深入探讨x86汇编语言中的宏汇编表达式,涵盖常量、数值表达式、变量、标号、地址表达式的详细解释,包括算术和逻辑运算、地址传送指令、伪指令语句等内容,帮助读者掌握汇编语言的基本要素和编程技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

表达式

常量

常量分为:

  • 数值常量:MOV AX, 10H
  • 符号常量:VAR EQU 20

数值常量可以是:

  • 二进制:0101B
  • 八进制:123Q 或者 123O
  • 十进制:467 或者 467D
  • 十六进制:0FFH
  • 字符常量:‘123abc’ “hello”

数值表达式

算术运算:

  • 加、减、乘、除、取模(MOD)、左移(SHL)、右移(SHR)
  • 注意负数的取模,根据商的值进行推算(不同语言,商可能不同)

逻辑运算:

  • 相等(EQ)、不等(NE)、小于(LT)、大于(GT)、小于等于(LE)、大于等于(GE)
  • 运算结果为特殊常量:成立,为0FFFFH,不成立为0

变量

变量的属性:

  • 段属性:所在段的段首址
  • 偏移地址:相对段首址的EA
  • 类型:存取所需要的字节数

变量的定义使用伪指令:DB、DW、DD、DF、DQ、DT

定义格式: [变量名] 数据定义伪指令 表达式
表达式有以下几种形式:

  • 数值表达式:VAR DB 10
  • ASCII字符串:BUF DB ‘abc123’
  • 地址表达式:只适用于DW和DD,16位段中,DW取该地址的EA,DD取段首址和EA,32位段取EA
  • ?:表示不进行初始化赋值
  • 重复子句:n DUP(表达式)
  • 上述形式的组合,逗号隔开

标号

标号是机器指令语句存放地址的符号表示,也可以是子程序名
标号的属性:

  • 段属性:所在段的段首址
  • 偏移地址:到段首址的EA
  • 类型:NEAR和FAR,NEAR类型的标号,只能段内使用

地址表达式

  • 地址表达式是由变量、标号、常量、寄存器的内容,和运算符组成的
  • 如果地址表达式中出现了变量、标号,则取它的EA参与运算

属性定义算符PTR

指明该地址的操作数,是什么数据类型,或者临时改变操作数的类型,不能改变寄存器和立即数的类型

类型 PTR 地址表达式

例如:WORD PTR [SI]
类型:BYTE、WORD、DWORD、FWORD、NEAR、FAR

定义类型运算符THIS

指定下一个能分配的存储单元的类型,往往与EQU、=等连用

THIS 类型

跨段前缀算符

用于临时给变量、标号指明段属性

段寄存器:地址表达式

属性分离运算符

分离出变量、标号的段、EA和类型

  • 取段址运算符SEG:取出段首址
  • 取偏移地址算符OFFSET:取出EA
  • 取类型运算符TYPE:取出变量或标号的类型

其它算符

  • 取变量存储单元个数LENGTH:它的取值根据定义该变量时,数据定义伪指令后面的一个表达式而定
  • 取变量所含数据存储区大小算符SIZE:其值为LENGTH * TYPE
  • 字节分离算法:HIGH和LOW

常用运算符优先级

运算优先级

常用的机器指令语句

操作规定:

  • 目的操作数与源操作数,必须类型相同
  • 目的操作数不能是立即数
  • 目的操作数与源操作数,不能都存储在寄存器
  • 运算完后,结果送入目的操作数,源操作数不变

数据传送指令

  • 一般数据传送指令:MOV、MOVSX、MOVZX、XCHG、XLAT
  • 堆栈操作指令:PUSH、PUSHA、PUSHAD、POP、POPA、POPAD
  • 标志寄存器传送指令:PUSHF、PUSHFD、POPF、POPFD、LAHF、SAHF
  • 地址传送指令:LEA、LDS、LES、LFS、LGS、LSS
  • 输入输出指令:IN、OUT

影响标志位的指令:SAHF、POPF、POPFD

一般数据传送指令

传送指令

MOV OPD,OPS

将源操作数送入目的地址中

MOVSX OPD, OPS<

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值