标签:
ISA即为指令集体系结构,它定义了处理器状态、指令的格式,以及每条指令对状态的影响。
PC寄存器:
即程序计数器。指示将要执行的下一条指令在存储器中的地址。
Int accum = 0;
Int sum(int x,int y)
{
Int t = x + y ;
Accum +=t;
Return t;
}
命令行上使用“-S”选项,就能得到C语言编译器产生的汇编代码。在Linux系统中,带“-d”命令行标志的程序OBGDUMP可以充当反汇编器的角色。gcc -S xxx.c -o xxx.s 获得汇编代码,也可以用objdump -d xxx 反汇编,即可查看目标代码文件的内容; 注意函数前两条和后两条汇编代码,所有函数都有,建立函数调用栈帧。
注意: 64位机器上想要得到32代码:gcc -m32 -S xxx.c
MAC OS中没有objdump,
有个基本等价的命令otool
Ubuntu中 gcc
-S code.c (不带-O1) 产生的代码更接近教材中代码(删除"."开头的语句)
4. P108二进制文件可以用od 命令查看,也可以用gdb的x命令查看。
有些输出内容过多,我们可以使用 more或less命令结合管道查看,也可以使用输出重定向来查看
od code.o | more
od code.o > code.txt
5.main.c中有这样的函数:
Int main()
{
Return sum(1,3);
}
用unix> gcc -01 –o prog code.o main.c生成可执行文件prog,再对它反汇编:
Unix>objdump –d prog ,反汇编的结果与code.c反汇编产生的代码几乎完全一样。不同在于左边地址不同,还有有accum的地址。
第六行反汇编最后四个字节反的,为0x804a018
以“.”开头的可以忽略。
6.p110: 了解Linux和Windows的汇编格式区别:ATT格式和Intel格式4个区别。
7.p111: 表中不同数据的汇编代码后缀
见P111表格
8.p112:一个CPU包含一组8个存储32位值的寄存器,这些寄存器用来存储整数数据和指针。esi edi可以用来操纵数组,esp ebp用来操纵栈帧。
%esp和%ebp保存着指向程序栈中重要位置的指针。
对于寄存器,特别是通用寄存器中的eax,ebx,ecx,edx,要理解32位的eax,16位的ax,8位的ah,al都是独立的,我们通过下面例子说明:
假定当前是32位x86机器,eax寄存器的值为0x8226,执行完addw
$0x8266, %ax指令后eax的值是多少?
解析:0x8226+0x826=0x1044c, ax是16位寄存器,出现溢出,最高位的1会丢掉,剩下0x44c,不要以为eax是32位的不会发生溢出.
9.p113表
操作数:指示出执行一个操作中要引用的源数据值,以及放置结果的目标位置。
操作数的三种类型:立即数、寄存器、存储器
结果存放的两种可能:寄存器中、存储器中
有效地址的计算方式 Imm(Eb,Ei,s) = Imm + R[Eb] + R[Ei]*s
10.p114:MOV类由三条指令组成,即movb,movw,movl. MOV相当于C语言的赋值“=”。
注意ATT格式中的方向, 另外注意不能从内存地址直接MOV到另一个内存地址,要用寄存器中转一下。MOV指令中第一个是源操作数,第二个是目的操作数。
MOVS和MOVS指令类都是将一个较小的源数据复制到一个较大的数据位置,高位用符号位扩展(MOVS)或零扩展(MOVZ)进行填充。
栈:栈是一个数据结构,可以添加或删除值,不过要遵循“先进后出”的原则。
通过push操作把数据压入栈中,通过pop操作删除数据。
11.栈帧与push pop。
注意栈顶元素的地址是所有栈中元素地址中最低的。
12.C语言一些指针的示例
Int x = *xp;
*xp = y;
指针就是地址,间接引用指针就是将该指针放在一个寄存器中,然后在存储器引用中使用这个寄存器。
像x这样的局部变量一般是保存在寄存器中。寄存器访问要比存储器访问块
13.p119: 结合表理解一下算术和逻辑运算, 注意目的操作数都是什么类型
特别注意一下减法是谁减去谁
注意移位操作移位量可以是立即数或%cl中的数
p123: 结合C语言理解一下控制部分,也就是分支(if/switch),循环语句(while, for)如何实现的。考验大家举一反三的学习能力。控制中最核心的是跳转语句:有条件跳转p128(实现if,switch,while,for),无条件跳转jmp(实现goto)
p124: 有条件跳转的条件看状态寄存器(教材上叫条件码寄存器)
注意leal不改变条件码寄存器
思考一下:CMP和SUB用在什么地方
p125: SET指令根据t=a-b的结果设置条件码
p127: 跳转与标号
p130/p131: if-else 的汇编结构
p132/p133: do-while
p134/p135: while
p137/p138: for
p144/p145: switch
p149: IA32通过栈来实现过程调用。掌握栈帧结构,注意函数参数的压栈顺序.
p150/p151: call/ret; 函数返回值存在%eax中
p174: bt/frame/up/down :关于栈帧的gdb命令
标签:
原文地址:http://www.cnblogs.com/hzy20/p/4869545.html