AT&T内联汇编怎么改写成intel格式汇编

MaTaijin 2013-08-26 09:43:06
static av_always_inline int get_cabac_bypass_sign_x86(CABACContext *c, int val)
{
x86_reg tmp;
__asm__ volatile(
"movl %c6(%2), %k1 \n\t"
"movl %c3(%2), %%eax \n\t"
"shl $17, %k1 \n\t"
"add %%eax, %%eax \n\t"
"sub %k1, %%eax \n\t"
"cltd \n\t"
"and %%edx, %k1 \n\t"
"add %k1, %%eax \n\t"
"xor %%edx, %%ecx \n\t"
"sub %%edx, %%ecx \n\t"
"test %%ax, %%ax \n\t"
"jnz 1f \n\t"
"mov %c4(%2), %1 \n\t"
"subl $0xFFFF, %%eax \n\t"
"movzwl (%1), %%edx \n\t"
"bswap %%edx \n\t"
"shrl $15, %%edx \n\t"
"add $2, %1 \n\t"
"addl %%edx, %%eax \n\t"
"mov %1, %c4(%2) \n\t"
"1: \n\t"
"movl %%eax, %c3(%2) \n\t"

: "+c"(val), "=&r"(tmp)
: "r"(c),
"i"(offsetof(CABACContext, low)),
"i"(offsetof(CABACContext, bytestream)),
"i"(offsetof(CABACContext, bytestream_end)),
"i"(offsetof(CABACContext, range))
: "%eax", "%edx", "memory"
);
return val;
}


主要是%c6,%c3,%k1是什么意思
...全文
435 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
这个我没有具体验证,你用gcc编译一下看看对应的情况,实际上%c3这种用法,我以前也没见过,可能是AT&T嵌入汇编的增强。
MaTaijin 2013-08-27
  • 打赏
  • 举报
回复
我查看了一些%c6对应offsetof(CABACContext, range) %c3对应offsetof(CABACContext, low)
MaTaijin 2013-08-27
  • 打赏
  • 举报
回复
我看书上不是是按照%0,%1,%2-------顺序的吗
MaTaijin 2013-08-27
  • 打赏
  • 举报
回复
在请教%c3,%c4,%c6,%k1和立即数的对应关系呢,是在源码中第一个出现的对应"i"(offsetof(CABACContext, low)),offsetof(CABACContext, low))是low在结构体CABACContext中的偏移地址
  • 打赏
  • 举报
回复
引用 楼主 MaTaijin 的回复:
主要是%c6,%c3,%k1是什么意思
就是宏替换的参数,%1、%2、%c3、%c4、%c6、%k1。 :"+c"(val), "=&r"(tmp)这是输出参数,val使用ecx寄存器,tmp也是寄存器变量,但是无指定,由编译器决定。 :"r"(c), "i"(offsetof(CABACContext, low)), "i"(offsetof(CABACContext, bytestream)), "i"(offsetof(CABACContext, bytestream_end)), "i"(offsetof(CABACContext, range)) 这些输入参数类似,c使用寄存器暂存,由编译器决定具体使用情况,后面的i参数都是立即数,编译时确定的,替换源码中的参数。 源码中的: %0 = val = ecx %1 = tmp %2 = c %c3、%c4、%c6、%k1 = 4个立即数
赵4老师 2013-08-26
  • 打赏
  • 举报
回复
gcc编译,IDA pro反汇编即可。
大熊猫侯佩 2013-08-26
  • 打赏
  • 举报
回复
谁让你在VC下编译了,用gcc
MaTaijin 2013-08-26
  • 打赏
  • 举报
回复
在vc下当然不能编译了
大熊猫侯佩 2013-08-26
  • 打赏
  • 举报
回复
你先看看能不能编译
大熊猫侯佩 2013-08-26
  • 打赏
  • 举报
回复
一种办法是看实际生成的机器指令码中k1对应的是什么。

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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