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 ...
 
随机推荐
- Java 获取小程序openid(基于SpringBoot)
			
Java 获取小程序openid(基于SpringBoot) 官方文档 wx.login 1.引入Request封装依赖 <!--Request依赖--> <dependency&g ...
 - FreeBSD ibus输入法框架配置
			
FreeBSD ibus输入法框架配置 ibus输入法框架配置.xinitrc中增加XIM=ibus; export XIMGTK_IM_MODULE=ibus; export GTK_IM_MODU ...
 - 使用自定义注解和切面AOP实现Java程序增强
			
1.注解介绍 1.1注解的本质 Oracle官方对注解的定义为: Annotations, a form of metadata, provide data about a program that ...
 - springboot注解之@Configuration 和 @Bean
			
1.包结构 2.主程序类 1 /** 2 * 主程序类 3 * @SpringBootApplication:这是一个springboot应用 4 * 5 * @SpringBootApplicati ...
 - slickgrid ( nsunleo-slickgrid ) 1 开篇有益
			
slickgrid (nsunleo-slickgrid) 1 开篇有益 作为专职的程序猿,自认为是老菜鸟或老民工,以前一直在某浪上写博客,上知天文,下达地理.做了N年的.net,又转Java,从 ...
 - JAVA使用Collator对中文排序
			
首先创建一个集合 public static List<String> init() { List<String> list = new ArrayList<String ...
 - python创建一个二维列表
			
方法一:利用for-in语句来生成一个二维列表 a = [] 2 for i in range(10): 3 a.append([]) 4 for j in range(10): 5 a[i].app ...
 - python2文件开头两行
			
#!/usr/bin/python 或者 #!/usr/bin/env python 告诉操作系统python位置 # -*- coding:utf-8 -*- 设置文件编码为utf-8 (默认 ...
 - Java中的equals()和hashCode() - 超详细篇
			
前言 大家好啊,我是汤圆,今天给大家带来的是<Java中的equals()和hashCode() - 详细篇>,希望对大家有帮助,谢谢 文章纯属原创,个人总结难免有差错,如果有,麻烦在评论 ...
 - [.net] 关于Exception的几点思考和在项目中的使用(二)
			
本文链接: https://www.cnblogs.com/hubaijia/p/about-exceptions-2.html 系列文章: 关于Exception的几点思考和在项目中的使用(一) 关 ...