码迷,mamicode.com
首页 > 其他好文 > 详细

第五章--过程

时间:2015-01-03 11:49:28      阅读:285      评论:0      收藏:0      [点我收藏+]

标签:

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

第五章--过程

标签:

原文地址:http://www.cnblogs.com/kangxiaopao/p/4199311.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!