天下

记录修行的印记

汇编学习笔记1


运行时栈是由CPU直接管理的内存数组,它使用两个寄存器:SS和ESP (Extended stack pointer)。
在保护模式下,SS寄存器存放的是段选择器,用户模式程序不应对其进行修改。
ESP寄存器存放的是指向堆栈内特定位置的一个32位偏移值。它指向最后压入(或添加)到堆栈上的数据.
我们很少需要直接操纵ESP的值,相反,ESP寄存器的值通常是由CALL,RET,PUSH和POP等指令间接修改的。

压栈操作
32位的压栈操作(PUSH)操作将使ESP的值减4,并将值拷贝到堆栈指针所指向的位置.
出栈操作
32位的出栈(POP)操作从堆栈顶端移走一个值,并将值置于寄存器或变量中,在值从栈顶弹出之后,ESP的值加4.

PROC伪指令
定义子过程的伪指令,以RET语句结束的命名语句块.

proc_name PROC
    param1:DWORD,        ;参数1
    param2:PTR BYTE,    ;参数2
    param3:PTR WORD    ;参数3
    LOCAL localvar1:BYTE    ;局部变量1
    LOCAL localvar2:WORD    ;局部变量2
    ;.
    RET    
    ;..
    RET    ;(
return from procedure)以强制CPU返回到过程被调用的地方
proc_name ENDP

CALL指令
CALL指令将返回地址(通常是CALL指令的下一条指令,CALL指令的机器码需要5字节)压入堆栈并将被调用过程的地址拷贝到指令指针寄存器EIP中,当过程返回时,RET指令从堆栈中弹出地址并送到指令指针寄存器中(ESP所指向堆栈值被弹出并送到EIP).
CPU总是执行指令指针寄存器EIP所指向的内存地址处的指令.

RET指令
在32位保护模式下
CPU执行RET指令时,相当于进行:
pop EIP

CPU执行RET N指令时,这里N是一个自然数,相当于进行:
pop EIP
add ebp,N


局部标号和全局标号

局部标号(以单个冒号结尾)在过程中使用.
全局标号(以两个冒号结尾)在全局使用.

LOCAL 伪指令
LOCAL伪指令在过程中声明一个或多个局部变量
LOCAL 变量名:类型

如:
MySub    PROC
    LOCAL var1:BYTE
    LOCAL var2:WORD
    ;.
    RET
MySub ENDP

posted on 2011-11-04 16:34 天下 阅读(380) 评论(0)  编辑 收藏 引用 所属分类: 汇编语言


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2016年9月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

导航

统计

常用链接

留言簿(4)

随笔分类(378)

随笔档案(329)

链接

最新随笔

搜索

最新评论