【MASM汇编语言快速入门】MASM常用伪指令速查表——变量

MASM伪指令速查表–变量

初学MASM时, 常常看不懂db, dup(?)等汇编指令的含义, 教材中也缺乏系统的解释。与机器指令不同,这些指令叫伪指令, 在编译(汇编)的时候被MASM编译器处理, 而在运行时计算机不会真正的执行这些指令。这篇文章可以系统的解决对MASM伪指令的困扰。 MASM学习到这一块才叫真正的MASM,之前学习的机器指令都属于各种汇编语言都支持的8086指令集, 而这些伪指令只有MASM有, 别的汇编语言比如NASM等是不支持这些伪指令的。

文章目录

  • MASM伪指令速查表--变量
    • 一. 数值型参数(常量)和表达式
      • 1. 常量(常数)定义`equ`或`=`
      • 2. 数值表达式
    • 二. 变量定义伪指令
      • 1. `db/dw/dd/df/dq/dt`
      • 2. 初值表和`dup`
      • 3. 定位伪指令`org`,`even`,`allign`
        • (1) `org`
        • (2) `even/align`
    • 三. 变量的地址和类型
      • 1. 地址操作符 `offset` `seg`
      • 2. 地址操作符`:`, `[]`, `$`
      • 3. 类型操作符`ptr`, `this`, `type`
        • (1) `ptr`
        • (2) `this`
        • (3) `TYPE`, `lengthof`, `sizeof`

一. 数值型参数(常量)和表达式

1. 常量(常数)定义equ=

格式: [常量名] equ [值] 或者[常量名] = [值]

举例:

myid equ 1234
numofchina =1		   ;一个中国
calldos equ <int 21h>  ;[值]可以是字符串, 但是字符串要拿<>括起来

注意:

这里定义的是常量, 在内存中没有分配空间, 因此和高级语言(如c语言)的常量一样myid equ myid+1这种语句是不允许的

2. 数值表达式

masm6.x支持多种运算符, 对的你没有看错, MASM还可以支持运算符, 但是仅限常量和立即数的计算(和c语言的宏同理, 就是在编译的时候算好), 不能运行时计算

运算符类型
算术运算符+, -, *, /, MOD(取余)
逻辑运算符AND, OR, XOR(异或), NOT
移位运算符SHL(左移), SHR(右移)
关系运算符EQ(equal相等), NE(not equal不相等), GT(greater than大于), LT(less than小于), GE(大于等于), LE(小于等于)
高低分离符HIGH(高字节), LOW(低字节), HIGHWORD(高字), LOWWORD(低字)

举例:

mov ax, 1*1+2 ; 等价于mov ax, 3
mov al, 0101b shl (2*2) ; 等价于 mov al, 01010000b(0101b左移四位)
mov ah, high 8765h ; 等价于 mov ah, 87h(8765h的高字节)

二. 变量定义伪指令

1. db/dw/dd/df/dq/dt

db是以字节(8比特)为单位, dw是以字为单位(16比特), dd是双字, df是三字, dq是四字, dt是十字

格式: [变量名] db [初值表]

功能: 定义以字节为单位的变量,变量的起始地址为[变量名], 值为[初值表]中每个逗号隔开的元素, [变量名]可以省略

示例:

.data
X db 'A', -5
db 2dup(100), ?
Y db 'ABC'
Z dw 'ABC'

说明:

db和dw是以某个长度为单位

Y在内存中为: 41h, 42h, 43h

Z在内存中为: 41h, 42h, 43h, 00h(因为以字为单位所以会有一个字节空出来)

2. 初值表和dup

初值表: 由逗号隔开的参数, 可以由数值, 表达式或"?", "dup"组成, "?"代表初值不确定即未赋值, 下面解释dup

格式: [次数]dup([初值])

功能: 定义[次数]个初值为[初值]的变量

示例:

.data
X db 1, 3dup(0), 1 ; 在内存中就是01 00 00 00 01h
Y db 2dup(?) ; 在内存中就是 ?? ?? h (?就是初值不确定,就是定义的时候我不在意初始值是多少,至于具体的值和编译器和版本有关, 大部分版本的MASM初始化?为0)

3. 定位伪指令org,even,allign

(1) org

格式: org [偏移地址]

功能: 使他后面的数据或指令从指定的偏移地址开始

示例:

org 100h
array db 12, 34, 56		;12开始的偏移地址是100h, 或者说array的偏移地址是100hlen equ $-array

解释: $的含义就是当前偏移地址的值例如

用途: 更细粒度的规划内存的空间, 可以任意指定程序和数据在虚拟内存中的结构,这是高级语言做不到而汇编能做到的. 比如开机时操作系统的引导程序(引导程序就是把操作系统逐步加载到内存中, 并进行一些初始化的程序), BIOS规定要将引导程序加载到07c00h这个地址上, 这样细粒度的内存空间管理只有汇编能做到, 这也是为什么操作系统的引导模块都会含有汇编程序, 而这样的功能就是用org 07c00h实现的

(2) even/align

功能:

even使后面的数据或指令地址从偶数开始

align [n]使后面的数据或地址从n的整数倍开始, 举例:align 4

用途:

用于数据对齐, 学过计算机组成原理的应该知道, 目的就是让数据对的更齐, 这样能最大减少取数据时总线传输次数消耗尽量少的总线时钟周期,通俗来讲就是取数据更快

三. 变量的地址和类型

1. 地址操作符 offset seg

格式:offset [标号/变量名] seg [标号/变量名]

功能:offset:取[标号/变量名]的偏移地址,seg:取[标号/变量名]的段基址

举例:

.model small 	; 套话org 100h	; 代码段的偏移地址设定为100h, 也就是hello的偏移地址为100h
.data
hello db 'ABC'		; hello是变量名.code
org 200h 	; 设定nihao的偏移地址为200h
nihao:				; nihao是标号
mov ax, offset hello	; 等价于 mov ax, 100h(hello的偏移地址)
mov ax, seg nihao 		; 等价于 mov ax, cs(因为nihao在代码段, seg是返回段基址)

2. 地址操作符:, [], $

[]:$
格式举例[ax+4300h]cs:[bx+1]mov ax, $+1
功能[]表示将括号里面的表达式作为存储器地址的指针:表示用:前的段寄存器作为段超越的段寄存器, 段超越就是指不使用默认的段寄存器$表示当前位置的数据/指令的偏移地址

3. 类型操作符ptr, this, type

(1) ptr

格式: [类型名] ptr [名字/标号/内存地址]

功能: 可以简单理解成C语言中的强制类型转换, 指定[名字/标号/内存地址]的类型为[类型名] (和高级语言的类型的含义不同,这里的变量类型就是指数据的宽度, 不过其实c语言区分变量类型的方法其实就是通过数据的宽度, 但是其他语言尤其是面向对象的语言比如python并不是靠数据宽度区分变量类型的)

举例:

.model small		; 套话
.data				; 定义数据段
w_var dw 01h		; 定义字(16比特)变量w_war.code				; 定义代码段
.startup			; 代码执行开始位置
mov al, byte ptr w_var   ; w_var是字变量, byte ptr使得 w_var被当做字节变量
mov ah, bye ptr [1000h]	 ; 内存单元是以字为单位的, byte ptr使得 [1000h]的内存单元被当做字节变量
.exit 0				; 套话 进程返回和中断

[类型名]还可以是:

byte(字节8比特), word(字16比特), dword(双字), fword(三字), qword(四字), tbyte(十比特), near(段内转移, 一般说明某个转移内存地址是比较近的), far(段间转移, 一般说明某个转移内存地址在别的段, 或者在本段非常远的位置), struct(结构体, 后面会细讲), record(记录, 学过数据库或者计算机组成原理应该会知道是什么意思, 不知道可以百度), union(联合体, 和c语言的union几乎一样)

(2) this

强制类型转换可以用PTR来实现.但是,如果程序中经常要以同一个数据宽度访问变量, 每次访问都要加上ptr操作符, 很麻烦,
于是,汇编语言提供了另外一种操作符:THIS,它为一个变量取了别名,该别名具有指定的和元变量不同的数据宽度,但是段地址和偏移量和原来的变量一致(也就是用固定用另外一种数据长度来访问原变量)

举例:

.data
char equ this byte		; 这样写就可以通过char这个名字固定以字节为单位访问string, 想用字为单位访问就用string这个名字
string dw 'ABCDEFG'		; 定义以字为单位的变量string
(3) TYPE, lengthof, sizeof

sizeof可以简单理解成c语言中的sizeof()关键字, sizeof = lengthof * type

type的返回值

类型返回值
变量每个数据占用的字节数
结构体结构体每个元素占用的字节数
常数0
标号代号(如near 为 0ff02h)
寄存器寄存器宽度的字节数

举例

.data
b_var equ this byte 		; b_var是w_var的别名, 和w_var不一样的是, b_var以字节为单位访问
w_var dw 10 dup(0)			; 定义w_var是一个以字为单位有10个元素(值为0)的数组.code
mov ax, type w_var			; 等价于 mov ax, 2(两个字节, 也就是一个字)
mov ax, type b_var 			; 等价于 mov ax, 1(一个字节)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/743327.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Boot——组件(导航和选项卡、分页、卡片、轮播图)

Boot——组件&#xff08;下&#xff09; 导航和选项卡 https://v5.bootcss.com/docs/components/navs-tabs/ &#xff08;1&#xff09;导航 <ul class"nav"><li class"nav-item"><a href"#" class"nav-link">…

游戏数据处理

游戏行业关键数据指标 ~ 总激活码发放量、总激活量、总登录账号数 激活率、激活登录率 激活率 激活量 / 安装量 激活率 激活量 / 激活码发放量 激活且登录率 激活且登录量 / 激活码激活量 激活且登录率应用场景 激活且登录率是非常常用的转化率指标之一&#xff0c;广泛…

Ypay源支付6.9无授权聚合免签系统可运营源码

YPay是一款专为个人站长设计的聚合免签系统&#xff0c;YPay基于高性能的ThinkPHP 6.1.2 Layui PearAdmin架构&#xff0c;提供了实时监控和管理的功能&#xff0c;让您随时随地掌握系统运营情况。 说明 Ypay源支付6.9无授权聚合免签系统可运营源码 已搭建测试无加密版本…

HTML5:七天学会基础动画网页13

看完前面很多人可能还不是很明白0%-100%那到底是怎么回事&#xff0c;到底该怎么用&#xff0c;这里我们做一个普遍的练习——心跳动画 想让心❤跳起来&#xff0c;我们先分析一波&#xff0c;这个心怎么写&#xff0c;我们先写一个正方形&#xff0c;再令一个圆形前移: 再来一…

蓝桥杯历年真题 省赛 Java b组 2016年第七届

一、题目 分小组 9名运动员参加比赛&#xff0c;需要分3组进行预赛。 有哪些分组的方案呢&#xff1f; 我们标记运动员为 A,B,C,... I 下面的程序列出了所有的分组方法。 该程序的正常输出为&#xff1a; ABC DEF GHI ABC DEG FHI ABC DEH FGI ABC DEI FGH ABC DFG EHI ABC…

Linux中YUM仓库的配置

Linux软件包的管理 YUM仓库是什么YUM的常用命令修改YUM源其实CentOS7已经对YUM做了优化 YUM仓库是什么 之前传统RPM的管理方式 可以简单理解为写Java的时候不用Maven管理 jar包都要自己手动去导入 去下载 但是配置好YUM仓库 就放佛在用Maven管理Java项目 基于RPM包管理 能够从…

Python导入类说一说

要在Python中导入一个类&#xff0c;需要使用import关键字。 详细去看下面的代码 1、多例类 class Restaurant:餐馆类def __init__(self,restaurant_name,cuisine_type):#类的属性self.restaurant_name restaurant_nameself.cuisine_type cuisine_type# self.stregth_leve…

2024软件测试应该学什么?“我“怎么从功能转入自动化测试?

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、软件测试应该学…

TypeScript编译选项

编译单个文件&#xff1a;终端 tsc 文件名 自动编译单个文件&#xff1a;终端 tsc 文件名 -w 编译整个项目&#xff1a;tsc 前提是得有ts的配置文件tsconfig.json 自动编译整个项目&#xff1a;tsc --w tsconfig.json默认文件内容&#xff1a; tsconfig.json是ts编译器的配…

代码随想录算法训练营第16天

104.二叉树的最大深度 &#xff08;优先掌握递归&#xff09; 思路&#xff1a; 注意&#xff1a; 传入参数&#xff1a;depth, root 终止条件&#xff1a;if(root nullptr) return 0; 单层递归逻辑&#xff1a; 左右中int left getmax(depth1, root->left);int right …

代码随想录算法训练营Day45 ||leetCode 70. 爬楼梯 (进阶)|| 322. 零钱兑换 || 279.完全平方数

70. 爬楼梯 &#xff08;进阶&#xff09; 本质上和leetcode377一样 #include <iostream> #include <vector> using namespace std; int main() {int n, m;while (cin >> n >> m) {vector<int> dp(n 1, 0);dp[0] 1;for (int i 1; i < n; i…

【MySQL 系列】MySQL 索引篇

在 MySQL 中&#xff0c;索引是一种帮助存储引擎快速获取数据的数据结构&#xff0c;形象的说就是索引是数据的目录。它一般是以包含索引键值和一个指向索引键值对应数据记录物理地址的指针的节点的集合的清单的形式存在。通过使用索引&#xff0c; MySQL 可以在不需要扫描整个…

『scrapy爬虫』03. 爬取多个页面(详细注释步骤)

目录 1. 分析网页试着拿到多个页面的url2. 抓取250个电影3. start_requests的使用4. 代码规范导库的优化关于重写最终修改后的代码 总结 欢迎关注 『scrapy爬虫』 专栏&#xff0c;持续更新中 欢迎关注 『scrapy爬虫』 专栏&#xff0c;持续更新中 1. 分析网页试着拿到多个页面…

关于tcp协议

目录 前言&#xff1a; 一、TCP协议的基本概念&#xff1a; 二、TCP协议的主要特点&#xff1a; 2.1面向连接&#xff1a; 2.2可靠传输&#xff1a; 2.3基于字节流&#xff1a; 三、TCP连接的建立与终止&#xff1a; 3.1连接建立&#xff1a; 3.1.1SYN&#xff1a; 3…

全排列 递归

#全排列 递归写法 def permute(nums,l,r):if lr: #如果lr 说明指剩下最后一个元素了 返回当前列表print(.join(nums)) #字符串连接else:for i in range(l,r1): #进入循环#交换i l 两个元素位置nums[l],nums[i]nums[i],nums[l]#递归 调用permute(nums,l1,r) #l1 表示下一个元素…

js中“==” 和“===”的区别

在JavaScript中&#xff0c; 和 是两种比较操作符&#xff0c;它们的区别在于它们进行比较时对数据类型的处理方式不同。 “”&#xff08;相等&#xff09;操作符&#xff1a; “” 操作符在比较两个值时会进行类型转换&#xff0c;如果两个值的数据类型不同&#xff0c;它会…

MyBatis3源码深度解析(十一)MyBatis常用工具类(四)ObjectFactoryProxyFactory

文章目录 前言3.6 ObjectFactory3.7 ProxyFactory3.8 小结 前言 本节研究ObjectFactory和ProxyFactory的基本用法&#xff0c;因为它们在MyBatis的源码中比较常见。这里不深究ObjectFactory和ProxyFactory的源码&#xff0c;而是放到后续章节再展开。 3.6 ObjectFactory Obj…

朴素贝叶斯 | 多分类问题

目录 一. 贝叶斯公式的推导二. 朴素贝叶斯1. 离散的朴素贝叶斯朴素贝叶斯导入示例 离散的朴素贝叶斯训练 2. 连续的朴素贝叶斯3. 伯努利朴素贝叶斯4. 多项式朴素贝叶斯4.1 Laplace平滑4.2 Lidstone平滑 三. 概率图模型1. 贝叶斯网络(Bayesian Network)1.1 全连接贝叶斯网络1.2 …

中国城市统计年鉴、中国县域统计年鉴、中国财政统计年鉴、中国税务统计年鉴、中国科技统计年鉴、中国卫生统计年鉴​

统计年鉴是指以统计图表和分析说明为主&#xff0c;通过高度密集的统计数据来全面、系统、连续地记录年度经济、社会等各方面发展情况的大型工具书来获取统计数据资料。 统计年鉴是进行各项经济、社会研究的必要前提。而借助于统计年鉴&#xff0c;则是研究者常用的途径。目前国…

redis在微服务领域的贡献,字节跳动只面试两轮

dubbo.registry.addressredis://127.0.0.1:6379 注册上来的数据是这样&#xff0c;类型是hash /dubbo/ s e r v i c e / {service}/ service/{category} 如 /dubbo/com.newboo.sample.api.DemoService/consumers /dubbo/com.newboo.sample.api.DemoService/providers has…