首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

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

2013-07-01 
att汇编传递参数,不知该怎么写,求助intel下mov eax, [eax + 0x1c]改为att汇编mov 0x1c(%%eax), %%eax其

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

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

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

像下面这样

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

这样编译报错,不知道该怎么写了,求解 汇编 asm
[解决办法]

引用:
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 */



    foo ( 0x2c ); /* .. a[0x2c] = 98 */

    return 0;
}


[解决办法]
这两种汇编格式应该有自动转化的工具

热点排行