程序的机器级表示(数据格式,操作数格式)

操作系统centos

生成汇编代码:先写出来代码文件

code.c

    # gcc -c code.c

   #  objdump -d code.o

就显示在屏幕上了。(书上说的行不通,版本差距太大了?还有寄存器名字变了,从ebp变成了rbp)
常用的寄存器有:%eax,%ecx,%edx,%ebx。



C的类型 大小(字节)(8位一字节哦) 汇编代码的后缀
char 1(字节) b
short 2(字) w
int 4(双字) l
long int 4(双字) l
long long int 4 ----
char * 4(双字) l
float 4(单精度) s
double 8(双精度) l
long double 10/12 (扩展精度) t



汇编代码的大多数指令有一个或多个操作数。操作数的类型可以被分为三种类型。

第一种:立即数。是‘$'符号后跟一个常数,如 $0 ,  $-577 ,  $0x1F。立即数应该是32位能表示的数。

第二种:寄存器。就是指令后面跟的%eax,%ecx之类的,它表示这个寄存器的值。

第三种:存储器引用。 这种的表现形式很多,但都是把存储器看成一个大的数组,根据表达式计算出来有效地址,然后找出数组(存储器)中第n个(有效地址)字节处的值。

备注(Ea表示寄存器,R[Ea]表示它的值。M[addr]表示在存储器中由addr处开始的b个字节。复杂的存储器引用也是从这个式子中变化而来的。

程序的机器级表示(数据格式,操作数格式)_第1张图片

最后一个是比较常用的形式。第一个部分lmm,这是一个偏移立即数;两个存储器;一个比例因子。这些值根据图中的方法来求有效值,再存储器引用。

注意:立即数有$,没有的是存储器引用。




你可能感兴趣的:(深入理解计算机读后感)