一、控制流转移指令
控制转移:是一种改变汇编语句执行顺序的方法。
1.无条件转移 Unconditional Jump
• 将CPU控制权直接转移到指定的汇编语句
• 修改EIP为指定的内存地址
• CPU从EIP指定的内存地址读取下一条机器指令
JMP指令
语法:JMP+目的地址
• JMP指令实现CPU控制权的无条件跳转
• 目的地址是代码标号
• 代码标号被汇编器翻译成内存地址
• CPU看到的是内存地址,不是代码标号
循环(无限循环)
top:
... ...
... ...
JMP top
2.条件转移 Conditional Jump
有符号数的条件跳转指令
Instruction | Description | Flags tested |
---|---|---|
JE/JZ | 等于则跳转 | ZF |
JNE/JNZ | 不等于则跳转 | ZF |
JG/JNLE | 有符号大于则跳转 | OF, SF, ZF |
JGE/JNL | 有符号大于等于则跳转 | OF, SF |
JL/JNGE | 有符号小于则跳转 | OF, SF |
JLE/JNG | 有符号小于等于则跳转 | OF, SF, ZF |
无符号数的条件跳转指令
Instruction | Description | Flags tested |
---|---|---|
JA/JNBE | 无符号大于则跳转 | OF, SF, ZF |
JAE/JNB | 无符号大于等于则跳转 | OF, SF |
JB/JNAE | 无符号小于则跳转 | OF, SF |
JBE/JNA | 无符号小于等于则跳转 | OF, SF, ZF |
3.CMP指令
• CMP指令,比较目的操作数和源操作数
CMP reg,reg
CMP reg,imm
CMP mem,reg
CMP mem,imm
CMP reg,mem
• 执行从源操作数中减掉目的操作数的减法操作
• 设置相应的标志位,不改变操作数
• 标志位:OF、SF、ZF、AF、PF、CF
MOV EAX,100h
MOV EBX, 200h
CMP EAX, EBX
JA L1
INVOKE StdOut, ADDR str1
JMP L2
L1:
INVOKE StdOut,ADDR str2
L2:
INVOKE ExitProcess,0
4.LOOP指令
语法:LOOP+目的地址
LOOP指令可以指定循环执行的次数 (loop count)
• ECX寄存器作为循环计数器
• LOOP指令执行时,ECX减1
• 如果ECX不等于0,跳转到目的地址
• 如果ECX等于0,不跳转,顺序执行
• LOOP指令先ecx减1,然后判断ecx是否为0
语法:
MOV EAX 10h
MOV ECX 10h
L1:
INC EAX
LOOP L1
二、 过程的定义和使用
1.过程的定义
• 汇编语言把过程定义为以返回语句结束的命名语句块。
• 使用PROC和ENDP伪指令来声明过程
• 必须定义一个过程名字(标识符)
my_proc PROC
... ...
ret
my_proc ENDP
• 除启动过程之外,其它过程以ret指令结束(将CPU控制权转移到过程被调用的地方)
启动过程(main)
main PROC
... ...
main ENDP
• 启动过程(main)的返回语句是INVOKE ExitProcess, 0
,指将CPU的控制权转移给Windows操作系统
2.过程的调用与返回
• CALL指令将CPU的控制权转移到新的内存地址执行指令,实现过程的调用
• RET指令将CPU的控制权返回到程序中过程被调用的地方继续执行
三、调用链接库中的函数
1.链接库
链接库(Link Library)是一个文件,包含已经编译成机器码的过程。
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\kernel32.lib
2.PROTO伪指令
PROTO伪指令用于声明链接库中的过程
• StdOut
• StdIn
• ExitProcess