Intel汇编语言程序设计学习-第三章 汇编语言基础-上

2023-05-16

汇编语言基础

3.1  汇编语言的基本元素

有人说汇编难,有人说汇编简单,我个人不做评价,下面是一个简单的实例(部分代码):

main PROC

mov  eax,5  ;5EAX寄存器

add  eax,6   ;EAX寄存器加6

call  WriteInt ;显示EAX中的值

exit

    main ENDP

这里通过调用 writeInt 库例程使情况稍微简化了一些,WriteInt本身也包含了相当数量的代码。通常来说,如果你乐于编程写实际上并不做什么的的小程序的话,汇编语言并不难学(额...那请问作者,我学汇编干啥)。还有就是,汇编一定要注意细节。细节。

3.1.1  整数常量

    整数常量由符号(可选)开头,后跟一个活多个数字(digit)以及一个表示

基数(radix)的字符后缀。

[{+|-}]数字[基数]

Radix(基数后缀)可以是一下之一(大小写均可):

  h   十六进制           r 编码实数

  q/o 八进制             t 十进制(可选)

   d  十进制             y 二进制 (可选)

   b  二进制

如果整数常量后面没有后缀,就默认是十进制数。下面是一些例子:

26       十进制数        42o  八进制数

26d      十进制数        1Ah  十六进制数

1010011b 二进制数        0A3h 十六进制数

42q      八进制数

以字母开头的十六进制数常量前面必须加一个0,以防止汇编器将其解释为标示符。

3.1.2  整数表达式

整数表达式是包含整数值和算术运算的数学表达式。整数表达式计算的结果是能够以32个数据位存储的整数。下图是优先级:

 

 有两种类型的实数常量:十进制实数和编码(十六进制)实数。十进制实数常量由符号(sign)、整数(integer)部分、小数点、表示小数的整数和指数(exponent)部分组成。

{sign} integer.[integert][exponent]

Sign {+,-}

Exponent E[{+,-}]integer

下面是例子:2.   +3.0   -44.2E+05  26.E5

3.1.4  字符常量

字符常量是以单引号或者双引号括起来的单个字符。汇编器将其转换为与字符对应的二进制数ASCII码,例如:

‘A’ “d”

3.1.5  字符串常量

字符串常量是以单引号或者双引号括起来的一串字符:

  ‘ABC’

  ‘X’

  “Goodnight, Asd”

  ‘4096’

按下面例子的方式使用嵌套的引号也是可以的:

    “This isn’t a test”

    ‘Say “Goodnight,” Asd’

 

3.1.6  保留字

MASM中有一些有特殊含义的保留字,保留字只能用于合适的上下文环境中,有如下不同的类别的保留字:

1.指令助记符,如MOVADDMUL等。

2.伪指令,用于告诉MASM如何编译程序。

3.属性,用于为变量和操作数提供有关尺寸以及使用方式的信息,如BYTEWORD

4.运算符,用在常量表达式中。

5.预定义符号,如@data,在编译时返回整数常量值。

3.1.7  标示符

标示符是程序员选择的名字,用来标示变量、常量、过程或代码标号。创建标示符时要注意一下几点:

1.标示符可以包含1-247个字符。

2.标示符大小写不敏感(MASM默认)。

3.标示符第一个字符必须是字母下划线或者@、?或$,后续字符可以是数字。

4.标示符不能与汇编器的保留字符相同。

运行汇编器时,在命令行上使用-Cp选项可以使所有的关键字和标示符大小写敏感。

汇编器大量使用@符号作为预定义符号的前缀,因此应尽量避免在自己等一的标示符中使用@符号作为数字符。尽量使用标示符的名字局域描述性并且易于理解,下面是一些有效的标示符:

var1     Conut    &first

_main      MAX     open_file

@@myfile  xVal      _12345

    

3.1.8  伪指令

伪指令是内嵌在程序源码中,由汇编器识别并执行响应动作的命令。与真正的指令不同,伪指令在程序运行时并不执行。伪指令可以用于定义变量、宏以及过程,可用于命名段以及执行许多其他与汇编器相关的簿记任务。MASM中伪指令大小写不敏感,如.data,.DATA和。Data是等价的。

下面的例子有助于说明伪指令在运行时并不执行。DWORD伪指令告知汇编器要在程序中给一个双字节变量保留空间。MOV指令在运行时真正执行,把myVar的内容复制到EAX寄存器:


  myVar  DWORD 26  ;DWORD 伪指令

  Mov    eax,myVar  ;MOV指令

  每个汇编器都有一套不同的伪指令。例如,TASMBorland)以及NASMMASM的伪指令有一个公共的交集子集,而GNU汇编器与MASM的伪指令几乎完全不同。

定义段:汇编伪指令的一个重要功能就是定义程序的节(section)或者段(segment)。

.DATA伪指令标识了程序中包含变量的区域:     .data

.CODE伪指令标识了程序中包含质量你开个的区域 .code

.STACK伪指令标识了程序中包含运行时栈的区域,并设定了运行时栈的大小:

.stack 100h

3.1.9  指令

汇编语言中的指令是一条汇编语句,在程序被汇编后就变成可执行的机器指令了。汇编器把汇编指令翻译成机器语言字节码,在运行时可以加载至内存由处理器执行。一条汇编指令包含4个基本部分:

1.标号(可选)

2.指令助记符(必须)

3.操作数(通常是必须的)

4.注释(可选)

基本格式如下:

 

 

标号:

数据标号:数据标号标识了变量的地址,为在代码中应用盖变量提供了方便。例如下例就定义了一个名为countde 变量:

Count DWORD 100

汇编为每个标号分配一个数字地址。在一个标号后定义多个数据项是可以的。在下面的例子中,array标示了第一个数字(1024)的位置,其他在内存中相邻数字紧接其后:

Array DWORD 1024 ,2048

     DWORD 4096,8192

     代码标号:程序代码区(存放指令的地方)中的标号必须以冒号(:)结尾。代码标号通常用做跳转和循环指令的目标地址。例如,下面的JMP(跳转)指令将控制权转到标号target标示的位置,从而构成了一个循环:


Target :

Mov  ax,bx

...

Jmp  target

  代码标号可以和指令在同一行,也可以独立成行:

  L1: mov  ax,bx

  L2:

  数据标号不能以冒号结尾,标号命名遵循3.1.7节中讨论的标示符名的规则。

 

指令助记符:

指令助记符(instruction mnemonic)是一个简单的单词,用于表示一条指令。在英文中,mnemonic是辅助记忆的方法的意思。与此非常相似,汇编语言指令助记符如movaddsub等给出了关于指令要执行何种类型操作的提示:

mov  将一个值移动(赋值)到另外一个中

add   两个值相加

sub   从一个值中减去另外一个值

mul   两个值相乘

     Jmp   跳转到一个新位置

     call    调用一个过程

操作数:
     
一条汇编语言指令可以有0~3个操作数,每个操作数都可能是寄存器、内存操作数、常量表达式或I/O端口。在第2章中讨论过寄存器的名字;在3.1.2节中,讨论了常量表达式。内存操作数由变量的名字或包含变量地址的一个活多个寄存器制定,变量名字表明了变量的地址,并且指示计算机引用给定内存地址的内容。下表包含了几个实例操作数。

 

下面是一些带不同数目操作数的汇编语言指令的例子。例如,STC指令没有操作数:

 STC  ;设置进位标志

 INC指令有一个操作数:

 Inc   eax   ; eax 1

     MOV指令有两个操作数:

     mov count,ebx ;EBX送变量count

     在有两个操作数的指令中,第一个操作数称为目的(标)操作数,第二个操作数称为源操作数。通常,指令会修改目的操作数的内容。例如,在mov指令中,源操作数中的数据被复制到目标操作数中。

注释:

注释是程序作者同程序源代码的阅读者交流有关程序如何工作的信息的一条重要途径,程序清单顶部通常包含如下典型的信息:

1.程序功能的描述。

2.程序创建者/修改者的名字。

3.程序创建/修改的日期。

4.程序实现的技术注解。

注释可以用下面两种方法制定:

单行注释: 以分号(;)字符开始

块注释:以COMMENT伪指令以及一个用户定义的符号开始,编译器忽略后面所有的文本行,直到另一个相同的用户定义符号出现。例如:

COMMENT  !

       Dasdads

       Asdasd asdas das asd

!

也可使用任何其他符号:

COMMENT  $

       Dasdads

       Asdasd asdas das asd

$

3.1.10  NOP(空操作)指令

最安全的指令时NOPno operation,一条NOP指令占用一个字节的存储,什么也不做。有事编译器或汇编器使用NOP指令把代码对齐到偶数地址边界。在下面的例子中,第一个MOV指令生成三个机器字节码,NOP指令将第三条指令的地址对齐到双字节(4的倍数)边界上。

00000000 mov ax,bx

00000003 nop        ;对齐下一条指令

00000004 mov edx,ecx


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Intel汇编语言程序设计学习-第三章 汇编语言基础-上 的相关文章

  • Spring框架中的IOC容器及bean管理

    这篇文章讲述的是Spring框架中的IOC容器及bean管理 xff0c 如有错误或者不当之处 xff0c 还望各位大神批评指正 什么是IOC容器 xff1f IOC即反转控制 xff0c 创建对象的权利交给容器来完成 xff0c 而程序要
  • 磁力机航向角计算与补偿

    地理坐标系下该点的磁场强度为 xff08 M 0 xff0c D xff09 xff0c 磁力计测得的三轴磁场强度为 xff08 mx my mz xff09 当我们认为飞机是完全水平放在地上的时候 xff0c 即Z轴和Zb轴是平行的时候
  • Decorators 装饰器

    预备知识 xff1a args的使用方法 xff0c args 用来将参数打包成tuple给函数体调用 例子一 xff1a span class token operator gt gt span span class token oper
  • 一个JAVA程序员成长之路分享

    我搞JAVA也有些日子了 因为我比较贪玩 上进心不那么强 总是逼不得已为了高薪跳槽才去学习 所以也没混成什么大牛 但好在现在也已经成家立业 小日子过的还算滋润 起码顶得住一月近万元的吃喝拉撒玩各种贷款信用卡 不为金钱过于发愁了 我特别感谢当
  • 「Jenkins Pipeline」- 执行 Shell 命令 @20210203

    问题描述 Jenkins Pipeline xff0c 更像 胶水 xff0c 将很多脚本与工具粘合在一起 xff0c 实现自动化任务 xff0c 而它本身并没有提供特定功能 执行 Shell 命令或者脚本是个非常常见的任务 该笔记将记录在
  • 「snap」- ERR - Waiting for automatic snapd restart @20210208

    问题描述 使用 snap 安装 chromium 浏览器时出现如下错误 xff0c 并一直卡住 xff1a 2020 08 21T16 56 10Z INFO Waiting for automatic snapd restart 问题原因
  • 锁屏时间格式不随多用户的时间格式变化而变化?

    背景 xff1a 时间格式有12 24小时制 xff0c 系统设置时间格式之后 xff0c 状态栏和锁屏的时间显示也会相应的发生变化 xff0c 但是现在发现一个问题 xff1a 当我切换到多用户设置时间格式的时候发现 xff0c 状态栏的
  • R语言利用igraph和networkD3包快速入门做出炫酷的社交网络图等几类图。

    原来CDSN编辑器老出问题 xff0c 图片各种显示不好 xff08 老文章依然是原来编辑器 xff09 xff0c 又将本文整理了一遍地址 1 igraph包绘制社交关系图 xff08 也有叫知识图谱的 xff09 绘图的快速入门技巧是三
  • 「Shell」- 判断字符串结尾 @20210209

    下面围绕 判断字符串是否以 txt结尾 展开 转变一下也同样适用于 判断字符串是否以 txt开头 通用的方法 方法一 使用grep命令 bin sh str 61 34 path to foo txt 34 使用if语句 if echo 3
  • 「Firefox」- 在地址栏中,显示二维码 @20210211

    问题描述 在以前某些版本的 Firefox 中 xff0c 地址栏会显示当前地址的二维码 xff0c 再后便消失 xff08 可能功能被取消 xff09 现在 xff08 02 10 2021 xff09 xff0c 我们需要在地址栏中显示
  • 「GNOME 3」- 修改 Topbar 字体(顶部栏字体)、调整默认主题 @20210211

    问题描述 在 GNOME 3 中 xff0c 在进行字体设置时 xff0c 我们发现 Topbar 的字体没有修改 xff0c 因此窗口字体与 Topbar 字体不同 经过搜索 xff0c 我们知道 xff0c Topbar 的字体是主题负
  • 「KVM」- 常见错误及注意事项 @20210223

    启动错误 1 vmport is not available with this QEMU binary 问题描述 xff1a 启动Guest时产生如下错误 xff1a error unsupported configuration vmp
  • 「Jumpserver」- 通过 SSH 连接 Jumpserver 资产 @20210302

    问题描述 在通常情况下 xff0c 我们会通过 Web 界面访问资产 执行命令 xff0c 以进行服务器管理 但是 xff0c 有时候我们也需要通过 SSH 客户端连接服务器 Jumpserver 提供对此的支持 该笔记将记录 xff1a
  • 「Selenium」- 在页面中,点击按钮(或元素) @20210311

    问题描述 该笔记将记录 xff1a 在 Selenium 中 xff0c 如何使用代码点击按钮 xff0c 以及常见问题处理 解决方案 使用 click 点击 通常点击元素使用 click 方法即可 xff1a 选择元素并进行点击 webD
  • 「Linux」- 安装网易云音乐(Neteast Cloud Music) @20210330

    问题描述 我们想在 Ubuntu 20 04 LTS 中安装网易云音乐 xff08 Neteast Cloud Music xff09 xff0c 自然是用来播放音乐 该笔记将记录 xff1a 在 Debian 及衍生版 xff08 比如
  • LaTex | 导出 PNG 图片

    问题描述 我们需要将 LaTeX 文档转换为 PNG 图片 xff08 我们需要使用 LaTeX 的 bytefield 包绘制 字节序列图 xff0c 以在 Zim 中显示 xff09 该笔记将记录 xff1a 如何使用 tex 文件 x
  • Linux:邮箱客户端

    原文地址 xff1a Linux xff1a 邮箱客户端 xff08 永久地址 xff0c 保存网址不迷路 x1f643 xff09 问题描述 我们最开始使用 Thunderbird 邮件客户端 xff0c 但是在 GNOME 3 中当收到
  • Synergy : 多电脑共享鼠标和键盘

    原文地址 xff1a Synergy 多电脑共享鼠标和键盘 xff08 永久地址 xff0c 保存网址不迷路 x1f643 xff09 注意事项 目前 xff08 09 28 2020 xff09 xff0c 建议使用 Barrier xf
  • eslint常用

    0 xff0c 1 xff0c 2分别表示off warning error三个错误级别
  • Kubernetes Objects│Service

    原文地址 xff1a Kubernetes Objects Service xff08 永久地址 xff0c 保存网址不迷路 x1f643 xff09 Service xff0c 服务 xff0c 用于暴露 Pod 以供访问 官方文档及手册

随机推荐

  • draw.io - 安装

    原文地址 xff1a draw io 安装 xff08 永久地址 xff0c 保存网址不迷路 x1f643 xff09 问题描述 我们没有采用自建 draw io 服务 xff0c 而是使用它的客户端 jgraph drawio deskt
  • Android网络优先级及更改

    Android版本 xff1a Android 4 4 4 涉及内容 xff1a 1 xff0c 网络优先级 xff1b 2 xff0c 网络切换 xff1b 3 xff0c 界面显示 解决问题 xff1a 1 xff0c 更改网络优先级
  • Java生产者、消费者模式的几种实现方式

    文章目录 方式一 xff1a BlockingQueue方式 最优方式 方式二 xff1a Synchronized 43 wait notifyAll方式方式三 xff1a ReentrantLock 43 Condition方式几种方式
  • 常识 让世界充满AI

    5 https sci hub cc 下载论文 4 问题 等于 机遇 问题抽象为可以解决执行的问题 xff0c 例如 xff1a 自动驾驶 xff0c 细化为特定场景下的自驾车 xff0c 如观光车 xff0c 公交车等 公司的核心是数据
  • iOS-NSLineBreakMode-lineBreakMode属性详解(UILabel省略号位置)

    apple文档 64 property nonatomic NSLineBreakMode lineBreakMode default is NSLineBreakByTruncatingTail used for single and m
  • spark机器学习笔记:(一)Spark Python初探

    声明 xff1a 版权所有 xff0c 转载请联系作者并注明出处 http blog csdn net u013719780 viewmode 61 contents 博主简介 xff1a 风雪夜归子 xff08 英文名 xff1a All
  • Jackson 解析 JSON 详细教程

    点赞再看 xff0c 动力无限 微信搜 程序猿阿朗 本文 Github com niumoo JavaNotes 和 未读代码博客 已经收录 xff0c 有很多知识点和系列文章 JSON 对于开发者并不陌生 xff0c 如今的 WEB 服务
  • 百度百科全站爬取教程

    百度百科全站 目前有16 330 473个词条 这里介绍一个基于scrapy的分布式百度百科爬虫 xff0c 能够全量爬取百度百科的词条 github地址 特性 百科类网站全站词条抓取 xff0c 包括百度百科 互动百科 wiki中英文站点
  • 贪心法

    贪心法 lt gt 贪心算法并不是从整体最优上加以考虑 xff0c 而是从局部最优考虑 xff0c 每次总是做出当前看起来最好的选择 xff0c 在某种意义上的局部最优选择 xff1b lt gt 最优子结构性质 xff1a lt gt 贪
  • shasum: command not found

    yum install perl Digest SHA
  • 记一次http请求报400问题

    引言 由于之前代码比较老 xff0c 都是采用http1 0方式请求 xff0c 于是采用了之前的代码进行实现 xff0c 结果之前测试没有问题 xff0c 后面投产了就报400错误了 xff0c 重新测试还是没有问题 最后通过接收方日志排
  • 数组下标排序

    前言 平时大家大多都是对数组进行各种方式的排序 xff0c 很少对数组的下标进行排序 xff0c 什么是对数组的下标进行排序 xff1f 即按数组值的大小对相应的数组下标进行排序 具体方法见以下正文 正文 解题的重点是如何保存值和下标的对应
  • SpringBoot项目无法接收到数据(Whitelabel Error Page)

    前言 在一次SpringBoot项目模块迁移的过程中 xff0c 新建的模块无法接收到前端的数据 xff0c 在地址栏输入对应的url后显示Whitelabel Error Page 正文 核对了url以及启动类上注解 64 SpringB
  • 解决android7.1系统出现的Consumer closed input channel or an error occurred. events=0x9错误

    自己实现的一个Socket聊天app xff0c 这个app是在17年的时候写的 xff08 当时也是随便写的 xff0c 没注意太多细节 xff09 xff0c 那个时候还是android4 4系统的手机 xff0c 然后写完在真机上调试
  • Java实现多线程轮流打印1-100的数字

    正文 首先打印1 100数字如果用一个单线程实现那么只要一个for循环即可 xff0c 那么如果要用两个线程打印出来呢 xff1f xff08 一个线程打印奇数 xff0c 一个线程打印偶数 xff09 于是大家会想到可以通过加锁实现 xf
  • 安卓手机利用DroidCam当电脑摄像头使用方法

    笔记本电脑有点老了 xff0c 摄像头好像坏了 xff0c 重装了一下午驱动都没弄好 xff0c 换了ubuntu系统也打不开摄像头 xff0c 然后就放弃了 xff0c 于是想到了能不能用android手机当笔记本电脑的摄像头 xff1f
  • Dell安装驱动程序出现的错误(DupAPI::Execute): *** Shell Execute Error. System error text

    在官网下的驱动却怎么也安装不上 xff0c 一直提示 The update installer operation is unsuccessful 然后打开日志文件查看 xfeff 04 10 19 10 12 11 Update Pack
  • 浮点数大小比较

    引言 在一次某公司的笔试题中出现了一题在一个无序的浮点数数组中找出相同的数 xff0c 那么在计算机中一般的整型的十进制数一般都是直接通过 61 61 来判断两个数是否相等的 xff0c 但是如果是浮点数还可以用这样的方式进行判断吗 xff
  • int的取值范围

    引言 在学C 43 43 或者Java的时候应该都会先了解各种基本数据类型的初值和它们的取值范围 xff0c 有些人可能会不太重视这块内容 xff0c 其实很重要 xff0c 很多大公司面试的过程中都会问到int的取值范围 xff0c 溢出
  • Intel汇编语言程序设计学习-第三章 汇编语言基础-上

    汇编语言基础 3 1 汇编语言的基本元素 有人说汇编难 xff0c 有人说汇编简单 xff0c 我个人不做评价 xff0c 下面是一个简单的实例 xff08 部分代码 xff09 xff1a main PROC mov eax 5 5送 E