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 ...
随机推荐
- 擅用ABAP错误捕捉,避免系统Dump
有时候我们在写程序时,会因为计算公式不符合算术表达式,计算公式的字段值不是纯数值等等问题造成程序dump,这个时候我们在无法避免字段赋值错误的情况下,又不想程序dump可以采取catch异常的方法进行 ...
- 单链表及基本操作(C语言)
#include <stdio.h> #include <stdlib.h> /** * 含头节点单链表定义及基本操作 */ //基本操作函数用到的状态码 #define TR ...
- PTE 准备之 Personal introduction
Task strategies Be prepared! This is your opportunity to give the admissions officers a first impres ...
- 翻译:《实用的Python编程》06_03_Producers_consumers
目录 | 上一节 (6.2 自定义迭代) | 下一节 (6.4 生成器表达式) 6.3 生产者,消费者和管道 生成器在设置各种生产者/消费者问题(producer/consumer problems) ...
- SQL排名问题,100% leetcode答案大公开!
(首先原谅我最近新番看多了,起了一个中二的名字) 最近在找实习,所以打算系统总结(复习)一下sql中经常遇到问题.不管是刷leetcode还是牛客的sql题,有一个问题总是绕不开的,那就是排名问题.其 ...
- Android Studio 之 RadioButton
•任务 如何通过 RadioButton 实现如图所示的界面? •基本用法 RadioButton 单选按钮,就是只能够选中一个,所以我们需要把 RadioButton 放到 RadioGroup 按 ...
- Java生鲜电商平台-API接口设计之token、timestamp、sign 具体架构与实现(APP/小程序,传输安全)
Java生鲜电商平台-API接口设计之token.timestamp.sign 具体设计与实现 说明:在实际的业务中,难免会跟第三方系统进行数据的交互与传递,那么如何保证数据在传输过程中的安全呢(防窃 ...
- Java【IO流、字节流、字符流】
1.内存是临时存储 Input输入(读取) output输出(输出) 流:数据(字符字节)1个字符=2个字节 1个字节=8个二进制位 输入:把硬盘中的数据读取到内存中 输出:把内存中的数据写入到硬盘中 ...
- 记一次 .NET游戏站程序的 CPU 爆高分析
一:背景 1. 讲故事 上个月有个老朋友找到我,说他的站点晚高峰 CPU 会突然爆高,发了两份 dump 文件过来,如下图: 又是经典的 CPU 爆高问题,到目前为止,对这种我还是有一些经验可循的. ...
- Message Decoding UVA - 213
Some message encoding schemes require that an encoded message be sent in two parts. The fifirst par ...