过程

5.1  简介

需要阅读本章的理由可能很多:

1.读者可能想要学习如何在汇编语言中进行输入输出。

2.应该了解运行时栈(runtime stack),运行时栈是子过程(函数)调用以及从子过程返回的基本机制。

3.通过本章,将学到如何把大程序划分为模块化的子过程。

4.本章讲述流程图,流程图是描述程序逻辑的图形工具。

5.2  外部库链接

链接库Irvine32.lib用于32位保护模式下编写的程序,其中进行输入输出的过程调用了MS-Windows
API。库Irvine16.lib用于16位实地址模式下编写的程序,其中进行输入输出的过程调用了MS-DOS中断。

5.2.1  背景知识

链接库(link library是一个文件,其中包含了已经编译成机器码的过程。库可以由一个或多个源代码文件构成,这些文件被汇编成目标文件,然后这些目标文件被插入到一个特定格式的文件-库中,链接实用工具能够识别这种特定的文件格式。假设程序要调用名为WriteString的过程在控制台上显示一个字符串,那么程序源码中就必须包含下面的PROTO伪指令声明WriteSteing过程:

WriteString PROTO

然后,用一条CALL指令执行WeiteString过程:

call WriteString

汇编器汇编程序的时候,为CALL指令的目的地址留出空白,该空白所有将由链接器填充为实际的目的地址。链接器在链接库中查找WriteString这个名字,并从库中把响应的机器指令复制到程序的可执行文件中,然后把WriteString在可执行文件的实际地址插入到CALL指令中为目的地址留出空白处。如果视图调用不在链接库中的过程,链接器会产生一条错误消息并拒绝生成可执行文件。

链接器的命令行选项:链接器程序把程序的目标文件和其他目标文件以及库文件合并起来。例如下列命令将hello.obj,irvine32.lib,kernel32.lib相连接:

link hello.obj irvine32.lib kernel32.lib

链接32位程序:下面解释一下链接32位程序时使用的链接库kernel32.lib。kernel32.lib文件是Microsoft
Windows平台软件开发包(platform SDK)的一部分,它包含了kernel32.dll中的操作系统函数的链接信息。kernel32.dll是Microsoft
Windows操作系统的一个基本组件,称为动态链接库,其中包含了执行基本字符输入输出功能的可执行函数。读者可以把kernel32.lib想象成桐乡kernel32.dll的桥梁,如图:

5.3  本书附带的链接库

5.3.1  概述

下表列出了Irvine32和Irine16链接库中常用的过程。尽管库Irvine16.lib是用于16位(实地址)程序的,它还是使用了32位的寄存器。Irvine32.lib和Irvine16.lib同时包含本届的大多数过程。对那些只有Irvine32.lib才有的过程在描述后以”*”进行了标注。

控制台窗口:控制台窗口(console window)是MS-Windows创建的文本窗体,所有Windows版本控制台窗口的大小默认和MS-DOS一样,都是25*80的。可以使用mode命令修改行数和列数。

mode con cols=40 lines=30

重定向输入和输出  

库Irvine32和Irvine16都向控制台写输出数据。但是可以进行重定向,假设一个程序sample.exe要向标准输出(控制台)写数据,可以在命令行提示符下使用如下命令把它的输出重定向到一个名为output.txt的文件中:

sample > output.txt

input.txt内同做为输入:

sample < input.txt

可以使用一条命令同时重定向输出和输出

sample < input.txt > output.txt

还可以使用管道(|)把1的输出做为2的输入

prog1 | prog2

把1的输出做为2的输入,然后把2的输出存到文档里

prog1 | prog2 > output.txt

下面的例子中,1从文档中读取输入,然后把自己的输出做为2的输入,然后2把输出存在另一个文档中

prog1 < input.txt | prog2 > output.txt

5.3.2  过程的描述

CloseFile(仅Irvine32):CloseFile过程关闭一个之前打开的文件。文件是以文件句柄(handle)标示的,文件句柄通过EAX传递。如果文件被成功关闭,EAX中返回非零值。如:

mov eax,fileHandle

call CloseFile

Clrscr:Clrscr过程用于清除控制台窗口的内容,他们通常在程序开始和结束时使用,如果在其他时刻调用,做好在嗲用Clrscr之前暂停一下程序(调用WaitMsg),以便用户在屏幕擦除之前能够看清已有的信息,例子:

call WaitMsg

call Clrscr

Crlf:Crlf过程把光标定位到控制台窗口下一行的开始,该功能是通过向标准输出写包含0Dh和0Ah两个字符的字符串来实现的,例子:

call Crlf

CreateOutputFile(仅Irvine32):CreateOutPutFile过程创建一个磁盘文件并以输出模式打开使用时通过EDX传递要创建的文件名的偏移地址。过程返回时,如果文件成功创建,则EAX包含有效的文件句柄(一个32位整数)。如果创建失败,EAX中的值是INVALID_HANDLE_VALUE。例子:

.data

filename BYTE “newfile.txt” ,0

myhandle DWORD ?

.code

mov edx,OFFSET filename

call CreatePutputFile

cmp eax,INVALID_HANDLE_VALUE

je file_error  ;显示错误信息

mov myhandle,eax

注意:前面的代码比较EAX和预定义常量INVALID_HANDLE_VALUE是否相等。如果相等,则跳转到名为file_error的标号处。CMP和JE指令在第6张介绍,这里给出的错误处理代码是为了完成起见。

Delay:Delay过程暂停程序指定的毫秒数。在调用该程序之前需要把EAX初始化为预期暂停的时间,单位以毫秒计算。

mov eax,1000   ;1s

call Delay

DumpMem:DumpMem过程以十六进制数格式在控制台窗口中显示一块内存的内容。在调用之前,需要将ESI设置为内存的开始地址,ECX设置为元素的数目,EBX设置为元素尺寸(1=byte,2=word,4=doubleword)。下面的语句显示一个名为array的包含11个双字变量的数组:

.data

array DWORD 1,2,3,4,5,6,7,8,9,0Ah ,0Bh

.code

main PROC

mov esi,OFFSET array      ;起始地址

mov ecx,LENGTHOF array   ;元素数目

mov ebx,TYPE array        ;格式为双字

call DumpMem

上例的输出如下

DumpRegs:DumpRegs
过程以一六进制数格式显示EAX,EBX,EDX,ESI,EDI,EBP,ESP,EIP,EFL(EFLAGS)寄存器的内容,并同时显示进位、符号、零和移除标志的值。使用举例:

call DumpRegs

例子输出:

显示的EIP值是紧跟在call DumpRegs语句后面的指令的偏移地址,DumpRegs函数咋提调试程序的时候可能非常有用,因为它能够显示程序运行时CPU的状态快照。该过程没有输入参数和返回值。

Intel汇编语言程序设计学习-第五章 过程-上的更多相关文章

  1. Intel汇编语言程序设计学习-第五章 过程-下

    5.3.3  库测试程序 测试程序#1:整数I/O 该测试程序把输出文本的颜色改为蓝底黄字,然后以十六进制数显示七个数组的内容,最后提示用户输入一个有符号整数,再分别以十进制.十六进制和二进制格式重复 ...

  2. Intel汇编语言程序设计学习-第六章 条件处理-上

    条件处理 本章要点 1.简介 2.布尔和比较指令 3.条件跳转 4.条件循环指令 5.条件结构 6.应用:有限状态机 7.决策伪指令 6.1  简介 本章,读者将看到高级条件分支如何翻译成底层的实现代 ...

  3. Intel汇编语言程序设计学习-第四章 数据传送、寻址和算术运算-下

    4.3  和数据相关的操作符和伪指令 操作符和伪指令并非机器可执行的指令,相反,它们是由汇编器进行解释的.开发者可以使用一系列的MASM操作符或伪指令获取数据的地址以及大小等特征信息: OFFSET操 ...

  4. Intel汇编语言程序设计学习-第三章 汇编语言基础-下

    3.4  定义数据 3.4.1  内部数据类型 MASM定义了多种内部数据类型,每种数据类型都描述了该模型的变量和表达式的取值集合.数据类型的基本特征是以数据位的数目量的大小:8,16,32,,48, ...

  5. Intel汇编语言程序设计学习-第三章 汇编语言基础-中

    3.2  例子:整数相加减 现在来看一个进行整数加减操作的汇编语言小程序.寄存器用于存放中间数据,我们调用一个库函数在屏幕上显示寄存器的内容.下面是程序的源码: TITLE Add and Subtr ...

  6. Intel汇编语言程序设计学习-第三章 汇编语言基础-上

    汇编语言基础 3.1  汇编语言的基本元素 有人说汇编难,有人说汇编简单,我个人不做评价,下面是一个简单的实例(部分代码): main PROC mov  eax,5  ;5送EAX寄存器 add   ...

  7. Intel汇编语言程序设计学习-第六章 条件处理-中

    6.3  条件跳转 6.3.1  条件结构 在IA-32指令集中没有高级的逻辑结构,但无论多么复杂的结构,都可以使用比较和跳转指令组合来实现.执行条件语句包括两个步骤:首先,使用CMP,AND,SUB ...

  8. Intel汇编语言程序设计学习-第六章 条件处理-下

    6.6  应用:有限状态机 这个东西说了半天,感觉就是把逻辑弄得跟有向图一样,没看出来什么高端的东西,下面就整理下书上说的概念: 有限状态机(FSM,Finite-State Machine)是依据输 ...

  9. Intel汇编语言程序设计学习-第一章 基本概念

    第一章基本概念 1.1  简单介绍 本书着重讲述MS-Windows平台上IA-32(Intel Architecture 32bit,英特尔32位体系架构)兼容微处理器的汇编语言程序设计,可以使用I ...

随机推荐

  1. js--this指向的相关问题

    前言 关于this的指向问题是前端面试中常考的知识点,也是我们开发学习中较难理解的问题.作为JavaScript的基础,需要我们彻底理解这一关键词.this作为JavaScript中非常复复杂的机制, ...

  2. Nginx重定向到其他端口

    location / { # limit_req zone=test_req burst=5 nodelay; return 302 http://$host:3000/; } # 我这里的端口为30 ...

  3. weblogic弱口令+后台getshell

     https://www.cnblogs.com/bmjoker/p/9822886.html利用docker环境模拟了一个真实的weblogic环境,其后台存在一个弱口令,并且前台存在任意文件读取漏 ...

  4. 如何在Bash脚本中引入alias

    更多精彩内容,请关注微信公众号:后端技术小屋 alias的使用 在日常开发中,为了提高运维效率,我们会用alias(命令别名)来定义命令的简称.比如在~/.bash_profile中添加: alias ...

  5. frameset、frame和div 、iframe

    框架一般应用于首页的界面排版工作.把一个网页切割成多个页面管理.frame文件一般只包含框架的布局信息,不会包含其他内容,所有的页面效果都是在各个frameset页面内显示.他们都从属于frame文件 ...

  6. dex、apk完整性校验

    对Dex进行完整性的检查,可通过CRC,或者Hash值.可将校验值放到String资源文件里,或者放到服务器中. 在代码中完成校验值对比逻辑,此部分代码后续不能再改变,否则CRC值会发生变化: 从生成 ...

  7. 【故障公告】阿里云 RDS SQL Server 数据库实例 CPU 100% 引发全站故障

    非常抱歉,今天 8:48 开始,我们使用的阿里云 RDS SQL Server 数据库实例突然出现 CPU 100%  问题,引发全站故障,由此给您带来麻烦,请您谅解. 发现故障后立即进行主备切换,和 ...

  8. 庐山真面目之十四微服务架构的Docker虚拟技术深入探究

    庐山真面目之十四微服务架构的Docker虚拟技术深入探究 一.我的开场白 曾几何时,分布式的发展也影响了后来的微服务架构的实现方式.到了现在,只要涉及到互联网技术领域,就会设计一个概念,那就是微服务. ...

  9. 用 customRef 做一个防抖函数,支持 element 等UI库。

    这几天学习Vue的官网,看到 customRef 提供了一个例子,研究半天发现这是一个防抖函数,觉得挺好,于是把这个例子扩展了一下,可以用于表单子控件和查询子控件. 需求 v-model 基于 ele ...

  10. 关于C语言解决汉诺塔(hanoi)问题

    C语言解决汉诺塔问题 汉诺塔是典型的递归调用问题: hanoi简介:印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论白天黑夜,总有一个僧侣 ...