zoukankan      html  css  js  c++  java
  • Intel汇编语言程序设计学习-第五章 过程-上

    过程

    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.objirvine32.libkernel32.lib相连接:

    link hello.obj irvine32.lib kernel32.lib

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

     

    5.3  本书附带的链接库

    5.3.1  概述

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

     

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

    mode con cols=40 lines=30

    重定向输入和输出  

    Irvine32Irvine16都向控制台写输出数据。但是可以进行重定向,假设一个程序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过程把光标定位到控制台窗口下一行的开始,该功能是通过向标准输出写包含0Dh0Ah两个字符的字符串来实现的,例子:

    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的标号处。CMPJE指令在第6张介绍,这里给出的错误处理代码是为了完成起见。

    DelayDelay过程暂停程序指定的毫秒数。在调用该程序之前需要把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 过程以一六进制数格式显示EAXEBXEDXESIEDIEBPESPEIPEFLEFLAGS)寄存器的内容,并同时显示进位、符号、零和移除标志的值。使用举例:

    call DumpRegs

    例子输出:

     

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

     

  • 相关阅读:
    【BZOJ】1045: [HAOI2008]糖果传递(中位数)
    【BZOJ】1011: [HNOI2008]遥远的行星(近似)
    【BZOJ】1034: [ZJOI2008]泡泡堂BNB(贪心)
    【BZOJ】1029: [JSOI2007]建筑抢修(贪心)
    【BZOJ】1022: [SHOI2008]小约翰的游戏John(博弈论)
    【BZOJ】1010: [HNOI2008]玩具装箱toy(dp+斜率优化)
    noip2014滚粗记
    【NOIP模拟题】Permutation(dp+高精度)
    MySQL 关于自定义函数的操作
    MySQL 关于存储过程的操作
  • 原文地址:https://www.cnblogs.com/csnd/p/12062286.html
Copyright © 2011-2022 走看看