第五章--过程

5.3 本书附带的链接库

Irvine32.lib

过程说明
CloseFile 关闭之前已经打开的磁盘文件
Clrscr 清除控制台窗口,并将光标置于左上角
CreateOutputFile 为输出模式下的写操作创建一个新的磁盘文件
Crlf 在控制台窗口中写一个行结束的序列
Delay 程序执行暂停指定的 n 毫秒
DumpMem 以十六进制形式,在控制台窗口写一个内存块
DumpRegs 以十六进制形式显示 EAX、EEX、ECX、EDX、ESI、EDI、EBP、ESP、EFLAGS 和 EIP 寄存器。也显示最常见的 CPU 状态标志位
GetCommandTail 复制程序命名行参数(称为命令尾)到一个字节数组
GetDateTime 从系统获取当前日期和时间
GetMaxXY 返回控制台窗口缓冲器的行数和列数
GetMseconds 返回从午夜开始经过的毫秒数
GetTextColor 返回当前控制台窗口的前景色和背景色
Gotoxy 将光标定位到控制台窗口内指定的位置
IsDigit 如果 AL 寄存器中包含了十进制数字(0-9)的 ASCII 码,则零标志位置 1
MsgBox 显示一个弹出消息框
MsgBoxAsk 在弹出消息框中显示 yes/no 问题
OpenlnputFile 打开一个已有磁盘文件进行输入操作
ParseDecimal32 将一个无符号十进制整数字符串转换为 32 位二进制数
Parselnteger32 将一个有符号十进制整数字符串转换为 32 位二进制数
Random32 在 0〜FFFFFFFFh 范围内,生成一个 32 位的伪随机整数
Randomize 用一个值作为随机数生成器的种子
RandomRange 在特定范围内生成一个伪随机整数
ReadChar 等待从键盘输入一个字符,并返回该字符
ReadDec 从键盘读取一个无符号 32 位十进制整数,用回车符结束
ReadFromFile 将一个输入磁盘文件读入缓冲区
ReadHex 从键盘读取一个 32 位十六进制整数,用回车符结束
Readlnt 从键盘读取一个有符号 32 位十进制整数,用回车符结束
ReadKey 无需等待输入即从键盘输入缓冲区读取一个字符
ReadString 从键盘读取一个字符串,用回车符结束
SetTextColor 设置控制台输出字符的前景色和背景色
Str_compare 比较两个字符串
Str_copy 将源字符串复制到目的字符串
Str_length 用 EAX 返回字符串长度
Str_trim 从字符串删除不需要的字符
Str_ucase 将字符串转换为大写字母
WaitMsg 显示信息并等待按键操作
WriteBin 用 ASCII 二进制格式,向控制台窗口写一个无符号 32 位整数
WriteBinB 用字节、字或双字格式向控制台窗口写一个二进制整数
WriteChar 在控制台窗口写一个字符
WriteDec 用十进制格式,向控制台窗口写一个无符号 32 位整数
WriteHex 用十六进制格式,向控制台窗口写一个 32 位整数
WriteHexB 用十六进制格式,向控制台窗口写一个字节、字或双字整数
Writelnt 用十进制格式,向控制台窗口写一个有符号 32 位整数
WriteStackFrame 向控制台窗口写当前过程的堆栈帧
WriteStackFrameName 向控制台窗口写当前过程的名称和堆栈帧
WriteString 向控制台窗口写一个以空字符结束的字符串
WriteToFile 将缓冲区内容写入一个输出文件
WriteWindowsMsg 显示一个字符串,包含 MS-Windows 最近一次产生的错误

 

5.3.2 过程的描述

Clrsrc

TITLE TEST PROJECT

INCLUDE Irvine32.inc

.code
main PROC
call DumpRegs;显示寄存器值
call Clrscr;清屏

call WaitMsg
exit
main ENDP
END main

 

CreateOutputFile

TITLE TEST PROJECT

INCLUDE Irvine32.inc

.data
filename BYTE "newfile.txt",0
handle DWORD ?

;通过EDX传递要创建的文件名的偏移地址
;通过EAX返回是否创建成功
.code
main PROC
mov edx,OFFSET filename
call CreateOutputFile
cmp eax,INVALID_HANDLE_VALUE
je file_error
mov hadle,eax

call WaitMsg
exit
main ENDP
END main

 

Random32

TITLE TEST PROJECT

INCLUDE Irvine32.inc

.code
main PROC
call Randomize;初始化种子值,使用当前的时间作为种子值
mov ecx,10
S:
call Random32;产生随机数,并保存到eax
call DumpRegs
call WaitMsg
call Clrscr
loop S

call WaitMsg
exit
main ENDP
END main

 

DumpMem(显示一块内存区域)

TITLE TEST PROJECT

INCLUDE Irvine32.inc

.data
array DWORD 65,66,67,68,69,70,71,72

.code
main PROC
mov esi,OFFSET array    ;起始地址
mov ecx,LENGTHOF array    ;元素数目
mov ebx,TYPE array        ;格式双子,设置元素尺寸
call DumpMem

call WaitMsg
exit
main ENDP
END main

 

GetMaxXY:返回控制台窗口缓冲区的大小

TITLE TEST PROJECT

INCLUDE Irvine32.inc

.data
rows BYTE ?
cols BYTE ?

.code
main PROC
call GetMaxXY
mov rows,dh;存放缓存区的行数
mov cols,dl;存放缓存区的列数

mov esi,OFFSET rows        ;起始地址
mov ecx,LENGTHOF rows    ;元素数目
add ecx,LENGTHOF cols
mov ebx,TYPE rows        ;格式双子,设置元素尺寸
call DumpMem

call WaitMsg
exit
main ENDP
END main

 

MsgBox

TITLE TEST PROJECT

INCLUDE Irvine32.inc

;EBX传递标题栏中的偏移地址
;EDX传递要显示内容的偏移地址
.data
caption db "Dialog Title",0
content BYTE "Hello! This is a flag!", 0dh,0ah;0dh--回车,0ah--换行
        BYTE "flag{I_L0ve_CTF!}",0

.code
main PROC
mov ebx,OFFSET caption
mov edx,OFFSET content
call MsgBox

call WaitMsg
exit
main ENDP
END main

 

MsgBoxAsk:带有是否选项

TITLE TEST PROJECT

INCLUDE Irvine32.inc

;EBX传递标题栏中的偏移地址
;EDX传递要显示内容的偏移地址
.data
caption db "Dialog Title",0
content BYTE "Hello! This is a flag!", 0dh,0ah;0dh--回车,0ah--换行
        BYTE "flag{I_L0ve_CTF!}",0

.code
main PROC
mov ebx,OFFSET caption
mov edx,OFFSET content
call MsgBoxAsk

call WaitMsg
exit
main ENDP
END main

 

OpenInputFile

TITLE TEST PROJECT

INCLUDE Irvine32.inc

.data
    filename BYTE "myfile.txt",0
    val DWORD 1
    errorinfo BYTE "Open file Error!",0 

.code
main PROC
    mov edx,OFFSET filename    ;edx包含要打开文件的偏移地址
    call OpenInputFile
    cmp eax,INVALID_HANDLE_VALUE
    je file_error
    mov val,eax                ;eax包含有效的文件句柄
    mov esi,OFFSET val
    mov ecx,LENGTHOF val
    mov ebx,TYPE val
    call DumpMem
    call WaitMsg
exit

file_error:
    mov ebx,0
    mov edx,OFFSET errorinfo
    call MsgBox
    call WaitMsg
exit
main ENDP
END main

 

ParseDecimal32

TITLE TEST PROJECT

INCLUDE Irvine32.inc

;将无符号整数字符串转换为一个32位的二进制数
;非数字字符前面的所有数字都将被转换
;开头空格将被忽略

.data
buffer BYTE "8193"
bufsize  = ($ -buffer)

.code
main PROC
    mov edx,OFFSET buffer;edx传递字符串偏移地址
    mov ecx,bufsize;ecx传递字符串大小
    call ParseDecimal32
    call DumpRegs
    call WaitMsg
exit
main ENDP
END main

 

Random32

TITLE TEST PROJECT

INCLUDE Irvine32.inc

;伪随机数

randVal DWORD ? 
.code
main PROC
    call Random32
    mov randVal,eax
    mov esi,OFFSET randVal
    mov ecx,LENGTHOF randVal
    mov ebx,TYPE randVal
    call DumpMem
    call WaitMsg
exit
main ENDP
END main

 

Randomize

TITLE TEST PROJECT

INCLUDE Irvine32.inc

;伪随机数
.data
randVal DWORD ? 

.code
main PROC
    call Randomize;时间种子
    mov ecx,10
Flag:
    push ecx
    call Random32
    mov randVal,eax

    mov esi,OFFSET randVal
    mov ecx,LENGTHOF randVal
    mov ebx,TYPE randVal
    call DumpMem

    call WaitMsg
    call Clrscr
    pop ecx
    loop Flag
exit
main ENDP
END main

 

ReadKey

AL中包含按键的ASCII或者0(0表示特殊按键)

AH返回按键的扫描码

DX返回按键的虚拟键码

EBX返回键盘的标志位

EAX和EDX高16位将被破坏

 

TITLE TEST PROJECT

INCLUDE Irvine32.inc

;伪随机数
.data
char BYTE ? 

.code
main PROC
S:
    mov eax,10;10毫秒等待
    call Delay
    call ReadKey
    jz S
    mov char,AL

    mov esi,OFFSET char
    mov ecx,LENGTHOF char
    mov ebx,TYPE char
    call DumpMem

    call WaitMsg

exit
main ENDP
END main

 

ReadString

TITLE TEST PROJECT

INCLUDE Irvine32.inc


.data
buffer BYTE 21 DUP(0)
bytecount DWORD ?

.code
main PROC
    mov edx,OFFSET buffer;输入缓存区
    mov ecx,SIZEOF buffer;指定最多读取的字符数
    call ReadString;读取输入字符串
    mov bytecount,eax;保存读取字符的数量

    mov esi,OFFSET bytecount
    mov ecx,LENGTHOF bytecount
    mov ebx,TYPE bytecount
    call DumpMem
    
    call WaitMsg

exit
main ENDP
END main

 

SetTextColor

SetTextColor 过程(仅在 Irvine32 链接库中)设置输出文本的前景色和背景色。调用 SetTextColor 时,给 EAX 分配一个颜色属性。下列预定义的颜色常数都可以用于前景色和背景色:

 

black = 0 red = 4 gray = 8 lightRed = 12
blue = 1 magenta = 5 lightBlue = 9 light Magenta = 13
green = 2 brown = 6 light Green = 10 yellow = 14
cyan = 3 lightGray = 7 lightCyan = 11 white = 15

TITLE TEST PROJECT

INCLUDE Irvine32.inc

.code
main PROC
    mov eax,red + (blue * 16);蓝底红字
    call SetTextColor
    call WaitMsg

exit
main ENDP
END main

 

5.3.4 本节习题

1.ReadString

2.WaitMsg

3.

mov eax,700

call Delay

 

4.WriteDec

5.GotoXY

... ...

11

TITLE TEST PROJECT

INCLUDE Irvine32.inc

.data
Info BYTE "Please input you ID:",0ah,0dh,0
buffer BYTE 19 DUP(?)
bufsize = ($ - buffer)

.code
main PROC
    mov edx,OFFSET Info
    call WriteString
    mov edx,OFFSET buffer
    mov ecx,bufsize
    call ReadString
    call WriteString

    call WaitMsg
exit
main ENDP
END main

posted @ 2019-11-07 20:10  Hk_Mayfly  阅读(286)  评论(0编辑  收藏  举报