欢迎来到Doc100.Net免费学习资源知识分享平台!
您的位置:首页 > 程序异常 >

att汇编传递参数,不知该如何写

更新时间: 2014-01-05 03:17:30 责任编辑: Author_N1

 

att汇编传递参数,不知该怎么写,求助
intel下
mov eax, [eax + 0x1c]

改为att汇编
"mov 0x1c(%%eax), %%eax;"

其中0x1c希望通过参数传递

像下面这样

asm (
    "mov %0(%%eax), %%eax;"
    :
    : "m" ( para )
    :
);

这样编译报错,不知道该怎么写了,求解
--参考方法--
引用:
Quote: 引用:


asm (
    "mov 0x1C(%%eax), %%eax;"
    :
    :
    :
);

这段代码是可用的
但是0x1C是变量,需要作为参数传递进去

比如

asm (
    "mov 0x1C, %%eax;"
    :
    :
    :
);

上面代码中,0x1C作为变量,就可以写作以下方式

asm (
    "mov %0, %%eax;"
    :
    : "m" ( para )
    :
);

但是把0x1C作为偏移量,没有找到具体的写法


矮油!你貌似Intel的汇编都不熟悉。你说的偏移量就是0x1c(%%eax)。 给你写一个测试程序:

#include <stdio.h>

int main(int argc, char** argv)
{
char a[100] = {11};
char* b = a;
a[0x1c] = 99;

int p = 0;

__asm__ __volatile__(
"movl %0, %%eax \r\n" /* 将a指针保存到eax寄存器 */
"movl 0x1c(%%eax), %%eax \r\n" /* 取a[0x1c]的值保存到eax,等同于mov eax, [eax + 0x1c] */
"movl %%eax, %1 \r\n" /* 保存eax的值到p中 */
::"m"(b), "m"(p)
);

printf("%d", p); /* 输出 99 */

return 0;
}


gcc下编译运行
--参考方法--
用寄存器, 不使用内存不就完了么, 而且只需要一条指令就够了:


#include <stdio.h>

int foo( char offset )
{
    char a[100] = {0};
    char *b = a;
    a[0x1c] = 99;
    a[0x2c] = 98;

    int p = 0;

    __asm__ __volatile__(
        "movl (%1,%2), %0\n"
        : "=r" (p) : "r" (b), "r" ((int)offset)
    );

    printf( " a[0x%X] = %d\n", offset, p );

    return 0;
}

int main(int argc, char** argv)
{
    foo ( 0x1c ); /* .. a[0x1c] = 99 */
上一篇:上一篇
下一篇:下一篇

 

随机推荐程序问答结果

 

 

如对文章有任何疑问请提交到问题反馈,或者您对内容不满意,请您反馈给我们DOC100.NET论坛发贴求解。
DOC100.NET资源网,机器学习分类整理更新日期::2014-01-05 03:17:30
如需转载,请注明文章出处和来源网址:http://www.doc100.net/bugs/t/20451/
本文WWW.DOC100.NET DOC100.NET版权所有。