Intel汇编语言程序设计学习-第三章 汇编语言基础-上
汇编语言基础
3.1 汇编语言的基本元素
有人说汇编难,有人说汇编简单,我个人不做评价,下面是一个简单的实例(部分代码):
main PROC
mov eax,5 ;5送EAX寄存器
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.指令助记符,如MOV、ADD和MUL等。
2.伪指令,用于告诉MASM如何编译程序。
3.属性,用于为变量和操作数提供有关尺寸以及使用方式的信息,如BYTE和WORD。
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指令
每个汇编器都有一套不同的伪指令。例如,TASM(Borland)以及NASM和MASM的伪指令有一个公共的交集子集,而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是辅助记忆的方法的意思。与此非常相似,汇编语言指令助记符如mov,add何sub等给出了关于指令要执行何种类型操作的提示:
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(空操作)指令
最安全的指令时NOP(no operation),一条NOP指令占用一个字节的存储,什么也不做。有事编译器或汇编器使用NOP指令把代码对齐到偶数地址边界。在下面的例子中,第一个MOV指令生成三个机器字节码,NOP指令将第三条指令的地址对齐到双字节(4的倍数)边界上。
00000000 mov ax,bx
00000003 nop ;对齐下一条指令
00000004 mov edx,ecx
Intel汇编语言程序设计学习-第三章 汇编语言基础-上的更多相关文章
- Intel汇编语言程序设计学习-第三章 汇编语言基础-下
3.4 定义数据 3.4.1 内部数据类型 MASM定义了多种内部数据类型,每种数据类型都描述了该模型的变量和表达式的取值集合.数据类型的基本特征是以数据位的数目量的大小:8,16,32,,48, ...
- Intel汇编语言程序设计学习-第三章 汇编语言基础-中
3.2 例子:整数相加减 现在来看一个进行整数加减操作的汇编语言小程序.寄存器用于存放中间数据,我们调用一个库函数在屏幕上显示寄存器的内容.下面是程序的源码: TITLE Add and Subtr ...
- Struts2框架学习第三章——Struts2基础
本章要点 — Struts 1框架的基本知识 — 使用Struts 1框架开发Web应用 — WebWork框架的基本知识 — 使用WebWork框架开发Web应用 — 在Eclipse中整合To ...
- Intel汇编语言程序设计学习-第四章 数据传送、寻址和算术运算-下
4.3 和数据相关的操作符和伪指令 操作符和伪指令并非机器可执行的指令,相反,它们是由汇编器进行解释的.开发者可以使用一系列的MASM操作符或伪指令获取数据的地址以及大小等特征信息: OFFSET操 ...
- Intel汇编语言程序设计学习-第六章 条件处理-上
条件处理 本章要点 1.简介 2.布尔和比较指令 3.条件跳转 4.条件循环指令 5.条件结构 6.应用:有限状态机 7.决策伪指令 6.1 简介 本章,读者将看到高级条件分支如何翻译成底层的实现代 ...
- Intel汇编语言程序设计学习-第五章 过程-下
5.3.3 库测试程序 测试程序#1:整数I/O 该测试程序把输出文本的颜色改为蓝底黄字,然后以十六进制数显示七个数组的内容,最后提示用户输入一个有符号整数,再分别以十进制.十六进制和二进制格式重复 ...
- Intel汇编语言程序设计学习-第五章 过程-上
过程 5.1 简介 需要阅读本章的理由可能很多: 1.读者可能想要学习如何在汇编语言中进行输入输出. 2.应该了解运行时栈(runtime stack),运行时栈是子过程(函数)调用以及从子过程返回 ...
- Intel汇编语言程序设计学习-第六章 条件处理-下
6.6 应用:有限状态机 这个东西说了半天,感觉就是把逻辑弄得跟有向图一样,没看出来什么高端的东西,下面就整理下书上说的概念: 有限状态机(FSM,Finite-State Machine)是依据输 ...
- Intel汇编语言程序设计学习-第六章 条件处理-中
6.3 条件跳转 6.3.1 条件结构 在IA-32指令集中没有高级的逻辑结构,但无论多么复杂的结构,都可以使用比较和跳转指令组合来实现.执行条件语句包括两个步骤:首先,使用CMP,AND,SUB ...
随机推荐
- mysql内一些可以延时注入的查询语句
一.sleep() 配合其他函数进行使用将十分方便,如下所示: 拆分讲解: select substr(database(),1,1) ; 截取当前数据库的第一位,转换为ascii码值: se ...
- springboot源码解析-管中窥豹系列之BeanFactoryPostProcessor(十一)
一.前言 Springboot源码解析是一件大工程,逐行逐句的去研究代码,会很枯燥,也不容易坚持下去. 我们不追求大而全,而是试着每次去研究一个小知识点,最终聚沙成塔,这就是我们的springboot ...
- FreeBSD 日常应用
freebsd日常应用 办公libreoffice或者apache openoffice 设计 图像编辑:gimp 矢量图设计:lnkscape 视频剪辑:openshot 视频特效:natron 编 ...
- FreeBSD 12.2 vmware 虚拟机镜像 bt 种子
安装了 KDE5 火狐浏览器 Fcitx 输入法 并进行了中文设置 替换软件源为国内可用. VirtualBox虚拟机也可以用 magnet:?xt=urn:btih:E88885631B57426 ...
- Python装饰器(3)
这篇文章中记录说明下多个装饰器一同装饰同一个函数时的执行顺序问题. [装饰器链] 按照惯例,先看代码示例: import time def debug1(str): #传参接受类的方法 def fun ...
- 工具 | Typora + PicGo-Core 自动上传图片到图床
0 前言 Markdown 是现在十分流行的标记式语言,在博客等很多场景中应用十分广泛.众所周知,Markdown 中的图片是以链接的形式存在的,不像 Word 等传统文本编辑器直接把图片嵌入文档中. ...
- Netflix业务运维分析和总结
目录 Netflix工作环境的分析和思考 为什么Netflix会做得如此极致? 海量业务规模下的技术架构和挑战 更加合理的组织架构和先进的工具体系及理念 自由与责任并存的企业文化 当前问题: 精选提问 ...
- 原来Java的发家史是这么回事
java的诞生: 1991 年Sun公司成立了一个计算机开发小组,由James Gosling等人开发一款希望用于控制嵌入在有线电视交换盒.PDA等的微处理器的计算机语言,本来他们想直接扩展C++,后 ...
- python基础(十七):函数
在正式讲述函数之前,先给大家说明一点:编写函数就是"面向过程"的方式,编写类就是"面向对象"的方式.你如果不知道这是啥意思,至少别人提到这2个词你应该知道是在干 ...
- Cobalt Strike使用教程一
Cobalt Strike使用教程一 0x00 简介 Cobalt Strike是一款基于java的渗透测试神器,常被业界人称为CS神器.自3.0以后已经不在使用Metasploit框架而作为 ...