编译原理—x86汇编指令

eax, ebx, ecx, edx, esi, edi, ebp, esp寄存器
eax, ebx, ecx, edx, esi, edi, ebp, esp等都是X86 汇编语言中CPU上的通用寄存器的名称,是32位的寄存器。如果用C语言来解释,可以把这些寄存器当作变量看待。

比方说:add eax,-2 ; //可以认为是给变量eax加上-2这样的一个值。

这些32位寄存器有多种用途,但每一个都有“专长”,有各自的特别之处。

eax 是"累加器"(accumulator), 它是很多加法乘法指令的缺省寄存器。

ebx 是"基地址"(base)寄存器, 在内存寻址时存放基地址。

ecx 是计数器(counter), 是重复(REP)前缀指令和LOOP指令的内定计数器。

edx 则总是被用来放整数除法产生的余数。

esi, edi,分别叫做"源/目标索引寄存器"(source/destination index),因为在很多字符串操作指令中, DS:ESI指向源串,而ES:EDI指向目标串.

ebp是"基址指针"(BASE POINTER), 它最经常被用作高级语言函数调用的"框架指针"(frame pointer). 在破解的时候,经常可以看见一个标准的函数起始代码:

push ebp ;保存当前ebp
mov ebp,esp ;EBP设为当前堆栈指针
sub esp, xxx ;预留xxx字节给函数临时变量.

这样一来,ebp 构成了该函数的一个框架, 在ebp 上方分别是原来的ebp , 返回地址和参数. ebp 下方则是临时变量. 函数返回时作 mov esp,ebp/pop ebp/ret 即可.

esp 专门用作堆栈指针,被形象地称为栈顶指针,堆栈的顶部是地址小的区域,压入堆栈的数据越多,esp 也就越来越小。在32位平台上,esp 每次减少4字节。

mov指令\add sub指令

push ebp ;保存当前ebp
mov ebp,esp ;EBP设为当前堆栈指针
sub esp, xxx ;预留xxx字节给函数临时变量.

mov ax,18 将 1 8送入寄存器AX AX=18
mov ah,78 将 7 8送入寄存器AH AH=78
add ax,8 将寄存器A X 中的数值加上8 AX=AX+8
mov ax,bx 将寄存器B X 中的数据送入寄存器AX AX=BX
add ax,bx 将 A X B X 中的数值相加,结果存在A X AX=AX+BX

mov指令可以有以下几种形式。
mov 寄存器,数 比如: mov ax,8
mov 寄存器,寄存器 比如: mov ax,bx
mov 寄存器,内 单 比如: mov ax,[0]
mov 内 单 ,寄存器 比如: mov [0],ax
mov 段寄存器,寄存器 比女口 :mov ds,ax
那么ESP和EBP指的分别是什么呢?

add sub指令同mov— ,都有两个操作对象。它们也可以有以下几种形式。
add 寄存器,数 比如:add ax,8
add 寄存器,寄存器 比如:add ax,bx
add 寄存器,内 单 比如:add ax,[0]
add 内 单 ,寄存器 比如:add [0],ax
sub 寄存器,数 比如:sub ax,9
sub 寄存器,寄存器 比如:sub ax,bx
sub 寄存器,内 单 比如:sub ax,[0]
sub 内 单 ,寄存器 比如:sub [0],ax

(1)ESP:栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。
(2)EBP:基址指针寄存器(extended base pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。

JGE JLE JNE JL JG JE指令\INC DEC指令

INC 自增1 increase
DEC 自减1 decrease
JGE 前>=后 Jump if greater or equal
JG 前>后 Jump if greater
JLE 前<=后 Jump if less or equal
JL 前<后 Jump if less
JNE 前不等于后 Jump if not equal
JE 前等于后 Jump if equal

(a)简要注释每条汇编代码;
.file "foo.c" //表示汇编来源的原始文件名 
.text //代码开始 
.globl fact //定义一个全局符号,fact 作为函数名
.type fact,@function //定义符号 fact 的类型为一个 function 
fact: //局部函数 fact 开始
pushl %ebp //将 ebp 寄存器中长字类型的内容压入栈中 
movl %esp, %ebp //将 esp 中的内容传送到 ebp 中 
subl$4, %esp //esp 指针向下移动 4 个字节,给局部变量留出空间
cmpl $0, 8(%ebp) //将 ebp+8 所对应地址中的数与 0 作比较 
jg .L2 //若比较结果大于 0 则跳转至 L2 
movl $1, -4(%ebp) //将立即数 1 存入 ebp-4 所对应的地址 
jmp .L1 //跳转至 L1 
.L2:
subl$12, %esp //esp 指针向下移动 12 个字节 
movl 8(%ebp), %eax //将 ebp+8 对应地址的内容送入 eax 中 
decl%eax //执行减一指令,eax 中存的数值减一
pushl %eax //将 eax 中的内容入栈 
call fact //调用 fact 函数 
addl$16, %esp //让 esp 指向 esp+16 所对应的地址单元 
imull 8(%ebp), %eax //将 ebp+8 对应地址的内容与 eax 中内容相乘并
存入 eax 
movl %eax, -4(%ebp) //将 eax 中的内容送入 ebp-4 对应的地址中
.L1:
movl -4(%ebp), %eax //将 ebp-4 对应地址中的内容送入 eax 中 
leave //关闭栈帧 
ret //恢复断点,返回主程序 
.Lfe1:
.size fact,.Lfe1-fact //fact 函数大小
.ident "GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)"//编译器标识
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
第Ο章 写在前面...................................................................................................................2 第一章汇编语言简介.............................................................................................................3 第二章认识处理器.................................................................................................................4 2.1 寄存器........................................................................................................................4 2.2 使用寄存器................................................................................................................6 第三章操作内存...................................................................................................................12 3.1 实模式......................................................................................................................12 3.2 保护模式..................................................................................................................16 3.3 操作内存..................................................................................................................19 3.4 串操作......................................................................................................................21 3.5 关于保护模式中内存操作的一点说明.................................................................22 3.6 堆栈.........................................................................................................................23 本章小结.........................................................................................................................25 第四章利用子程序与中断...................................................................................................25 4.1 子程序......................................................................................................................25 4.2 中断..........................................................................................................................31 第五章编译优化概述...........................................................................................................34 5.1 循环优化:强度削减和代码外提.........................................................................36 5.2 局部优化:表达式预计算和子表达式提取.........................................................37 5.3 全局寄存器优化.....................................................................................................38 5.4 x86体系结构上的并行最大化和指令封包..........................................................40 5.5 存储优化..................................................................................................................42 第六章 Linux X86汇编程序设计........................................................................................46 6.1编译和链接...............................................................................................................46 6.2基本示例...................................................................................................................46 第七章 X86汇编指令集汇总...............................................................................................47 一.数据传输指令............................................................................................................47 二、算术运算指令.........................................................................................................49 三、逻辑运算指令.........................................................................................................49 四、串指令.....................................................................................................................50 五、程序转移指令.........................................................................................................50 六、伪指令.....................................................................................................................52 七、寄存器.....................................................................................................................52 八、位操作指令,处理器控制指令.............................................................................52 九、FPU instructions......................................................................................................54 第八章 GCC内联汇编基础..................................................................................................54 1. GCC汇编格式...........................................................................................................55 2.内联汇编基本形式......................................................................................................56 3. 扩展形式内联汇编....................................................................................................56 4. 深入constra................................................................................................................59 5.结束语..........................................................................................................................63

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

之墨_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值