编译原理—x86汇编指令

Posted 之墨_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编译原理—x86汇编指令相关的知识,希望对你有一定的参考价值。

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)"//编译器标识

以上是关于编译原理—x86汇编指令的主要内容,如果未能解决你的问题,请参考以下文章

X86汇编5.高级指令详解

反汇编基本原理与x86指令构造

x86 汇编器:浮点比较

x86汇编语言基础

[架构之路-22]:目标系统 - 系统软件 - 汇编语言结构与X86指令系统以及CPU的工作原理函数调用与堆栈操作

20145316GDB调试汇编堆栈