汇编-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

  1. mov eax,1000 ;1 秒
  2. 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

 

 

 

 

 

 

 

 

 

 

posted @ 2023-11-23 09:58  天子骄龙  阅读(245)  评论(0编辑  收藏  举报