程序的指令级表示(汇编)

程序的指令级表示(汇编)

预备知识1:

堆栈:先进后出,操作有push(),pop(),peek()

应用:函数调用 树的遍历(所有递归操作) 表达式的计算

预备知识2:

寄存器:CPU中临时存储数据的空间 小 快 贵

32位(0~31)EAX  以前8086是16位(0~15)AH,AL

通用寄存器 AX,BX,CX,DX:进行运算处理等 *函数调用的规则

寄存器ESI和EDI source和destination:copy数据

***EBP:描述了一个栈帧(一个栈内元素),永远指向一个栈帧的开始处 指向当前栈帧

***ESP:整个函数堆栈的栈顶,永远指向一个栈的栈顶

预备知识3:

汇编:GCC编译器(参见《深入理解计算机》)

MOVL $0x3051,%EAX 把0x3051这个值放到EAX寄存器,4个字节

MOVL %EAX,-12(%EBP) 把寄存器EAX的值,存放到EBP指向的地址减去12个字节的地方

LEAL -12(%EBP) %EAX 把%EBP减去12得到的地址,放到EAX寄存器当中

PUSHL %EBP 把寄存器EBP的值压栈

POPL %EBP 把栈顶的值弹出,存放到EBP寄存器中

SUBL %4 %ESP 把ESP寄存器的值减去4

预备知识4:

指针:内存地址 (参见《C与指针》)

指针的指针

类比java的引用

预备知识5:

C语言

(1)内存两种分配方式:

·静态分配:栈 编译器完成(编译时) 栈从上往下生长

·动态分配:堆 编译时无法确定运行时 堆从下往上生长

(2)函数帧

每个函数有个栈帧,栈帧大小不确定,因为要记录函数内部的信息,根据信息多少而定。

举例 函数A调用B,B调用C,C调用D,则栈中A到D地址逐渐减小(虚拟地址就是这样设计栈的)可能溢出

栈在内存中,EBP和ESP在寄存器(CPU中)

*EBP和ESP的工作原理

调用push操作,ESP值自动减4(减去4个字节)

调用pop操作,ESP值自动加4(减去4个字节)

(一定要注意栈从上往下生长,所以一个栈帧的开始处在高地址)

因为EBP和ESP只有一个,所以对他们的push和pop操作更多,用来记住其值。

机器级没有变量名!没有变量名的存储了!

例子:

int demo(){

int x=10;

int y=20;

int sum=add(&x,&y);

printf(“the sum is %d\n”,sum);

return sum;

}

int add(*xp,*yp)

{

int x =*xp;

int y=*yp;

return x+y;

}

转换成汇编语言(Intel中的)(自己应该动手写一下,顺便把栈和指针标出来)

Demo

1           pushl  %ebp

2           movl  %esp  %ebp

3           subl  %24  esp

4           movl  $10  -4(%ebp)

5           movl  $20  -8(%ebp)

6           leal  -8(%ebp)  %eax

7           movl  %eax  4(%esp)

8           leal  -4(%ebp)  %eax

9           movl  %eax  esp

10       call add

11       打印结果

add:

  1. pushl  %ebp
  2. movl  %esp  %ebp
  3. pushl  %ebx
  4. movl  8(%ebp)  %edx
  5. movl  12(%ebp)  %ecx
  6. movl  (%edx)  %ebx
  7. movl  (%ecx)  %eax
  8. add    %ebx  %eax
  9. popl  %ebx
  10. popl  %ebp
  11. ret

Ps:ret是return语句,当add将最后结果算出,add函数帧弹栈以后,暴露出的内存地址里写的是主函数留下的打印指令的地址。

时间: 2024-10-23 17:43:29

程序的指令级表示(汇编)的相关文章

程序的机械级表示学习记录

程序的机械级表示学习记录 X86的三代寻址方式 DOS时代的平坦模式,不区分用户空间和内核空间,很不安全. 8086的分段模式. IA32的带保护模式的平坦模式. 对于机械级编程的两种重要抽象 ISA:机械级程序的格式和行为,定义为指令集体系结构,它定义了处理器状态.指令的格式,以及每条指令对状态的影响. 虚拟地址:机器级程序使用的存储器地址,提供的存储器模型看上去是一个非常大的数组.存储器系统的实际实现是将多个硬件存储器和操作系统软件组合起来的. 在GCC中获得汇编代码与反汇编 获得汇编代码:

深入理解计算机系统之程序的机器级表示部分学习笔记

不论我们是在用C语言还是用JAVA或是其他的语言编程时,我们会被屏蔽了程序的机器级的实现.机器语言不需要被编译,可以直接被CPU执行,其执行速度十分  快.但是机器语言的读写性与移植性较高级语言低.高级语言被编译后便成为了汇编语言,汇编语言十分接近机器语言.之后汇编代码会转化为机器语言.虽然现代  的编译器能帮助我们将高级语言转化为汇编语言,解决了不少问题,但是对于一个严谨的程序员来说,需要做到能够阅读和理解汇编语言.我们主要围绕Intel来讲  解. 一  Intel处理器的历史演变 Inte

第三章 程序的机器级表示

程序的机器级表示 3.1历史观点 8086—〉80286—〉i386—〉i486—〉Pentium—〉PentiumPro—〉Pentium—〉Pentium—〉Pentium4—〉Pentium4e—〉Core 2 Duo —〉Core i7 3.2程序编码 1.gcc -01 –o p p1.c p2.c      使用第一级优化 2.程序计数器(%eip)指示将要执行的下一条指令在存储器中的地址. 3.寄存器文件 4.-S:C语言编译器产生的汇编代码 例:gcc -01 –S code.c

深入理解计算机系统(第二版)----之三:程序的机器级表示

计算机执行机器代码,用字节编码低级的操作,包括处理数据.管理存储器.读写存储设备上的数据,利用网络通信,编译器基于变成语言的原则, 目标机器的指令集合操作系统遵循的原则,经过一系列阶段产生机器代码,gcc c语言编辑器以汇编代码的形式输出,汇编代码是机器代码的文本表示,给出程序的每一条指令.然后gcc调用汇编器和链接器,根据汇编代码生成可执行的机器代码. 本章,近距离观察机器代码和汇编代码. 机器级的实现,被高级语言屏蔽了,用高级语言编写的程序可以在很多不同的机器上编译和执行,而汇编代码则是与特

第三章程序的机器级表示 学习报告

第三章 程序的机器级表示 3.1 历史观点 Intel处理器系列俗称x86,开始时是第一代单芯片.16位微处理器之一. 每个后继处理器的设计都是后向兼容的——较早版本上编译的代码可以在较新的处理器上运行. X86 寻址方式经历三代: 1  DOS时代的平坦模式,不区分用户空间和内核空间,很不安全 2  8086的分段模式 3  IA32的带保护模式的平坦模式 3.2 程序编码 gcc -01 -o p p1.c -01 表示使用第一级优化.优化的级别与编译时间和最终产生代码的形式都有关系,一般认

CSAPP:第三章程序的机器级表示2

CSAPP:程序的机器级表示2 关键点:算术.逻辑操作 算术逻辑操作1.加载有效地址2.一元二元操作3.移位操作 算术逻辑操作 ??如图列出了x86-64的一些整数和逻辑操作,大多数操作分成了指令类(只有leaq没有其他的变种,addb.addw.addl.addq分别是字节加法.字加法.双字加法和四字加法),这些操作通常分为四组:加载有效地址.一元操作.二元操作和移位操作. 1.加载有效地址 leaq S,D;D = &S??加载有效地址指令leag实际上是movq指令的变形,它的指令形式上是

int指令(学习汇编)

int指令 格式:int n n为中断类型码,它的功能是引发中断过程. CPU执行int n指令,相当于引发一个n号中断的中断过程,执行过程如下: 1)取中断类型码n: 2)标志寄存器入栈,IF=0,TF=0: 3)CS.IP入栈 4)(IP)=(n*4),(CS)=(n*4+2) 从此处转去执行n号中断的中断处理程序. 可以在程序中使用int指令调用任何一个中断的中断处理程序. assume cs:code code segment start:    mov ax,0b800h move s

iOS 程序员 6 级考试(答案和解释)

iOS 程序员 6 级考试(答案和解释) 我是前言 1. 下面的代码分别输出什么? @implementation Son : Father- (id)init { self = [super init]; if (self) { NSLog(@"%@", NSStringFromClass([self class])); NSLog(@"%@", NSStringFromClass([super class])); } return self;}@end 答案:都

ios程序员6级考试(答案和解释)

http://blog.sunnyxx.com/2014/03/06/ios_exam_0_key/ 我是前言 上次发了个ios程序员6级考试题 ,还在不断补充中,开个帖子配套写答案和解释. 1. 下面的代码分别输出什么? 1 2 3 4 5 6 7 8 9 10 11 12 @implementation Son : Father - (id)init { self = [super init]; if (self) { NSLog(@"%@", NSStringFromClass(