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 ...
随机推荐
- 漏洞复现-Bash之一键破壳
注:使用docker搭建测试环境 (1)访问搭建的环境网址:http://192.168.11.101:8081/ (2)使用burp拦截数据包,并修改User-Agent的内容: (3)使用 ...
- web图像化服务管理工具
在 CentOS 8 中安装 Cockpit Web 控制台 Cockpit 是红帽开发的网页版图像化服务管理工具,优点是无需中间层,且可以管理多种服务. 根据其项目主站描述,Cockpit 有如下特 ...
- [Redis知识体系] 一文全面总结Redis知识体系
本系列主要对Redis知识体系进行详解.@pdai Redis教程 - Redis知识体系详解 知识体系 学习资料 知识体系 知识体系 相关文章 首先,我们通过学习Redis的概念基础,了解它适用的场 ...
- ch1_6_3求解移动字符串问题
import java.util.Scanner; public class ch1_6_3求解移动字符串问题 { public static void main(String[] args) { / ...
- ABP 适用性改造 - 精简 ABP CLI 生成的项目结构
Overview 不管是公司或者个人都会有不同的开发习惯,通过建立项目模板,既可以使开发人员聚焦于业务功能的开发,也可以在一定程度上统一不同开发人员之间的开发风格.在使用 ABP 框架的过程中,对于 ...
- 如何优雅地学习计算机编程-C++1
如何优雅的学习计算机编程--C++ 0.导入 如何优雅地学习计算机编程.我们得首先了解编程是什么?打个比方--写信. 大家都知道写信所用的语言双方都懂,这样的信才做到了信息交流,人和计算机也是如此人和 ...
- SFDC 删除操作时:验证或触发后续操作的一般解决方案
删除操作比较特殊,不能通过Workflow Rule和Process Builder,Validation Rule来Check和相应做后续操作. 目前调查只有两种工具可以监听到删除操作: Apex ...
- 再学dockerfile
前言 docker的系统学习可以看我这篇博文:https://www.cnblogs.com/zisefeizhu/p/11298818.html 有非常详细的讲解 容器现在都是用kubernetes ...
- 经典变长指令ModR/M
变长指令 不是所有的指令都是,看到opcode就知道有多长(定长指令),当指令中出现内存操作对象的时候,就需要在操作码后面附加一个字节来进行补充说明,这个字节被称为ModR/M. 该字节的8个位被分成 ...
- element Notification 通知文字换行小技巧
this.$notify({ title: "通知", message: res.result, iconClass: "el-icon-bell",//自定义 ...