C程序代码中内嵌as汇编(二、占位符)
来源:互联网 发布:urp 数据库更改 编辑:程序博客网 时间:2024/05/21 01:46
本篇blog只给几个例题来进行快速学习内嵌as汇编。
第一、输入参数中包含输出参数
#include<stdio.h> int main(void) { char string1[]={"this is yzh test code!"}; int len = 25; char string2[30]= {'\0'}; //asm volatile( asm ( "rep movsb" : :"S"(string1), "D"(string2), "c"(len) ); printf("%s\n",string2); return 0; }例题中的S和D分别表示esi和edi,c为ecx(可以参考上一篇约束代码表),其实这里的内嵌汇编所要表达的是:ds:esi === >> es:edi,利用rep movsb配合ecx循环的把ds:esi位置上的数据搬运到es:edi上;所以edi作为输入参数同时也是输出参数,那么输出位置只需要:就可以了。
第二、利用占位符替代输入输出寄存器
#include<stdio.h> int main(void) { int data1 = 10; int data2 = 20; int result; asm( "imull %1, %2\n\t" "movl %2, %0\n\t" :"=r"(result) :"r"(data1),"r"(data2) ); printf("the answord is :%d\n", result); return 0; }其中%0代表的是与result相对应的寄存器(其中有个约束码为r,表示任何可用的通用寄存器),同理,1%表示的是data1所对应的寄存器,2%表示的是data2所对应的寄存器。在汇编程序中可以直接使用0%来表示result(中间还有个寄存器作为桥梁)。
第三、引用占位符
#include<stdio.h> int main(void) { int data1 = 10; int data2 = 20; int result; asm( "imull %1, %0\n\t" :"=r"(result) :"r"(data1),"0"(data2) ); printf("the answord is :%d\n", result); return 0; }这个例子和上一个“利用占位符替代输入输出寄存器”相似,但是为了节约寄存器,第二个输入寄存器引用了输出寄存器,假设输出寄存器为eax,那么第二个输入寄存器也是使用eax,即是data2 == eax == result。( “0”(data2) == 引用了第一个寄存器("=r"(result)) )
第四、改变过的寄存器列表
#include<stdio.h> int main() {int data1 = 10;int result = 20;asm {"movl %1,%%eax\n\t""addl %%eax,%0":"=r"(result):"r"(data1),"0"(result):"%eax"};printf("The result is %d\n", result);return 0; }内联汇编使用过的寄存器,可能是输入值寄存器,可能是输出值寄存器,要不就一定要罗列在改变过寄存器列表中(比如:上面的eax)。其实改变过的寄存器列表只是为了提醒编译器:某些寄存器已经在内嵌汇编中改变过,后面编译C代码生成的汇编中要小心使用这些寄存器。
转载请注明作者和原文出处,原文地址:http://blog.csdn.net/yuzhihui_no1/article/details/42712297
0 0
- C程序代码中内嵌as汇编(二、占位符)
- C程序代码中内嵌as汇编(一、基础知识)
- C程序代码中内嵌as汇编(三、跳转)
- C程序代码中内嵌as汇编(四、宏函数)
- object-c 占位符
- C占位符
- 计算器程序代码(C语言)
- Spring属性占位符PropertyPlaceholderConfigurer的使用(二)
- Spring属性占位符PropertyPlaceholderConfigurer的使用(二)
- C语言占位符总结
- Objective-C占位符使用
- Objective-C占位符(转载)
- 初学C 占位符类型
- C语言格式占位符
- Keil C调用汇编(二)
- GNU内联汇编之占位符的使用
- 打字测试程序代码(C语言)
- as汇编基础程序设计--调用C库和内存访问
- Handler、Looper、MessageQueue的工作原理
- 用GDB调试程序(一)
- Android Webview 背景透明
- 互联网体系结构的一点认识
- 异常类型:Myeclipse10将web项目打成war包时出现security alert:integrity check error
- C程序代码中内嵌as汇编(二、占位符)
- bat 重命名文件
- WiFi-Audio需要实现的功能简介
- 工作杂谈之:增量更新
- 对象拷贝问题
- UIAlertView的使用,以及自动消失
- 1031.Hello World for U
- 数据库备份操作,早就不用SQLDMO了
- com.itextpdf.text.html.simpleparser.CellWrapper cannot be cast to com.itextpdf.text.Paragraph