汇编-Irvine32库
Irvine32库
VS2019添加Irvine32链接库
Irvine32库下载:
链接:https://pan.baidu.com/s/1WSPnB2iFSLf3CcAPebVdKA
提取码:6666
Irvine32 链接库提供了很多简单的输入输岀接口,因此有必要添加Irvine32链接库,方便后续编程
0.把文件夹复制到C盘
右键项目,选择属性,打开属性页面板
1.选择“Microsoft Macro Assembler”→“General” ,在Include Paths一栏输入Irvine32文件解压的路径
注意:加上;
2.选择“链接器”→“常规”→“附加库目录”,输入 Irvine32文件解压的路径
3.选择“链接器”→“输入”→“附加依赖项”,输入Irvine32.lib;
注意:;加上;
4.点击确定,配置完成
.386 .model flat,stdcall .stack 4096 ExitProcess PROTO,dwExitCode:DWORD Include Irvine32.inc includelib Irvine32.lib .data .code main PROC INVOKE ExitProcess,0 main ENDP END main
示例工程下载:
链接:https://pan.baidu.com/s/1j3Jdo_q3AKnFlSX9dOkClQ
提取码:6666
DumpMen显示内存数据
在控制台窗口中用十六进制的形式显示一段内存区域。
ESI 中存放内存区域首地址;
ECX 中存放单元个数;
EBX 中存放单元大小(1 = 字节,2 = 字,4 = 双字)
.386 .model flat,stdcall .stack 4096 ExitProcess PROTO,dwExitCode:DWORD Include Irvine32.inc .data array DWORD 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 ;显示内存 INVOKE ExitProcess,0 main ENDP END main
WaitMsg暂停
WaitMsg 过程显示“Press any key to continue…”消息,并等待用户按键
.386 .model flat,stdcall .stack 4096 ExitProcess PROTO,dwExitCode:DWORD Include Irvine32.inc .data array DWORD 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 call WaitMsg ;暂停 call Clrscr ;清屏 INVOKE ExitProcess,0 main ENDP END main
Clrscr清屏
Clrscr 过程清除控制台窗口
代码看上边
SetTextColor设置文本的前景色和背景色
SetTextColor 过程(仅在 Irvine32 链接库中)设置输出文本的前景色和背景色。调用 SetTextColor 时,给 EAX 分配一个颜色属性。
下列预定义的颜色常数都可以用于前景色和背景色:
颜色常量在 Irvine32.inc 文件中进行定义。
要获得完整的颜色字节数值,就将背景色乘以 16 再加上前景色
例如,下述常量表示在蓝色背景上输出黄色字符:
yellow + (blue * 16) ;*16就是左移4位
另一种表示颜色常量的方法是使用 SHL 运算符,将背景色左移 4 位再加上前景色
yellow + (blue SHL 4)
.386 .model flat,stdcall .stack 4096 ExitProcess PROTO,dwExitCode:DWORD Include Irvine32.inc .data array DWORD 1,2,3,4,5,6,7,8,9,0Ah,0Bh .code main PROC mov eax,red + (blue * 16) ;蓝色背景上输出红色字符 call SetTextColor call Clrscr ;若想设置控制台窗口的背景色为新的颜色,必须先使用Clrscr过程清屏 mov esi,OFFSET array mov ecx, LENGTHOF array mov ebx,TYPE array call DumpMem call WaitMsg INVOKE ExitProcess,0 main ENDP END main
Crlf回车换行
Crlf 过程将光标定位在控制台窗口下一行的开始位置。它写的字符串包含了 ASCII 字符代码 ODh 和 OAh。调用示例如下:
call Crlf
WriteString显示字符串
WriteString 过程向操作台窗口输出一个空字节结束的字符串。过程用 EDX 传递字符串的偏移量
.386 .model flat,stdcall .stack 4096 ExitProcess PROTO,dwExitCode:DWORD Include Irvine32.inc .data prompt BYTE "Enter your name: ",0 ;0结束符 .code main PROC mov edx,OFFSET prompt ;字符串地址给EDX call WriteString ;输出字符串 INVOKE ExitProcess,0 main ENDP END main
Readint用户输入整数
Readlnt 过程从键盘读取一个 32 位有符号整数,并用 EAX 返回该值。用户可以键入前置加号或减号,而其后跟的只能是数字
Readlnt 设置溢出标志位,
如果输入数值无法表示为 32 位有符号数(范围:-2 147 483 648 至 +2 147 483 647),则显示一个错误信息。
返回值包括所有的有效数字,直到遇见第一个非数字字符,例如,如果用户输入 +123ABC,则返回值为 +123
.386 .model flat,stdcall .stack 4096 ExitProcess PROTO,dwExitCode:DWORD Include Irvine32.inc .data prompt BYTE "Enter int: ",0 ;提示信息 intVal SDWORD ? .code main PROC mov edx,OFFSET prompt call WriteString ;输出提示信息 call Readint ;让用户输入有符号整数 mov intVal,eax ;输入值给变量 mov esi,OFFSET intVal mov ecx, LENGTHOF intVal mov ebx,TYPE intVal call DumpMem ;显示输入的值 INVOKE ExitProcess,0 main ENDP END main
WriteHex十六进制格式显示32位无符号整数
WriteHex 过程以 8 位十六进制格式向控制台窗口输出一个 32 位无符号整数,如果需要,应插入前置 0。
过程用 EAX 传递整数
.386 .model flat,stdcall .stack 4096 ExitProcess PROTO,dwExitCode:DWORD Include Irvine32.inc .data .code main PROC mov eax,7FFFh call WriteHex INVOKE ExitProcess,0 main ENDP END main
WriteBin二进制格式显示整数
WriteBin 过程以 ASCII 二进制格式向控制台窗口输出一个整数。过程用 EAX 传递该整数。为了便于阅读,二进制位以四位一组的形式进行显示
.386 .model flat,stdcall .stack 4096 ExitProcess PROTO,dwExitCode:DWORD Include Irvine32.inc .data .code main PROC mov eax,90h ;90h=10010000B call WriteBin INVOKE ExitProcess,0 main ENDP END main
exit退出程序
.386 .model flat,stdcall .stack 4096 Include Irvine32.inc .data .code main PROC mov eax,90h ;90h=10010000B call WriteBin exit ;退出程序,相当于INVOKE ExitProcess,0 main ENDP END main
Randomize初始化种子
Randomize种子进行初始化。种子等于一天中的时间,精度为 1/100 秒
Random32返回随机整数
Random32 过程生成一个 32 位随机整数并用 EAX 返回该数。当被反复调用时,Random32 就会生成一个模拟的随机数序列,这些数由一个简单的函数产生,该函数有一个输入称为种子
.386 .model flat,stdcall .stack 4096 Include Irvine32.inc .data randVal DWORD ? .code main PROC mov eax,0 mov ecx,5 call Randomize ;初始化种子 L1: call Random32 ;返回随机整数 mov randVal, eax push ecx mov esi,OFFSET randVal mov ecx, LENGTHOF randVal mov ebx,TYPE randVal call DumpMem call Crlf pop ecx loop L1 exit ;退出程序,相当于INVOKE ExitProcess,0 main ENDP END main
RandomRange返回规定范围内的随机整数
在范围 0〜n-1 内生成一个随机整数,其中 n 是用 EAX 寄存器传递的输入参数。生成的随机数也用 EAX 返回
.386 .model flat,stdcall .stack 4096 Include Irvine32.inc .data randVal DWORD ? .code main PROC mov eax,50 call RandomRange ;返回规定范围内的随机整数 mov randVal, eax mov esi,OFFSET randVal mov ecx, LENGTHOF randVal mov ebx,TYPE randVal call DumpMem exit main ENDP END main
WriteDec十进制格式显示32位无符号整数
WriteDec 过程以十进制格式向控制台窗口输出一个 32 位无符号整数,且没有前置 0。过程用 EAX 寄存器传递该整数
.386 .model flat,stdcall .stack 4096 Include Irvine32.inc .data .code main PROC mov eax,6543 call WriteDec exit main ENDP END main
Writeint十进制格式显示32位有符号整数
Writelnt 过程以十进制向控制台窗口输岀一个 32 位有符号整数,有前置符号,但没有前置 0。过程用 EAX 传递整数
.386 .model flat,stdcall .stack 4096 Include Irvine32.inc .data .code main PROC mov eax,-6543 call Writeint ;十进制格式显示32位有符号整数 exit main ENDP END main
WriteChar显示一个字符
WriteChar 过程向控制台窗口写一个字符。过程用 AL 传递字符(或其 ASCII 码)
.386 .model flat,stdcall .stack 4096 Include Irvine32.inc .data .code main PROC mov al, 'A' call WriteChar ;显示字符 exit main ENDP END main
GetMseconds返回午夜开始的毫秒数
GetMseconds 过程获取主机从午夜开始经过的毫秒数,并用 EAX 返回该值
.386 .model flat,stdcall .stack 4096 Include Irvine32.inc .data startTime DWORD ? .code main PROC mov eax,0 call GetMseconds ;返回午夜开始的毫秒数 mov startTime,eax ;EAX = 01A9BA62 exit main ENDP END main
DumpRegs显示寄存器和标志位
DumpRegs 过程用十六进制形式显示 EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP、EIP 和 EFL(EFLAGS)的内容,以及进位标志位、符号标志位、零标志位、溢出标志位、辅助进位标志位和奇偶标志位的值
.386 .model flat,stdcall .stack 4096 Include Irvine32.inc .data .code main PROC call DumpRegs exit main ENDP END main
EIP 显示的数值是调用 DumpRegs 的下一条指令的偏移量。DumpRegs 在调试程序时很有用,因为它显示了 CPU 快照
GetTextColor返回当前的前景色和背景色
GetTextColor 过程获取控制台窗口当前的前景色和背景色,它没有输入参数。返回时,AL 中的高四位是背景色,低四位是前景色
.386 .model flat,stdcall .stack 4096 Include Irvine32.inc .data .code main PROC call GetTextColor exit main ENDP END main
Gotoxy定位光标
Gotoxy 过程将光标定位到控制台窗口的指定位置。默认情况下,控制台窗口的X轴范围为 0〜79,Y 轴范围为 0〜24。调用 Gotoxy 时,将 Y 轴(行数)传递到 DH 寄存器,X 轴(列数)传递到 DL 寄存器
.386 .model flat,stdcall .stack 4096 Include Irvine32.inc .data .code main PROC mov dh, 10 ;第 10 行 mov dl, 20 ;第 20 列 call Gotoxy ;定位光标 exit main ENDP END main
GetMaxXY返回控制台窗口缓冲区大小
GetMaxXY 过程获取控制台窗口缓冲区的大小。如果控制台窗口缓冲区大于可视窗口尺寸,则自动显示滚动条。GetMaxXY 没有输入参数。当过程返回时,DX 寄存器包含了缓冲区的列数,AX 寄存器包含了缓冲区的行数。每个数值的可能范围都不超过 255,这也许会小于实际窗口缓冲区的大小
.386 .model flat,stdcall .stack 4096 Include Irvine32.inc .data .code main PROC call GetMaxXY exit main ENDP END main
MsgBox带确定消息框
MsgBox 过程显示一个带选择项的图形界面弹出消息框。(当程序运行于控制台窗口时有效。)过程用 EDX 传递一个字符串的偏移量,该字符串将显示在消息框中。还可以用 EBX 传递消息框标题字符串的偏移量,如果标题为空,则 EBX 为 0
.386 .model flat,stdcall .stack 4096 Include Irvine32.inc .data caption BYTE "对话框标题", 0 HelloMsg BYTE "消息对话框", 0dh, 0ah BYTE "点击确定继续...", 0 .code main PROC mov ebx,OFFSET caption mov edx,OFFSET HelloMsg call MsgBox exit main ENDP END main
MsgBoxAsk带yes和no消息框
MsgBoxAsk 过程显示带有 Yes 和 No 按钮的图形弹岀消息框。(当程序运行于控制台窗口时有效。)过程用 EDX 传递问题字符串的偏移量,该问题字符串将显示在消息框中。还可以用 EBX 传递消息框标题字符串的偏移量,如果标题为空,则 EBX 为 0。
MsgBoxAsk 用 EAX 中的返回值表示用户选择的是哪个按钮,返回值有两个选择,都是预先定义的 Windows 常数:IDYES (值为 6)或 IDNO(值为 7)
.386 .model flat,stdcall .stack 4096 Include Irvine32.inc .data caption BYTE "请确定",0 question BYTE "感谢你的选择",0 .code main PROC mov ebx,OFFSET caption mov edx,OFFSET question call MsgBoxAsk ;查看 EAX 中的返回值 exit main ENDP END main
Delay延迟指定毫秒数
将延迟时间间隔送入 EAX
- mov eax,1000 ;1 秒
- call Delay
WriteStackFrame显示当前过程堆栈帧的内容
Irvine32 链接库有个很有用的过程 WriteStackFrame,用于显示当前过程堆栈帧的内容,其中包括过程的堆栈参数、返回地址、局部变量和被保存的寄存器
原型如下:
WriteStackFrame PROTO, numParam:DWORD, ;传递参数的数量 numLocalVal: DWORD, ;双字局部变量的数量 numSavedReg: DWORD ;被保存寄存器的数量
示例:
.386 .model flat,stdcall option casemap:none .stack 4096 ExitProcess PROTO,dwExitCode:DWORD Include Irvine32.inc .data .code func Proc USES eax ebx, x: DWORD, y: DWORD ;两个参数 LOCAL a:DWORD, b:DWORD ;两个局部变量 mov a, 0AAAAh mov b, 0BBBBh PARAMS = 2 LOCALS = 2 SAVED_REGS = 2 INVOKE WriteStackFrame, PARAMS, LOCALS, SAVED_REGS ret func endp main PROC mov eax, 100 mov ebx, 101 INVOKE func, 1111h, 2222h ;传递两个整数参数 INVOKE ExitProcess,0 main ENDP END main