} 我们把第一段代码的mov指令语句改为了movb %%ds:%1,%0,加了个段前缀。运行结果依然输出out:a 我们把这三段代码分别gcc xxxx.c -S编译成汇编代码查看会发现,%1这个东西到底是什么根本不能确定,它不像%0所代表的edx一样,%1是随着你代码写法的改变由gcc自动选择合适的寻址方式。所以,第一和第三段代码的差距是ds段前缀,但结果不变,因为gcc自动调整了寻址方式。%1随着这种调整,它的意义也在不断发生变化。有时它是字符a(例一),有时它是字符a的偏移地址(例三),有时候它又是一个指针值(例二)。 引用国外一个网站的一句话:In addition to passing information in registers, gcc can understand references to raw memory. This will expand to some more complex addressing mode within the asm string. 就是这样,不必再纠结%1代表了什么,只需记住,把字符串*s整个传进去,相当于传递了它的第一个字符,%1(或者其他占位符)代表了这个字符。把字符串指针s传进去,%1就是这个指针s的值,不过没人这样干,没有意义。把整型变量var(int var=123;)传进去,那%1就代指这个整数。 可以在GDB里慢慢调试这三段代码。仔细看寄存器数值。 如果我说的不对请指正。Ubuntu 12.04嵌入式交叉编译环境arm-linux-GCC搭建过程图解 http://www.linuxidc.com/Linux/2013-06/85902.htmUbuntu 12.10安装交叉编译器arm-none-linux-gnueabi-GCC http://www.linuxidc.com/Linux/2013-03/82016.htmUbuntu下Vim+GCC+GDB安装及使用 http://www.linuxidc.com/Linux/2013-01/78159.htmUbuntu下两个GCC版本切换 http://www.linuxidc.com/Linux/2012-10/72284.htmGCC 的详细介绍:请点这里 GCC 的下载地址:请点这里本文永久更新链接地址:http://www.linuxidc.com/Linux/2014-11/108831.htm