第五章--过程

5.3.2过程的描述

CloseFile:CloseFile过程关闭一个以前打开的文件。文件是以文件句柄标识的,文件句柄通过EAX传递。如果文件被成功关闭,eax中返回值为非零值。

Clrscr:Clrscr过程用于清除控制台窗口的内容,它通常在程序开始和结束时使用。如果在其他时刻调用,最好在调用之前暂停一下程序。一边用户在屏幕被擦除之前能够看清楚已有的信息。

eg

include irvine32.inc 

;创建用户自定义类型
    PBYTE    TYPEDEF    PTR BYTE
    PWORD     TYPEDEF PTR WORD
    PDWORD     TYPEDEF    PTR DWORD
.data
    arrayB    BYTE 10H,20H,30H
    arrayW  WORD 1,2,3
    arrayD  DWORD 4,5,6

;创建一些指针类型
ptr1    PBYTE    arrayB
ptr2    PWORD    arrayW
ptr3     PDWORD  arrayD

.code
    main1 PROC

    mov eax,0
    mov ebx,0
    mov ecx,0
    mov esi,0

    mov  esi,ptr1
    mov al,[esi]

    mov esi,ptr2
    mov bx,[esi]

    mov esi,ptr3
    mov ecx,[esi]

    call DumpRegs
    call WaitMsg;
    call Clrscr
    exit
    main1 ENDP
    END main1

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

CreatteOutput:CreateOutputFile过程创建一个磁盘文件并以输出模式打开。使用时通过EDX传递要创建的文件名的偏移地址。过程返回时,如果文件成功创建,则EAX包含有效的文件句柄。如果创建失败,EAX中的值是INVALID_HANDLE_VALUE一个预定义的常量

include irvine32.inc

.data
    filename BYTE "newfile.txt",0
.data?
    handle     DWORD ?
.code
    main PROC
        mov edx, OFFSET filename
        call CreateOutputFile
        call CloseFile
        exit
    main ENDP
    END main

此程序运行成功后会在你的工程名下创建一个相应的txt文件

 

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

 

DumpMen:以十六进制数格式在控制台窗口中显示一块内存的内容。在调用之前,需要将esi设置为内存的开始地址,ecx设置为元素数目ebx设置为元素尺寸。

eg:

include irvine32.inc

.data
    array    WORD 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
        exit 

    main    ENDP
    end  main

Dump of offset 00A74000

-------------------------------

0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B

 

DumpRegs:以十六进制数格式,显示EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP,EIP,EFL寄存器的内容,并同时显示进位、符号位、零和溢出位标志的值。

 

GetCommandTail:把程序的命令复制到一个以空字符结尾的字符串中,如果命令行为空,则设置进位标志,否则清除进位标志,这个过程

 

Writestring:在控制台上显示一个字符串

include irvine32.inc

.data
    filename BYTE "Welcome  to masm",0
.code
    main PROC
        mov edx,OFFSET filename
        call WriteString
        call Crlf
        exit
    main ENDP
    END main

运行结果:

Welcome  to masm

请按任意键继续. . .

等等函数的使用

5.3.3库测试程序

eg.1

把输出文本的颜色改为蓝底黄字,然后以十六进制数显示一个数组的内容,最后提示用户输入一个有符号整数,再分别以十进制、十六进制和二进制数格式重复显示该整数

include irvine32.inc

.data
    arrayD    DWORD    1000H,2000H,3000H,4000H
    prompt1    BYTE    "Enter a 32Bit signed integer:",0
    dwordVal DWORD ?
.code
    main PROC
    ;设置文本颜色为蓝底黄字
        mov eax, yellow+(blue*16)
        call SetTextColor
        call Clrscr
    ;使用DumpMem过程显示数组的内容
    mov esi,OFFSET arrayD
    mov ecx,LENGTHOF arrayD
    mov ebx,TYPE    arrayD
    call DumpMem    ;以16进制方式显示一个数组的内容
    call Crlf        ;换行

    ;提示用户输入一个十进制整数
    mov edx,OFFSET prompt1
    call WriteString    ;在控制台显示字符串
    call ReadInt      ;输入一个整数
    mov dwordVal,eax

    ;以十进制、十六进制和二进制数显示整数
    call Crlf
    call WriteInt
    call Crlf
    call WriteHex
    call Crlf
    call WriteBin
    call Crlf
    Call WaitMsg 

    ;将控制台窗口设置为默认颜色
    mov eax,lightGray+(black*16)
    call SetTextColor
    call Clrscr
    exit 

   main ENDP
   END main

 

Random32:生成32位的随机整数,并在eax中返回。

eg2

随机产生10个在范围0~4294967294内的无符号整数,接着随机再生成10个在范围-50~+49之间的有符号整数

include irvine32.inc
TAB = 9     ;Tab键的ASCII码
.code
    main PROC
        call Randomize  ;初始化随机数发生器
        call Rand1
        call Rand2

        exit
    main ENDP
Rand1 PROC
    mov ecx,10
L1:    call Random32    ;生成随机数
    call WriteDec      ;以无符号十进制数格式显示
    mov al,TAB        ;水平制表符
    call WriteChar   ;显示水平制表符
    loop L1

    call Crlf
    ret
Rand1 ENDP

Rand2  PROC
    mov ecx ,10
L2:  mov eax,100
    call RandomRange
    sub eax,50
    call WriteInt
    mov al ,TAB    ;水平制表符
    call WriteChar  ;输出水平制表符
    loop L2 

    call Crlf
    ret
Rand2  ENDP
END main

 

eg3:性能度量

GetMseconds过程返回自物业以来逝去的毫秒数,在第3个测试程序中,在循环之前就首先调用了GetMseconds过程,然后执行嵌套循环约170亿次,在循环结束后再次调用GetMseconds过程并报告用掉的时间:

include irvine32.inc

OUTER_LOOP_COUNT = 3
.data
    startTime DWORD ?
    msg1 BYTE    "Please wait ...",0dh,0ah,0
    msg2 BYTE   "Elapsed milliseconds:",0

.code
    main PROC
        mov edx,OFFSET msg1
        call WriteString 

        ;保存起始时间
        call GetMSeconds
        mov startTime,eax
        mov ecx,OUTER_LOOP_COUNT 

        ;执行循环
    L1:    call innerLoop
        loop L1
        call GetMSeconds
        sub eax,startTime
        mov edx,OFFSET msg2
        call WriteString
        call WriteDec
        call Crlf 

        exit
    main ENDP

    innerLoop PROC
        push ecx
        mov ecx, 0FFFFFFFFH
    L1: mov eax,eax
        loop L1

        pop ecx
        ret
    innerLoop ENDP
    END main

5.4堆栈操作

在程序中堆栈有下面几种重要的用途:

1.寄存器在用做多种用途的时候,堆栈可方便地作为其临时保存区域,在寄存器使用完毕之后,可以通过堆栈恢复其原始值

2.CALL指令执行的时候,CPU用堆栈保存当前被调用过程的返回地址

3.调用过程的之后,可以通过栈传递输入值

4.过程内的局部变量在堆栈上创建,过程结束时,这些变量被丢弃

5.4.2PUSH 和pop

push r/m16

push r/m32

push imm32

在保护模式下立即数总是32位的,在实地址模式下,如果未使用.386或更高的处理器伪指令,立即数默认是16位的

pop指令:

pop指令首先将ESP所指的堆栈元素复制到16位或32位的目的操作数中。然后增加ESP的值。如果操作数是16位的,ESP加2,如果操作数的32位的,ESP加4

POP r/m16

pop r/m32

时间: 2024-10-29 19:07:53

第五章--过程的相关文章

大道至简 第五章 失败的过程也是过程 读后感

今天该写一写大道至简第五章读后感了. 首先是“做过程不是做工程”,过程是为了实现某种目的而经历的一些事情,过程有很多种,虽然经历了某种过程,但不一定能实现某种功能.做完过程的每一个阶段,并不等于做工程.做过程不是做工程的精义,也不是最终目的. 然后是“做过场”,做过场就好像是一种形式一样,做了没必要做的事情,就是浪费时间. 我们为什么做工程,不要忘了最终目的.目的,是实现客户的要求,工程只是一种实现的途径.最初做开发的前辈们,不用什么工程或者过程,也一样编出了程序,也一样解决了问题,也一样实现了

Delphi基本之pascal语法(第五章.函数与过程程序设计)

第五章.函数与过程程序设计一.函数(包括标准函数和自定义函数) 1.函数的定义 格式:FUNCTION 函数名(<形参表>):返回值类型: VAR <变量说明> BEGIN <函数体> END [注]:1.形参表每个参数都写明其类型: 2.有且只有一个返回值,并且要将返回值赋值给函数名. [例]:求五边形的面积 function area(a,b,c:real):real; var p:real; begin p:=(a+b+c)/2; area:=sqrt(p*(p-

《大道至简》第五章读后感

失败的过程也是过程,我觉得这句话很有深意,阅读完大道至简第五章,我又有了很深的感触. 首先是“做过程不是做工程”,过程是为了实现某种目的而经历的一些事情,过程有很多种,虽然经历了某种过程,但不一定能实现某种功能.做完过程的每一个阶段,并不等于做工程.做过程不是做工程的精义,也不是最终目的. 然后是“做过场”,做过场就好像是一种形式一样,做了没必要做的事情,就是浪费时间. 做工程的最终目的是实现客户的要求,工程只是一种实现的途径.最初做开发的前辈们,不用什么工程或者过程,也一样编出了程序,也一样解

大道至简第五章读后感

第五章 失败的过程也是过程 今天照样老师带领着我们阅读了大道至简第五章,阅读了<大道至简>的第五章,这章在前面的基础上又进了一步,有了技术和团队,加上有效的沟通,接下来就要接项目做工程. “虚有其表耳”,本章以<明皇实录>中的一句话来告诉我们一个深刻的道理:不要只求外表,只做形象工程,而是要透过表象,力求实质. 失败了不要紧,没有失败也就找不到自己的不足,也就不会发现自己的问题,更不用谈改进了.我们的前辈们就是在不断的失败中才总结出了“瀑布模型”“螺旋模型”等模型,方便了我们.但是

JavaScript高级程序设计(第3版)第五章读书笔记

第五章 引用类型 创建Object实例的方式有两种,第一种是使用new操作符后跟Object构造函数,例如: var person = new Object( ); person.name = “Nicholas”; person.age=29; 第二种是使用对象字面量表示法.如: var person = { name : “Nicholas”, age : 29 }; 在最后一个属性后面添加逗号,会在IE7及更早版本和Opera中导致错误. 两种访问对象属性的方法,一是方括号语法,例如per

第五章读后感

失败的过程也是过程 在软件工程专业,我们学习的软件知识,我们应该学会运用这些知识,就像我们学习了大道至简的第五章:失败的过程也是过程.从中我就了解到了软件的很多的知识. 在软件工程专业,我们不管在做什么,我们都不应该做成“做过场”(“过场”是舞台术语,意思是角色从舞台一端出场,再走到另一端进场的一个过程.过场角色一般没有唱腔或道白,即便是有,也是没有什么实质内容的)在有些的时候,我们软件专业在做工程的时候都需要建立一定的基础模型,如果我们在建立模型时做一个过场,那么我们将会在客户.项目经理,分析

现代编译原理--第五章(活动记录)

(转载请表明出处  http://www.cnblogs.com/BlackWalnut/p/4559245.html ) 第五章是到目前位置最让我头疼的一章,不是因为难,是因为对最终的目的不太明确.整章前半部分用十分精简的语言介绍了一个新的概念,活动记录,也就是在函数调用时,一个调用栈究竟发生了什么事.但是,在最终编码实现过程中,总不能理解作者为什么给了这些变量?或者说,完全不知道作者究竟想让我完成一个怎样的功能.纠结了好几天,后来索性往后继续看,看看能不能找到其他的线索.直到看完后一章,硬着

第十五章 文件属性类的实现

                  第十五章    文件属性类的实现        根用户的权限也不能是无限大.必须考虑到保护用户的隐私!用户的文件内容.程序代码可设置为根用户也不能观看,只能是文件拥有者可以查看.修改.但根用户可以删除一切非根用户的文件.也可以查看用户的目录.所以,i_mode字符更改如下:      BU16 i_mode; // 描述文件的访问权限:文件的读.写.执行权限  // i_mode.15-13  ftype; 文件类型: 0-符号软连接文件, // 1-硬连接文

Java Persistence with MyBatis 3(中文版) 第五章 与Spring集成

MyBatis-Spring是MyBatis框架的子模块,用来提供与当前流行的依赖注入框架Spring的无缝集成. Spring框架是一个基于依赖注入(Dependency Injection)和面向切面编程(Aspect Oriented Programming,AOP)的Java框架,鼓励使用基于POJO的编程模型.另外,Spring提供了声明式和编程式的事务管理能力,可以很大程度上简化应用程序的数据访问层(data access layer)的实现.在本章中,我们将看到在基于Spring的