首页 > 代码库 > 第五章--过程

第五章--过程

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    arrayBptr2    PWORD    arrayWptr3     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.incTAB = 9     ;Tab键的ASCII码.code    main PROC         call Randomize  ;初始化随机数发生器        call Rand1        call Rand2                exit     main ENDPRand1 PROC     mov ecx,10L1:    call Random32    ;生成随机数    call WriteDec      ;以无符号十进制数格式显示    mov al,TAB        ;水平制表符    call WriteChar   ;显示水平制表符    loop L1        call Crlf     ret Rand1 ENDPRand2  PROC     mov ecx ,10L2:  mov eax,100    call RandomRange    sub eax,50    call WriteInt    mov al ,TAB    ;水平制表符    call WriteChar  ;输出水平制表符    loop L2         call Crlf    ret Rand2  ENDPEND main

 

技术分享

eg3:性能度量

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

include irvine32.incOUTER_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

第五章--过程