汇编语言编程基础(2)

一、控制流转移指令

控制转移:是一种改变汇编语句执行顺序的方法。

1.无条件转移 Unconditional Jump

• 将CPU控制权直接转移到指定的汇编语句
• 修改EIP为指定的内存地址
• CPU从EIP指定的内存地址读取下一条机器指令
JMP指令
语法:JMP+目的地址
• JMP指令实现CPU控制权的无条件跳转
• 目的地址是代码标号
• 代码标号被汇编器翻译成内存地址
• CPU看到的是内存地址,不是代码标号
循环(无限循环)

top:
	... ...
	... ...
JMP top

2.条件转移 Conditional Jump

有符号数的条件跳转指令

InstructionDescriptionFlags 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

无符号数的条件跳转指令

InstructionDescriptionFlags 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.过程的定义

• 汇编语言把过程定义为以返回语句结束的命名语句块。
• 使用PROCENDP伪指令来声明过程
• 必须定义一个过程名字(标识符)

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值