【问题标题】:Task: Rewrite X86-assembler program in C任务:用 C 重写 X86 汇编程序
【发布时间】:2018-01-17 18:12:36
【问题描述】:

我在计算机系统考试测试集中遇到了一个问题。

问题/任务是:“用 C 重写以下 X86 汇编程序”

我已经浏览了汇编代码,并评论了我认为我知道的内容:

program:
    movq (%rdi), %rax   # 1st argument copied to return value register
    testq %rax, %rax    # Sets ZF to 1 if value stored in it is 0 (return value == 0)?
    je L1               # Jump to L1 if (ZF == 1)
    addq $8, %rdi        # Value 8 is added to 1st argument
    movq %rax, %rdx     # Retun value register is copied to 3rd argument
L3:
    cmpq %rdx, %rax     # sets SF if (return value - 3rd argument < 0)?
    cmovl %rdx, %rax    # Copy 3rd argument to return value register if (SF = 1)?
    addq $8, %rdi        # Value 8 is added to 1st argument
    movq -8(%rdi), %rdx # ?
    testq %rdx, %rdx    # Sets ZF to 1 if value stored in it is 0 (3rd argument == 0)?
    jne L3              # Jump to L3 if (ZF == 0)?
L1:
    ret                 # Pop's return address off the stack, and sets intruction pointer to it

有一些事情我不确定,如果有人可以为我澄清一下,这可能会很糟糕:

  • testq %rax, %raxtestq %rdx, %rdx 的用途是什么?
  • 代码使用了%rdi (arg1) 和%rdx (arg3),而不是%rsi (arg2) - 这是为了欺骗我们的学生(不使用arg2),或者应该如何解释何时转换为 C?
  • 我们从未将任何内容复制到地址-8(%rdi),但突然我们想将其内容复制到%rdx

我整天都在阅读有关汇编的内容,但我很难完全掌握它。如果我在我的 cmets 中犯了任何错误,请指出。

谢谢。

【问题讨论】:

标签: c assembly x86


【解决方案1】:
  1. test 用于零 (NULL) 检查。
  2. 参数寄存器可用作通用用途。因此,这个函数只需要 1 个参数。 rdx 只是用作局部变量。
  3. 从未将其设置为任何值,但调用者可能已设置。

【讨论】:

  • 嗯,很有趣。根据您的信息,我已尝试将其翻译成以下 C 代码(请参阅答案),但仍不确定。
【解决方案2】:

我已经能够猜测它在 C 中的外观(感谢 Jesters 的回答):

void main(rdi)
{
    long rax = rdi;

    if (rax == 0)
    {
        return;
    }

    rdi += 8;

    long rdx = rdi;

    do 
    {
        if(rdx-rax < 0)
        {
            rax = rdx;

        }

        rdi += 8;
        rdx = unknown_variable //(-8(%rdi))


    } while(rdx != 0 );

    return;

}

我离得远吗?

【讨论】:

  • 您的调用约定中的rax 本身很可能用作返回值,因此您的函数没有返回void,而return 语句错过了rax,这是回来。而且你对第一个rax = rdi; 是错误的,在C 中它更像rax = *rdi;,它是从内存中加载值,而不是从寄存器本身,rdi 用作内存地址(指针)。
  • @Ped7g 这个和你链接的问题正是我需要的,非常感谢。
猜你喜欢
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多