【问题标题】:Inline Assembly - AT&T Syntax - How to move to a variable内联汇编 - AT&T 语法 - 如何移动到变量
【发布时间】:2011-12-05 23:44:23
【问题描述】:

所以我正在研究一个代码洞穴,我基本上用我的跳转替换了对 _memcpy 的调用,然后我想保存源代码中的内容。原组装:

mov     [esp+8], edx    ; size
mov     [esp+4], eax    ; ptr to source
mov     eax, [ebp+arg_4]
mov     [esp], eax      ; ptr to destination
call    _memcpy

我正在努力使用 AT&T 的语法,基本上我想将 [esp+8]、[esp+4] 和 [esp] 存储在我自己的变量中。我正在尝试这样做:

void codecave_jump( void ) __attribute__ ( ( signal, naked ) );
void codecave_jump( void ){

    void *destination, *source;
    size_t size;

    // push all registers onto the stack
    __asm__("pushal\n\t");

    // get size
     __asm__ __volatile__(
            "movl 8(%ecx), %0\n\t" : "=g" (size)
            );

    // get source
    __asm__ __volatile__(
            "movl 4(%ecx), %0\n\t" : "=g" (source)
            );

    // get destination
    __asm__ __volatile__(
            "movl %%eax, %0\n\t" : "=g" (destination)
            );

    // restore all of our registers
    __asm__("popal\n\t");

    // call memcpy
    __asm__("call __memcpy\n\t");

    // do the copy
    memcpy(destination, source, size);
}

我收到以下错误: 错误:%-字母后缺少操作数编号 错误:%-字母后缺少操作数编号

基本上它是在为我大喊大叫: "movl 8(%ecx), %0\n\t" : "=g" (大小)

有谁知道我应该如何在 AT&T 语法中正确执行此操作?我真的很怀念 OS X 上的 Intel 语法:/

【问题讨论】:

  • 立即数使用 $ 而不是 % 像 $0

标签: macos assembly inline-assembly att


【解决方案1】:

由于生成的 AT&T 代码使用百分号作为寄存器名称,因此当存在 size 等操作数时,您必须使用 use double percent signs 作为寄存器名称:

"movl 8(%%ecx), %0\n\t" : "=g" (size)

这类似于您有时需要为printf 使用双百分号。 似乎你对%%eax 的理解更深了,我猜那行编译得很好。


mov mem32, mem32 没有操作码。您首先需要将数据移动到寄存器,然后将其移动到内存位置(就像 Intel 版本对 destination 所做的那样)

// get size
__asm__ __volatile__(
    "movl 8(%ecx), %eax\n\t"
    );
__asm__ __volatile__(
    "movl %%eax, %0\n\t" : "=g" (size)
    );

郑重声明:我还发现 AT&T 语法令人难以置信的混乱。 :)

【讨论】:

  • 我也这么认为:/ 但后来我得到更多错误:/var/folders/b1/rl112vqd3c79nymwj8vnzv180000gn/T//cc1Lrc0i.s:585:mov' /var/folders/b1/rl112vqd3c79nymwj8vnzv180000gn/T//cc1Lrc0i.s:590:too many memory references for mov' 的内存引用过多
  • 是的,mov mem32, mem32 没有操作码,因此您需要使用寄存器进行移动。我为此添加了一条注释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-28
  • 2021-11-25
  • 1970-01-01
  • 1970-01-01
  • 2012-10-28
  • 2021-02-19
相关资源
最近更新 更多