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