asm 内嵌汇编的使用


char* str = "Hello World!\n";
void print()
{
asm( "mvol $13, %%edx \n\t"
"mvol $0, %%ecx \n\t"
"mvol $0, %%ebx \n\t"
"mvol $4, %%eax \n\t"
::"r"(str):"edx","ecx","ebx");
}


上面代码那个把字符串地址给到寄存器ecx怎么可以做到,这种::r(str)的这种语法怎么用的(原理是什么),我按书上写的,但是
执行print根本没输出。
...全文
343 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
谢谢大家,找到原因了 "movl $0, %%ecx \n\t" 要改为"movl %0, %%ecx \n\t"
mLee79 2016-11-15
  • 打赏
  • 举报
回复
asm("":::) 啥的 只是 AT&T 格式汇编的规定, 懒得记的时候还是单独写成个汇编文件方便些, 用 nasm/yasm 啥的你就不用为 M$ Win, Linux啥的写两套代码... 第一个:后是输出参数, 比如写 "=a"(result) 就自动在汇编后加上 result = eax 的指令. 第二个:后是输入参数, 编译器会在生成汇编指令时先填上合适的值, a b c d D S 分别代表 (E/R)ax, bx, cx, dx, di,si . 或者用 m v r 啥的指定类型, 在汇编里用 %0 %1 %2 引用.... 比如上面我代码里就指定设置 eax 的值为 4 (__NR__write), ebx = 1 (stdout), ecx = "Hello world!\n", edx = 13(strlen("Hello...")) ... 第三个:后是受影响的寄存器, 内存指示啥的 , 比如 __asm__ ("":::"memory"); 表示一个 memory barrier, 阻止编译器跨越这条代码重排指令, 如果你啥多线程跑出很古怪的结果就可能是少了这个, 如果你汇编里修改了内存的值, 通常应该加上这个...
mLee79 2016-11-15
  • 打赏
  • 举报
回复
你这几句就是 edx = 13, ecx = 0, ebx = 0, eax = "Hello World!" ... 缺了 syscall , 并且看起来参数也不对, 应该是这样子... int main() { __asm__ __volatile__("int $0x80\n\t"::"a"(4),"b"(1),"c"((long)"Hello World!\n"),"d"(13)); return 0; }

69,370

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧