Intel汇编语言程序设计学习-第三章 汇编语言基础-中
3.2 例子:整数相加减
现在来看一个进行整数加减操作的汇编语言小程序。寄存器用于存放中间数据,我们调用一个库函数在屏幕上显示寄存器的内容。下面是程序的源码:
TITLE Add and Subtract (AddSub.asm)
;This program adds and subtracts 32-bit integers.
INCLUDE Irvine32.inc
.code
main PROC
mov eax,10000h ;EAX = 10000h
add eax,40000h ;EAX = 50000h
sub eax,20000h ;EAX = 30000h
call DumpRegs ;display registers
exit
main ENDP
END main
执行结果(我用vs2012+MASM32执行的)
现在来解释上面代码:
TITLE Add and Subtract (AddSub.asm) TITLE伪指令将整行标为注释,该行可放置任何东西。
;This program adds and subtracts 32-bit integers. 编译器忽略分号右边的所有文本。
INCLUDE Irvine32.inc INCLUDE伪指令从Irvine32.inc文件中复制必须的定义和设置信息,Irvine32.inc在汇编器的INCLUDE目录中。
.code .code伪指令用来标记代码段的开始,代码段中存放程序中的所有可执行语句。
Main PROC PROC伪指令用来标示一个过程的开始,我们为程序中唯一的过程选择的名字是main.
Mov eax,10000h MOV指令把整数10000h送(复制)到EAX寄存器。第一个操作数(EAX)称为目的操作数,第二个操作数称为源操作数。
add eax,40000h ADD指令将40000h加到EAX寄存器上。
sub eax,20000h SUB指令从EAX寄存器中减掉20000h。
CALL调用一个现实CPU寄存器值的过程,这是正式程序正确运行的一种有效方法。
exit
main ENDP exit语句(间接)调用一个预定义的MS-Windows函数来终止程序。ENDP伪指令标记main过程的结束。注意,exit并不是MASM的关键字,而是Irvine32.inc中定义的命令,它提供了一种结束程序的简便方法。
END main
END 伪指令表明该行是汇编程序的最后一行。编译器将忽略该行后面的所有内容。其后的标示符main是程序启动过程(即程序启动时执行的子程序,或程序入口点)的名字。
段:程序是以段组织的,常见的段有代码段、数据段和堆栈段等。代码段包含程序的全部可执行指令,通常代码段中包含一个活多个过程,其中一个是启动过程。在AddSub程序中,main就是启动过程。堆栈段用于存放过程的参数和局部变量,数据段则用于存放变量。
编码风格:由于汇编语言是大小写不敏感的(默认情况下),因此就源代码的大小写而言,没有固定的规则,单位了增强可读性,应该再代码中一致地使用大小写及标示符命名。
3.2.1 AddSub的另一个版本
AddSub程序使用了Irvine32.inc文件,该文件隐藏了一些实现细节。也许最终你能够理解Irvine32.inc中所有东西,不过现在我们才刚刚开始学习汇编语言,所以有必要不依赖于它来一发上面那个AddSub的程序,粗体字用于标示与前一个程序的不同之处:
TITLE Add and Subtract (AddSubAlt.asm)
;This program adds and subtracts 32-bit integers.
.386
.model flat,stdcall
.stack 4096
ExitProcess PROTO, dwExitCode:DWORD
DumpRegs PROTO
.code
main PROC
mov eax,10000h
add eax,40000h
sub eax,20000h
call DumpRegs
INVOKE ExitProcess,0
main ENDP
END main
运行结果:
解释新增部分:
.386 指出了改程序要求的最低CPU(Intel386)。
.model flat,stdcall .MDOE伪指令只是汇编器为保护模式程序生成代码,STDCALL允许调用MS-Windows函数。
ExitProcess PROTO ,dwExitCode:DWORD
DumpRegs PROTO
两条PROTO伪指令声明了改程序使用的过程原型;ExitProcess是一个MS-Windows函数,其作用是终止当前程序(进程);DumpRegs是Irvine32连接库中一个现实寄存器的过程。
INVOKE ExitProcess,0 程序通过调用ExitProcess来结束执行,传递给该函数的参数是返回码。取值是0.INVOKE是一个用于调用过程或函数的汇编伪指令。
3.2.2 程序模板
汇编语言程序有一个简单的基本结构,这个框架随情况不同可能略有变化。开始编写程序的时候,读者可借助于模板迅速创建具有基本元素的空程序外壳,然后只需要填写其中缺少的部分并以新名字保存文件即可,这样就可以避免重复键入相同的内容。下面的保护莫模式程序模板,便于根据需要进行自定义。注意在文件中插入的注释表明了何处需要加读者自己的代码:
TITLE Program Template (Template.asm)
;程序的描述:
;作者:
;创建日期
;修改:
;日期:
;修改者
INCLUDE Irvine32.inc
.data
;(在此插入变量)
.code
main PROC
;(在此插入可执行代码)
exit
main ENDP
;(在此插入其他子程序)
END main
使用注释:程序的开始位置插入了几个注释区域。在程序中包含程序的描述、作者的名字、创建日期以及后续的修改信息等是一个不错的注意。这种文档对任何阅读程序的人都很有用。
3.3 汇编、连接和运行程序
汇编器生成一个包含机器语言的文件,称为目标文件。目标文件还不能执行,必须把目标文件传递给另外一个称为链接器的程序,由链接器生成可执行文件。可执行文件就可以在MS-DOS/MS-Windows命令提示符下执行了。
3.3.1 汇编-链接-执行
编辑、编译、链接和执行汇编语言程序的过程总结在下图中:
下面是每个步骤的详细说明。
1.程序员使用文本编辑器创建ASCII文本文件,称为源文件(source file)。
2.汇编器读取源文件并生成目标文件(object file),目标文件是源文件到机器语言的翻译。另外还可以选择生成列表文件(listing
file)。如果发生了错误,程序员必须回到1修正程序。
3.链接器读取目标文件并检查程序是否调用了链接库中的过程,链接器从库中复制所需的过程并将其同目标文件合并在一起生成可执行文件(executable file),还可以选择生成映像文件(map
file)。
4.操作系统的装载器(loader)将可执行文件读入内存,并使CPU转移到程序的其实地址开始执行。
列表文件
列表文件的内容包括程序源代码及行号、偏移地址、翻译后的机器码和一个符号表,其格式很适合于打印。下面是例子:
测试代码:
TITLE Add and Subtract (AddSubAlt.asm)
;This program adds and subtracts 32-bit integers.
.386
.model flat,stdcall
.stack 4096
ExitProcess PROTO, dwExitCode:DWORD
DumpRegs PROTO
.code
main PROC
mov eax,10000h
add eax,40000h
sub eax,20000h
call DumpRegs
INVOKE ExitProcess,0
main ENDP
END main
对应的列表文件:
链接器创建或更新的文件
映像文件:影响文件是包含被连接程序的分段信息的文本文件,主要包含以下信息:
1.模块名。模块名作为链接器生成的可执行文件的基本名(除扩展名外的部分)
2.程序文件头中(不是取自文件系统)的时间戳。
3.程序中各个段组的列表,包括每个段组的起始地址、长度、组名和类别信息。
4.公共符号的列表,包括每个符号的地址、名称、线性地址和定义符号的模块。
5.程序入口地址。
程序数据库文件:若以-ZI(调试)选项来编译程序,MASM就会创建程序数据库文件(*.PDB)。在链接阶段,链接器读取并更新它。在调试程序的时候,调试器可以根据PDB显示程序的源代码、数据、运行时栈以及其他附加信息。
Intel汇编语言程序设计学习-第三章 汇编语言基础-中的更多相关文章
- Intel汇编语言程序设计学习-第三章 汇编语言基础-下
3.4 定义数据 3.4.1 内部数据类型 MASM定义了多种内部数据类型,每种数据类型都描述了该模型的变量和表达式的取值集合.数据类型的基本特征是以数据位的数目量的大小:8,16,32,,48, ...
- Intel汇编语言程序设计学习-第三章 汇编语言基础-上
汇编语言基础 3.1 汇编语言的基本元素 有人说汇编难,有人说汇编简单,我个人不做评价,下面是一个简单的实例(部分代码): main PROC mov eax,5 ;5送EAX寄存器 add ...
- 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 ...
随机推荐
- R绘图(3): 散点图添加文本注释
这里以火山图为例进行说明,在转录组分析中,火山图是很常见的一类图,纵轴表示p_value,横轴表示log (fold change).单一的散点图绘制很简单,火山图比较难处理的地方就是一些基因的注释, ...
- java基础:变量、常量与作用域
变量就是可以变化的量,每个变量都必须声明其类型,Java 变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域.作用域 类变量 实例变量 局部变量常量初始化后不能在改变值,不会变动的值,它 ...
- Java 在PPT中添加文本水印的简易方法(单一/平铺水印)
[前言] 在PPT幻灯片中,可通过添加形状的方式,来实现类似水印的效果,可添加单一文本水印效果,即在幻灯片中心位置水印以单个文本字样显示,但通过一定方法也可以添加多行(平铺)文本水印效果,即在幻灯片中 ...
- 2018.12-2019.1 TO-DO LIST
AC自动机 P3808 [模板]AC自动机(简单版)(完成时间:2018.12.06) P3796 [模板]AC自动机(加强版)(完成时间:2018.12.06) P2444 [POI2000]病毒( ...
- mongodb为什么比mysql效率高
首先是内存映射机制,数据不是持久化到存储设备中的,而是暂时存储在内存中,这就提高了在IO上效率以及操作系统对存储介质之间的性能损耗.(毕竟内存读取最快) 其次,NoSQL并不是不使用sql,只是不使用 ...
- TIOBE 编程语言排行榜
https://www.tiobe.com/tiobe-index/ TIOBE 编程语言排行榜是编程语言流行趋势的一个指标
- POJ_1458 Common Subsequence 【LCS】
一.题目 Common Subsequence 二.分析 比较基础的求最长升序子序列. $DP[i][j]$表示的是字符串$S1[1...i]$与$S2[1...j]$的最长公共子序列长度. 状态转移 ...
- 一文彻底掌握Apache Hudi的主键和分区配置
1. 介绍 Hudi中的每个记录都由HoodieKey唯一标识,HoodieKey由记录键和记录所属的分区路径组成.基于此设计Hudi可以将更新和删除快速应用于指定记录.Hudi使用分区路径字段对数据 ...
- Dynamics CRM的Associate功能
Dynamics CRM有一种特殊的关联关系叫Associate,一般常见于为用户分配角色.给团队添加用户.团队添加角色.队列添加用户等等.在一些特定场景下我们不可能把所有的操作都通过手动来完成尤其是 ...
- ThoughtWorks首席咨询师带你一站通关中台
大家都在谈中台,是当下一个热议的话题,但是我们最关心的两个基本问题还是没有答案.一个是中台的概念,依然是见仁见智,始终没有一个统一的见解:另一个是中台的落地,更是鲜有人谈. 拨开当下有关中台的层层迷雾 ...