建设银行对账网站,广州万户网站公司,廊坊做网站的电话,wordpress 菜单 页面由于基本内联汇编功能太薄弱了#xff0c;所以才对它进行了扩展以使其功能强大。不过#xff0c;易用性往往与功能强弱是成正比的#xff0c;如您所料#xff0c;扩展内联汇编确实有点难#xff0c;但在求知欲的驱使下#xff0c;就让咱们痛并快乐着吧。
gcc本身是个c编…由于基本内联汇编功能太薄弱了所以才对它进行了扩展以使其功能强大。不过易用性往往与功能强弱是成正比的如您所料扩展内联汇编确实有点难但在求知欲的驱使下就让咱们痛并快乐着吧。
gcc本身是个c编译器要让其支持汇编语言必然牵扯到以下问题
在内联汇编代码插入点之前的c代码其编译后也要被分配寄存器等资源插入的汇编代码也要使用寄存器这是否会造成资源冲突汇编语言如何访问c代码中的变量
您看内联汇编真不是简单地写两句汇编代码就完事了所以很多同学宁可单独写纯汇编文件再链接也不愿意写内联汇编也许您现在还不服一会可就说不准喽^_^。
咱们从头分析假设目前没有扩展内联汇编
当汇编代码嵌入到c代码中如果汇编代码想把c代码中的变量做为操作数加载到寄存器如何找到可用的寄存器这可是个大问题程序员并不知道哪个寄存器已经被分配了哪些寄存器是空闲的。即使知道了寄存器的分配情况也还不够有些底层操作对寄存器的要求是固定的比如in/out指令就得使用al做为数据寄存器万一那个固定的寄存器已经被占用了咱们在使用前还得把它备份。
也许您觉得这些问题不难啊我不管之前用了哪些寄存器我在内联汇编中用哪些寄存器时就先将其入栈备份用完了再恢复呗。听上去不错但由用户来保证数据完整性简直就是灾难人的精力是有限的谁知道会不会漏掉哪个寄存器呢而且在出了问题后也不容易查出来。再说运行中有大量的压栈操作访问内存本身就比较慢不如在编译阶段由编译器优化直接分配给寄存器或用寄存器缓存这样程序运行才更快。所以这类事情还是交给编译器自己做这事才放心。
既然编译器对咱们不放心那么现在的问题变成了如何将c代码中的变量变成汇编代码中的操作数由于编译器无法预测用户的需求这些只得让用户控制故编译器采取的做法是它提供一个模板让用户在模板中提出要求其余工作由它负责实现。这些用户提出的要求就是后面所说的约束。