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 ...
随机推荐
- 漏洞复现-ActiveMq反序列化漏洞(CVE-2015-5254)
0x00 实验环境 攻击机:Win 10 靶机也可作为攻击机:Ubuntu18 (docker搭建的vulhub靶场) 0x01 影响版本 Apache ActiveMQ 5.13.0之前 ...
- Netty源码 reactor 模型
翻阅源码时,我们会发现netty中很多方法的调用都是通过线程池的方式进行异步的调用, 这种 eventLoop.execute 方式的调用,实际上便是reactor线程.对应项目中使用广泛的NioE ...
- java内部类 的理解
* 类的第5个成员:内部类 * 1.相当于说,我们可以在类的内部再定义类.外面的类:外部类.里面定义的类:内部类 * 2.内部类的分类:成员内部类(声明在类内部且方法外的) vs 局部内部类(声明在类 ...
- String 类的内存 解析
关于String类的内存解析 Person类的内存解析
- Python-jet后台管理的使用
python-django-jet库的使用 1.安装 pip install django-jet 2.配置 将'jet'应用添加到你的Django项目的设置文件settings.py中的INSTAL ...
- Bi-shoe and Phi-shoe LightOJ - 1370(数论+素数筛)
题目链接:https://vjudge.net/problem/LightOJ-1370 题意:给你N个欧拉函数值,找出每一个大于等于该欧拉函数值的数,并且要求相加和最小. 题解:因为素数i的欧拉函数 ...
- 一文搞懂如何实现 Go 超时控制
为什么需要超时控制? 请求时间过长,用户侧可能已经离开本页面了,服务端还在消耗资源处理,得到的结果没有意义 过长时间的服务端处理会占用过多资源,导致并发能力下降,甚至出现不可用事故 Go 超时控制必要 ...
- C++ 虚函数的内部实现
C++ 虚函数的内部实现 虚函数看起来是个玄之又玄的东西,但其实特别简单!了解了虚函数的内部实现,关于虚函数的各种问题都不在话下啦! 1. 知识储备 阅读这篇文章,你需要事先了解以下几个概念: 什么是 ...
- Springboot进行Http接口交互实现邮件告警
本项目采用idea编辑器,依赖maven环境,相关搭建请自行百度一.引入相关依赖 本文Http接口交互使用hutool工具类与阿里FastJson解析报文. <dependencies&g ...
- 「HTML+CSS」--自定义加载动画【009】
前言 Hello!小伙伴! 首先非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出- 哈哈 自我介绍一下 昵称:海轰 标签:程序猿一只|C++选手|学生 简介:因C语言结识编程,随后转入计算机 ...