现在的位置: 首页 > 综合 > 正文

(4)AT&T汇编笔记

2013年02月11日 ⁄ 综合 ⁄ 共 1466字 ⁄ 字号 评论关闭

19LEA指令:把声明变量的有效内存地址加载到寄存器中。例如:

leal -4(%ebp),%eax

incl(%eax)

就是说把%ebp– 4的值(是一个地址)放进%eax,然后再把%eax中存放的地址中的数增1.

20)关于JMP指令:

短跳转:跳转偏移量小于128字节(是一个8位带符号偏移量)。

远跳转:跳转到另一个段中的指令使用远跳转(跨段跳转)。

近跳转:用于所有其他的跳转。

21)上面提到了跳转指令,短跳转用于是一个8位的带符号的偏移量,意思就是说可以是负数,向前跳转。难道硬件知道正数和负数吗?由此得出汇编和机器码之间的关系。

说到汇编指令,其实是与自己的汇编器紧密相关的。汇编指令与机器码之间不并是一一对应的。比如短跳转的汇编指令,可能是由好几条甚至是数十条的机器码封装的。这就要求汇编器的设计者灵活的封装了。机器码只给了我们最基本的操作元素,汇编指令是汇编器的设计者把这些基本的机器码封装成我们使用的汇编指令。比如上面短跳转指令,汇编器首先简单后面的是不是在有符号8位数值范围内,是,就翻译成一条或者几条的机器码跳转,不是就报错。在这里我们感觉到了用c语言设计汇编器的逻辑了。好,继续跟着走,机器码在cpu执行的时候其实就是数值,用c语言编译器设计汇编器,很容易的就能把机器码表示成为数值。比如机器码:0x11,用c语言直接表示intoperator
= 0x11,
然后把operator放在一个全局的数组之中,或者是一个动态的数组,或者等等全局结构数据中吧,

把汇编程序的文本翻译一个把机器码值在全局数组中放一个,翻译完毕汇编文本代码后,利用一个基于2进制的文件流指针,把这个全局数组写到文件中去,那么这个文件就是一个.bin文件了,只要你的CPU能运行对应的机器码值,那么这个*.bin就能够直接运行了。这是我的一个纯理论的猜想,不对的地方还希望志同道合的人批评指正啊。这是*.bin文件的生成,至于可以在操作系统上运行的可执行程序的生成,就需要在这个全局数组加上各种信息了,如果汇编程序调用了c库的话,还要指定运行时加载动态库程序(在linux中为ld-dynamic-linker
/lib/ld-linux.so.2
),这样就可以了。

       (22)还有一个问题就是在用ld链接链接库的时候,如果是调用的是c静态库的话,问题多多,但是调用c动态库的话,运行的很好。这说明了一个道理,用高级语言写的代码是可以调用低级语言的,但是低级语言的代码要想调用高级语言的库的话,问题就一大堆了,这就是所说的向下兼容。如果非要直接的使用ld去静态链接一个C库的话,使用的命令是:ld hello.o
-Bstatic -L./ -lsum -L/usr/lib/i386-linux-gnu  /usr/lib/i386-linux-gnu/crt1.o /usr/lib/i386-linux-gnu/crti.o /usr/lib/i386-linux-gnu/crtn.o  /usr/lib/gcc/i486-linux-gnu/4.6/crtbeginT.o  --start-group /usr/lib/gcc/i486-linux-gnu/4.6/libgcc.a /usr/lib/gcc/i486-linux-gnu/4.6/libgcc_eh.a
/usr/lib/i386-linux-gnu/libc.a  --end-group  /usr/lib/gcc/i486-linux-gnu/4.6/crtend.o -v  -o hello

抱歉!评论已关闭.